展开

关键词

在ring0调用Ring3的代码

作者:VXKCVC.GB 时间:2005-02-05 每次上driverdevelop总看到有人问怎么在Ring0下调用Ring3的代码—— Ring3使用Ring0已经是地球人全知道的事情了,但是ring0 下使用ring3的代码 恐怕很少有人知道,Ratter和Benny这两个高人以及Elzc的作者Elzcor各自提出 过一种方法。 总结起来就是三种方法,Zombie在2004年也提出过一个方法看起 来像是Ratter和Elzcor的方法结合而成~ 当然说其本质都是一种思想把ring3代码搞到ring3的空间去执行,听起来 大家也好像有所明白了吧 ,Benny的方法是在Ring0的向Ring3进程插入代码执行, Ratter则是Hook KAPIZ等待用户层调用发生把ring3代码放回Ring3空间,利用 KeUserModeCallBack来执行 今天我来向大家介绍的更像是Ratter和Benny的方法结合,对于Benny的方法, 我不完全采用,我采用的思想仍然是代码放回Ring3空间~ 首先无论如何我们都要有一个进程~ 习习~Windows提供强大的

38010

Ring0和Ring3权限级

Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,从Ring0到Ring3(后面简称R0、R1、R2、R3)。R0层拥有最高的权限,R3层拥有最低的权限。

72110
  • 广告
    关闭

    云产品限时秒杀

    云服务器1核2G首年38元,还有多款热门云产品满足您的上云需求

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Ring0和Ring3 HOOK 大检查

    4.IAT HOOK (ring3 用)IAT是可执行文件的导入表,记录可执行文件使用的其它DLL中的函数,通过替换IAT表中的函数地址,可以hook相应DLL中的函数调用。 5、Inline Hook方法 (ring 0和ring3 都可以用) Inline hook的工作流程: 1)验证内核API的版本(特征码匹配)。 2)撰写自己的函数,要完成以上三项任务。

    61820

    KeUserModeCallback用法详解(Ring0调用Ring3代码)

    OpenProcess(返回后) 这是一个ring3->ring0->ring3的过程。 而KeUserModeCallback的过程是这样的 nt!KeUserModeCallback -> nt! KeUserModeCallback(调用后) 这是一个ring0->ring3->ring0的过程,在堆栈准备完毕后,借用KiServiceExit的力量回到了ring3,它的着陆点是KiUserCallbackDispatcher 需要注意的地方是: (1) ring3的指令只能访问ring3的内存地址,所以如果需要访问数据,必须放在ring3可以访问到的内存中。 Alloced Buffer=0x00370000 申请到的内存地址 然后把我们在ring3要执行的代码和数据放到申请的buffer里. 继续执行 现在回到ring3了,ring3下还是习惯用OD,在KiUserCallbackDispatcher处下断(注意使用条件断点,否则无数飞向user32的调用将会把你淹没)。

    76710

    2020-3-1-什么是ring0-ring3

    Protection - Many But Finite----本文会经常更新,请阅读原文: https:xinyuehtx.github.iopost%E4%BB%80%E4%B9%88%E6%98%AFring0-ring3

    31240

    Ring3挂起进程,跟恢复进程.

    目录Ring3挂起进程,跟恢复进程.一丶简介二丶代码Ring3挂起进程,跟恢复进程.一丶简介有时候我们做对抗的时候可能会遇到.一个进程常常操作我们.但是我们 可以通过挂起进程来挂起它让它无法操作.当然方法很多

    32930

    Ring0 注入 Ring3 的一种新方法

    * http:hi.baidu.comnmn714** 时间: 20091229** 模块: InjectRing3.c ** 平台: Windows XP SP2* * 描述:* Ring0 注入 Ring3 * 挂起ring3线程后,修改其TrapFrame里的eip,再恢复其执行。 (*FuncType)(PETHREAD Thread); FuncType KeSuspendThread = NULL;FuncType KeResumeThread = NULL; 被注入到ring3

    67010

    ring3 x32挂起进程注入原理.

    挂起进程其实就是在创建进程的时候不让其先执行.然后获取它的EIP 将它的EIP变成我们ShellCode所在的内存.进行执行.不难.

    31640

    ring3层恶意代码实例汇总

    本文作者:x-encounter之前一期我们学习了 IAT 的基本结构,相信大家对 C++ 有了一个基本的认识,这一期放点干货,我把 ring3 层恶意代码常用的编程技术给大家整理了一下,所有代码都经过我亲手调试并打上了非常详细的注释供大家学习 我会在其中挑出几个,采用反汇编的方式,给大家展示恶意代码的执行流程以及原理,由于 ring3 层的技术过于古老,希望大家秉着学习和巩固的心态来看待该文章。 在 ring3 层我们只需要了解其原理即可。InLineHook 与普通 Hook 的区别:InLineHook 是直接在以前的函数替里面修改指令,用一个跳转或者其他指令来达到挂钩的目的。

    38000

    64位内核开发第十二讲,进程监视,ring3跟ring0事件同步.

    同步使用Event如果ring0跟ring3通讯.就要使用我们上面说的 ring0 -> ring3通讯的命名函数了.IoCreateNotificationEvent 在使用Ring0 -> ring3 (上面说的设备扩展数据) }ring3等待ring0的事件就很简单了. 跟 ring 0进行通讯4.创建控制派遣函数.接受ring3下发的控制吗.5.使用IoCreateNotificationEvent创建事件对象.用于Ring3跟Ring0的事件同步.6.注册进程控制回调函数 赋值参数.并且设置事件对象8.ring3读取数据的时候.控制函数将回调函数中赋值出来的数据拷贝给 ring3即可.9.ring3进行打开事件.等待事件.发送DeviceIoControl控制吗.读取数据 这样Ring3就会等待到事件了.

    40020

    逆向对抗技术之ring3解除文件句柄,删除文件

    这些问题主要是工作中会遇到.包括后面的逆向对抗技术.有的可能只会提供思路.并且做相应的解决与对抗.

    49410

    应用程序与驱动程序通信 DeviceIoControl

    得到Ring3的输入缓冲区地址(其中pIrpStack是IoGetCurrentIrpStackLocation(pIrp)的返回);通过pIrp-> UserBuffer得到Ring3的输出缓冲区地址 = NULL&&OutputDataLength >= strlen(Ring0->Ring3) + 1) { memcpy(OutputData, Ring0->Ring3, strlen(Ring0 ->Ring3) + 1); Status = STATUS_SUCCESS; Informaiton = strlen(Ring0->Ring3) + 1; } else { Status = STATUS_INSUFFICIENT_RESOURCES ;   内存不够 Informaiton = 0; } break; } default: break; } Irp->IoStatus.Status = Status;             Ring3 ->Ring0, strlen(Ring3->Ring0)+1, (LPVOID)BufferData, 0, &ReturnLength, NULL); if (IsOk == FALSE) { int

    58020

    应用程序与驱动程序通信 DeviceIoControl

    得到Ring3的输入缓冲区地址(其中pIrpStack是IoGetCurrentIrpStackLocation(pIrp)的返回);通过pIrp-> UserBuffer得到Ring3的输出缓冲区地址 = NULL&&OutputDataLength >= strlen ( Ring0->Ring3 ) + 1) { memcpy (OutputData, Ring0->Ring3 , strlen ( Ring0->Ring3 ) + 1); Status = STATUS_SUCCESS; Informaiton = strlen ( Ring0->Ring3 ) + 1; } else { Status ->Ring0 , strlen ( Ring3->Ring0 )+1, ( LPVOID )BufferData, 0, &ReturnLength, NULL); if (IsOk == FALSE ->Ring0 , strlen ( Ring3->Ring0 ) + 1, ( LPVOID )BufferData, MAX_PATH, &ReturnLength, NULL); if (IsOk

    67331

    保护模式-第4讲-段-段跨越段权限

    我们很多时候都听别人说 ring3 ring0 其实就是 CPU的等级划分.不同的级别可以执行不同的 特权指令. 一共四个等级. ring3 - ring 0 而操作系统只使用了 ring3 与 ring0 所以 ring3就是应用程序. ring0 就是内核程序. CPU是有4个等级的. ring3 ring 2 ring 1 ring0 操作系统使用了两个. 也就是微软使用了两个. 所以不要搞混. 我们要知道 特权级别是CPU提供. 也就是说 表示你是 运行在ring3的权限. 还是 ring0的权限. RPL bit 0 bit1 ? RPL是段选择子的特权级别. CPU执行这条指令的时候.为什么要去查.难道不该限制吗.不管是ring3 还是 ring0都可以查表吗. 不是这样的. RPL就是一个限制. 表示你想请求的特权级别.

    28320

    64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING

    如果是读写的方式.则都会成功.3.METHOD_NEITHER 其它方式使用其它方式.则我们Ring3发送过来的数据 会在IRP堆栈中 我们获取Ring3的数据PIRPSTACK_LOCATIO pIrpStack 必须保证ring3进程跟内核进程处于同一运行状态中. 对此我们对其内存必须进行检查. 有两个API函数ProbeForRead(); 检查内存是否可读ProbeForWrite(); 检查内存是否可写.三丶Ring3跟Ring0开发区别1.什么是Ring3 什么是Ring0CPU提供了4 判断来自Ring0还是Ring3,拦截ring3.过滤ring0 Io开头的 属于Io管理器的 函数 函数说明 IoCreateDevice 创建设备对象 IoCreateSymbolicLink 创建符号链接 跟ring3 GetProcAddress相似.一个ring3一个ring0 MmIsAddressValid 判断函数地址是否无效. Ob开头 与内核对象相关的.

    1.2K20

    也谈Intel的cpu虚拟化

    3.CPU运行级别: CPU支持ring0~ring3 4个等级,但是Linux只使用了其中的两个ring0,ring3。 而当CPU处于ring3级别的时候,表示此时CPU正在运行的是用户级别的代码。当发生系统调用或者进程切换的时候,CPU会从ring3级别转到ring0级别。 ring3级别是不允许执行硬件操作的,所有硬件操作都需要内核提供的系统调用来完成。 4.VMX: 为了从CPU层面支持VT技术,Intel-V 在 ring0~ring3 的基础上, 扩展了传统的x86处理器架构,引入了VMX模式,VMX分为root和non-root。 Guest也分ring0~ring3,不过他并不感知自己处于VMX non-root模式下。?VMM与Guest的切换 1.

    1.2K61

    保护模式-第五讲-门-调用门

    堆栈不是ring3的堆栈了. 也就是 调用call 之前的esp 是ring3的堆栈 .而在保存调用者的ss esp cs的时候堆栈已经切换到 ring0的了.1.1.4 总结1.跨段调用的时候. RPL = 0 如果不想提权 就寻找ring3的可访问的代码段. 如何指定地址.需要我们在ring3中写代码.然后将函数地址填入到里面.比如你ring3的函数地址为 0x00401230 那么构造到门描述符中就是0x0040EC00 ~ 0X00081230 此时将调用们写入到 使用其中比如0x401230 是我们在ring3看的. 可以在内核调试其中看到 我们ring3的代码. int 3 与 retf这里就说明了我们ring3中调用的函数 是具有内核权限的了.因为我们是提权了.

    44810

    mov fs:,esp的含义

    stosd指令,取得是双字节,mov ,eax;edi=edi+4;代码运行在RING0(系统地址空间)和RING3(用户地址空间)时,FS段寄存器分别指向GDT(全局描述符表)中不同段:在RING3RING3下的FS当代码运行在Ring3下时,FS值为指向的段是GDT中的0x38段(RPL为3)。该段的长度为4K,基地址为当前线程的线程环境块(TEB),所以该段也被称为“TEB段”。

    81760

    64内核开发第11讲.多线程开发.以及同步.

    而多线程就会出现数字不一样的情况.如下: ring3代码演示. 比如我们上面的Ring3的例子就是互斥的. 每个线程必须互斥的访问. 跟ring3的CreateThread类似. 在Ring3我们可以通过WaitForsingObject来等待.在内核中可以使用 KeWaitForSingleObject()来等待.但是注意,keWaitForSingleObject只是等待一个 而不是跟ring3一样给个秒数就行. 0不等待. NULL 无线等待.等待多个对象则使用 ** KeWaitForMutiipleObject**

    28320

    linux内核态和用户态小结

    内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然联系,intel cpu提供Ring0-Ring3三种级别运行模式,Ring0级别最高,Ring3级别最低。 Linux使用了Ring3级别运行用户态。Ring0作为内核态,没有使用Ring1和Ring2。Ring3不能访问Ring0的地址空间,包括代码和数量。 网络数据发送等操作,必须通过write,send等系统调用,这些系统会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换Ring3

    85020

    相关产品

    • 人工智能

      人工智能

      提供全球领先的人脸识别、文字识别、图像识别、语音技术、NLP、人工智能服务平台等多项人工智能技术。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注云+社区

      领取腾讯云代金券