在ring0调用Ring3的代码

VB6实现Ring3下直接调用Ring0层函数,反一切R3API Hook。 接论坛帖子:http://topic.csdn.net/u/20120518/18/9a00ec5c-b3d1-4a1f-9bc1-ba1a47b52463.html 例子应用如下。我只是给一个方法给大家,这个方法肯定很麻烦,有需求的人可以用。 添加Module1 Private asm_CallCode() As Byte, KiFastSystemCall&, KiIntSyst 阅读详情

作者:VXK/CVC.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来执行,Elzcor则是自己建立一个进程把代码内存感染到
进程执行。Zombie取两家之长搞的~。
今天我来向大家介绍的更像是Ratter和Benny的方法结合,对于Benny的方法,
我不完全采用,我采用的思想仍然是代码放回Ring3空间~
首先无论如何我们都要有一个进程~
习习~Windows提供强大的kernel函数帮我们虐待用户~
PsSetCreateProcessNotifyRoutine摄定好NotifyRoutine在创建进程时我们就
可以yy进程了~
通过DDK文档MSDN的大叔的帮助,这个函数
PsSetCreateProcessNotifyRoutine有两个参数
返回值是NTSTATUS型,第一个参数是回调函数NotifyRoutine,第二个参数是Bool型的
如果第二个参数为False表示设定NotifyRoutine,为True就是取消~
NotifyRoutine的形式如下
NotifyRoutine proc dwParentId:DWORD, dwProcessId:DWORD, bCreate:BOOL
这样我们就可以获得一个进程了~~xixi~~
我们的NotifyRoutine只处理dwProcessId和dwProcessId,对bCreate不用理,通过使用ps
函数PsLookupProcessByProcessId得到PEPROCESS结构(得不到结构的不处理),再取进程Name
如果是Explore且插入标识无就开始我们的插入~(选Explore的原因我就不用说了吧?)
插入时我采用Ratter的方法,于是乎就要用KeAttachProcess,Attach到进程然后开始
工作~~呵呵~~
插完了就用回调CallBackUserMode~~然后DetachProcess...
KeUserModeCallBack的参数
NTSTATUS KeUserModeCallback (
IN ULONG ApiNumber,
IN PVOID InputBuffer,
IN ULONG InputLength,
OUT PVOID *OutputBuffer,
IN PULONG OutputLength
)
可能看不出来怎么使它返回UserMode执行任意代码,但是如果你看看win2ksrc/private/ntos/ke/i386/
下的callback.c和callout.asm就会发现世界真奇妙~~~居然KiCallUserMode回调的是~~~~~xixi~~~~
我不说了,大家应该自己研究一下吧~
另外我提一下参数传递的问题,这里使用KeUserModeCallBack必须要用有效的InputBuffer和OutputBuffer
当KeUserModeCallBack发生时,调用我们的Ring3代码参数传入的方式好像是PUSH进来的
KiCallUserMode中回调USER的时KiServiceExit回自动的飞向我们的代码~
类似发生下面的事情~
(
;这些代码并非真的在KiCallUserMode里存在~
;只是我个人的猜测,因为softice跟到最后到处是[ebx+xxx],[esi+xxx]这样的东西~
;实在难说~做后使用jmp _KiServiceExit返回ring3的代码更是头大~
;不过分析的说可能是栈传入参数~
;如果看ntos/ke/i386/下的分析,估计会更头大~它的栈传递和stack变换等等搞的很晕~~
;不过可以肯定的说,就是已经到了ring3了,我们自己做个检测不就行了?
;hehe~具体到底是怎么传递的呢?大家做个检测吧,我不说了~
;正确的函数传递方式:Kernel是怎么运行我们的函数的~
push Outlength
push lpOutBuffer
push Inlength
push lpInBuffer
push API_NUMBER
call KeUserCallBackDispatch
KeUserCallBackDispatch:
add esp,4
pop edx ;edx=Api_Number
mov eax,fs:[PcTeb]
mov eax,[eax].TebPeb
mov eax,[eax].PebKernelCallbackTable
call [eax+edx*4] ;Real Call To [EAX+EDX*4],hehe~~
;我们计算的api_number被还原了~~~xixi~~~下面的代码里有那个计算~~呵呵~~

)

虽然是这样的,但是我还是劝各位不要用KeUserModeCallBack来传递参数给我们的Ring3代码,要传递也应
该使用其它方法——比如Ratter把参数Copy到Ring3代码后面,然后再代码里重定位到地方取参数~
返回参数EAX是KeUserModeCallBack的,因而要想要返回参数就要传递outsize为strlen(lpoutbuf)就行了~~
如果非要传递,应该小心一些~因为可能蓝屏~我也不知道为什么~呵呵~

我还有一种方法就是覆盖KeUserCallbackDispatcher为我们Ring3代码的地址----大多数情况下会蓝,然后
用KeUserModeCallBack执行,这样我们就可以通过一个常见systemcall_number来执行我们代码,另外通过分析ntos/ps/psinit.c
我发现KeUserCallbackDispathcer就是NTDLL里的KiUserCallbackDispatcher~~~习习~~~
那样避免蓝屏要用在进程空间改写KiUserCallBackDispatch和插入代码~
内核空间改写的话,要指向内核地址,ring3代码要插入内核的NTDLL空间中~
记得不论在哪里改写都要最后调用原函数~~~!!!!!!!!!~~~~
......(这种方法是我最z发现的阿阿----其实是听erx大哥讲的一个思路~)
再多说就成了教唆犯罪了~

在ring0调用Ring3的代码的续
 
  利用建立新的APC方法回调代码——原创者不详~
  这种方法一般应用用户层和内核驱动之间有交互——KeUserModeCallBack的是插入回调,
  Infect是感染进程~
  但是建立新APC的方法更温柔一些,呵呵~~
所用到的函数是两个undoc的函数,具体的原始形态实在是简单——感谢Open Source Windows~~~

VOID
KeInitializeApc (
   IN PRKAPC Apc,//我们要自己初始化这个OurApc=ExAllocatePool(NonPagedPool, sizeof(struct _KAPC));
   IN PRKTHREAD Thread,//目标线程——用户层交互的话,直接KeGetCurrentThread()好了
   IN KAPC_ENVIRONMENT Environment,//应该添0,就是CurrentApcEnvironment
   IN PKKERNEL_ROUTINE KernelRoutine,//我们的APC处理函数MyApcRoutine,在APC_LEVEL上运行,很恐怖的高级,kernel mode apc!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   IN PKRUNDOWN_ROUTINE RundownRoutine OPTIONAL,//添NULL,
   IN PKNORMAL_ROUTINE NormalRoutine OPTIONAL,//添入我们的ring3层的Ring3App代码线性地址,其实是user modeAPC处理Routine,~~~privalige非常吓人~~~
   IN KPROCESSOR_MODE ApcMode OPTIONAL,//1,使用NormRoutine
   IN PVOID NormalContext OPTIONAL//第一个参数~~~我们ring3层代码的,习习
   )

完成APC初始化后,我们要插入我们的APC
BOOLEAN
KeInsertQueueApc (
   IN PRKAPC Apc,//OurApc
   IN PVOID SystemArgument1,//Ring3App的第二个参数arg2
   IN PVOID SystemArgument2,//Ring3App的第三个参数arg3
   IN KPRIORITY Increment//0
   )

Ring3层代码的样子::    
void Ring3App(ulong arg1,ulong arg2,ulong arg3);

我们在kernel modeAPC
//我们也可以在这做点什么,不过APC_LEVEL这个高级别东西,我们最好还是不要做什么大动作~
void MyApcRoutine(struct _KAPC *Apc,//Apc结构不说了吧?
              PKNORMAL_ROUTINE norm_routine,//我们的Ring3App地址
              void *context,//arg1
              void *SysArg1,//arg2
              void *SysArg2)//arg3
{
   ExFreePool(Apc);
   return;
}


整体的思想的代码:
//in kernel mode
PKAPC OurApc;
void SendApc(ulong addr,ulong arg1,ulong arg2,ulong arg3)
{
     PKTHREAD thread=KeGetCurrentThread();
    OurApc=ExAllocatePool(NonPagedPool, sizeof(struct _KAPC));

   KeInitializeApc(OurApc, thread, 0,
      (PKKERNEL_ROUTINE)&MyApcRoutine, 0,
   (PKNORMAL_ROUTINE)addr, 1, (PVOID)arg1);
   KeInsertQueueApc(OurApc, (PVOID)arg2, (PVOID)arg3, 0);
   *((unsigned char *)thread+0x4a)=1;//这句代码强制线程发生APC调用~
   //kthread+0x4a的地方是KTHREAD->ApcState(kthread+0x34)->UserApcPending(ApcState+0x16)~~~
   //xixi~~~
   return ;
}
//in user mode
void Ring3App(ulong arg1,ulong arg2,ulong arg3)
{
....
}
   
void SendQp(..)
{
 ....
 SendBuf = BuildUpIrp(IRP_XXX_YYYY);
 SendBuf->BackAddr=(ULONG)Ring3App;
 ....
 ReturnBuf = SendIrp(hDevice,SendBuf,sizeof(SendBuf));
 ....
 ....

ring0下使用内核重载绕过杀软hook 内核重载听起来是一个很高大上的概念,但其实跟PE的知识息息相关,那么为什么会有内核重载的出现呢? 我们知道从ring3进入ring0需要通过int2e/sysenter(syscall)进入ring0,而进入ring0之后又会通过KiFastCallEntry/KiSystemService去找SSDT表对应响应的内核函数,那么杀软会在这两个地方进行重点盯防。 首先是对int2e/sysenter的盯防,我们知道大多数函数都是通过一系列的调用链,最终找到ntdll.dll里面的函数,找到调用号后通过int 阅读详情

相关推荐

红蓝对抗----Ring3Ring0系统调用过程上(Ring3篇)

这篇文章我们将研究CreateFile是如何从Ring3Ring0,其中经过了哪些模块,而这些模块又是通过什么技术关联起来的。通过这一篇文章的学习,我们可以更好的了解操作系统内部的调用原理,更能帮助我们深入理解操作系统的各组件的相互调用关系。 为什么学? 如果你想在操作系统上达成以下事情,那么学习这篇文章就是你最好的选择。或者你有下列想法,那么通过举一反三,也是可以做到的。 1.做Hook。Hook可以做的事情非常多,账密拦截,HTTPS拦截。 2.研究和挖掘系统级别漏洞。 3.Rootkit研究

SHELLCODE_8BIT的博客 1365

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

一丶同步与互斥详解,以及实现一个进程监视软件. 1.用于线程同步的 KEVENT 事件很简单分别分为 事件状态. 以及事件类别. 事件状态: 有信号 Signaled 无信号 Non-signaled 事件类别 自动恢复 Synchronization 自动设置 不自动恢复. Notification 手动设置 事件的创建函数 ** IoCreateNotificationEvent() ** *...

weixin_30315435的博客 419

ring0驱动调用ring3应用程序 从RING0级下启动RING3级的应用程序源代码

RING0级下启动RING3级的应用程序源代码 ring0驱动调用ring3应用程序.zip

ring0 APC插dll

ring0 APC插dll...........虽然来自代码流氓...XX原因不在空间发....不过Sudami牛发了...俺就把代码帖上来吧...呵呵........不许做坏事哦....高手飘过      ----by sysnap           #include #define MAX_PID 65535 /////////////////////////////////

blackbean的专栏 625

转一个win32k回调实现自定义r3函数的方法 教主威武

<br />ring0调用ring3早已不是什么新鲜事,除了APC,我们知道还有KeUserModeCallback.其原型如下:<br />NTSTATUS<br />KeUserModeCallback (<br />     IN ULONG ApiNumber,<br />     IN PVOID InputBuffer,<br />     IN ULONG InputLength,<br />     OUT PVOID *OutputBuffer,<br />     IN PULONG O

Sunny_wwc的专栏 2871

Ring0Ring3

Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3Windows只使用RING0RING3RING0只给操作系统用,RING3谁都能用。 如果普通应用程序企图执行RING0指令,则Windows会显示“非法指令”错误信息。因为有CPU的特权级别作保护。 ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之…… 以Li...

weixin_43742894的博客 3176

ring0调用Ring3代码

ring0调用Ring3代码    作者:VXK/CVC.GB时间:2005-02-05 每次上driverdevelop总看到有人问怎么在Ring0调用Ring3代码——Ring3使用Ring0已经是地球人全知道的事情了,但是ring0下使用ring3代码恐怕很少有人知道,Ratter和Benny这两个高人以及Elzc的作者Elzcor各自提出过一种方法。总结起来就是三种方法,Zomb

1466

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

ring0调用ring3早已不是什么新鲜事,除了APC,我们知道还有KeUserModeCallback.其原型如下: 代码: NTSTATUS KeUserModeCallback (      IN ULONG ApiNumber,      IN PVOID InputBuffer,      IN ULONG InputLength,      OUT PVOID *OutputB

zacklin的专栏 4267

调用门使代码段从ring3调用ring0再回到ring3的过程

GDT和LDT分别为全局描述表和局部描述表,其中表中每一项又叫做段描述符。段描述符,由段地址,以及段类型,特权级DPL等组成,其中段类型说明此段是代码段还是数据段,还是各种门,还是TSS等。通过GDT访问某个段的时候需要使用段选择符来进行调用。普通调用下,是根据是否是一致代码段进行同级权限代码段之间的调用,或者是低权限向高权限代码调用,但是CPL不会改变。如果想要从低权限向高权限调用,并且可以改...

weixin_30470857的博客 204

RING3RING0

当我在说跳转时,说的什么? CPU有很多指令,不是所有的指令都能够随时用,比如 ltr指令就不是随便什么时候能用,在保护模式下,如果你不安规则来执行指令,CPU就会抛出异常,比如你在INTEL手册上就能看到如下文本 意思据是说,如果你当前的CPL不是RING0,那么就会抛出GP(0)异常! 所以要正确使用这个指令,你就需要将CPL跳转到RING0来。这就是跳转! RING3到RI...

weixin_30632089的博客 182

[收藏] Ring0 Call Ring3

pjf(jfpan20000@sina.com)很久没写什么东西,一来文笔太烂,二来我不是一般的懒。这个东西一看题目也就知道又是一篇无聊的帖子,凑凑数先。因为最近决定把读本科时的古董机上的东西收拾一下,看到一些最初学习时的老代码,回忆往日的时光,还颇有一些感慨呢...以后有空就选一些贴贴,也不怕人笑了。今天第一帖,代码原是大二时为NT4系统写的,是原先实践x86体系写的,作用是在Driver中“调

Purpleendurer@CSDN 3460

【转】ring3 CPU指令级别--操作内核的一些系统级别工具

RING3   什么是RING3?这得从CPU指令系统(用于控制CPU完成各种功能的命令)的特权级别说起。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了。所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程

autumn20080101的专栏 2010

[转载]用汇编写个最小的WDM驱动程序进RING0

[function doZoom(size){ document.getElementById(zoom).style.fontSize=size+px} 字体:大 中 小] 2004年6月12日15:09星期六 原著:wowocockhttp://www.luocong.com/bbs/dispbbs.asp?boardid=2&id=3176用汇编写个最小的WDM驱动程序进R

jarodlau的专栏 1596

Ring0 Call Ring3

pjf(jfpan20000@sina.com)很久没写什么东西,一来文笔太烂,二来我不是一般的懒。这个东西一看题目也就知道又是一篇无聊的帖子,凑凑数先。因为最近决定把读本科时的古董机上的东西收拾一下,看到一些最初学习时的老代码,回忆往日的时光,还颇有一些感慨呢...以后有空就选一些贴贴,也不怕人笑了。今天第一帖,代码原是大二时为NT4系统写的,是原先实践x86体系写的,作用是在Driver中“调

2499

什么是ring0-ring3

大家可能听说过某个代码需要运行在ring 0的说法。但是ring 0究竟是什么,今天就给大家介绍下。 权限控制 我们都知道计算机中运行着许多的软件,有些软件是和硬件打交道的,比如驱动软件,操作系统软件,有些软件只是运行在操作系统之上的,比如浏览器,文本编辑软件等。 为什么要这样设计? 这是为了控制运行软件的权限,让一些特定的软件才能执行某些“危险”的行为,比如读写特定的内存等。 这里就引申出了我...

黄腾霄的博客 6790

CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3是什么呢?

百度百科:ring0以及其他 ring:包围; 环绕; 通俗讲就是一圈一圈的,离得近的标号为:0。其次为,1。以此类推。 Windows 的内存可以被分为两个层面:物理内存和虚拟内存。 其中,物理内存比较复杂,需要进入 Windows 内核级别 ring0 才能看到。 通常,在用户模式下,我们用调试器看到的内存地址都是虚拟内存。 与此无关的一个图: ...

HWP 5944

全虚拟化和半虚拟化的区别 cpu的ring0 ring1又是什么概念? - 转

ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之…… 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断、修改页表、访问设备等等。 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别...

weixin_30528371的博客 666

CPU 的 ring0ring1,ring2,ring3

   Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3Windows只使用其中的两个级别RING0RING3RING0只给操作系统用,RING3谁都能用。如果普通应用程序企图执行RING0指令,则Windows会显示“非法指令”错误信息。   ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之……  拿Linux+x...

tian5753的博客 2万+
上一篇: Process Initiation
下一篇: 终止进程的内幕
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值