前言:之前有人发过:【首发但非原创】支持x64,反一切R3下的常规Hook,完全基于Baby大佬的KiFastSystemCall,本质上,这个是直接调用Wow64SystemService(x86命令)->Wow64Transition(x86命令)->KiFastSystemCall(x64命令)实现API命令的底层调用(这种方法可以被称为一种“天堂之门”,实际上是在调用syscall stub)实际上,这种方法并不是完全的不能Hook,而是对它的Hook成本极高,存在一些操作难度。本程序只是一个小小的测试Demo,但是基本上已经可以实现具体的使用(如果想要了解更多可以参考ScyllaHide的原理)温馨提示:本程序当且仅当在x64系统下有效,x86系统请不要尝试,否则会引起程序错误!本代码编写环境:win11,加上本人汇编能力有限,可能存在一些不兼容的情况,具体可自行测试。正文:在开始谈论我们的Hook之前,我们先来了解了解NtReadVirtualMemory的实际工作原理(注意:下面的讨论全部基于x64系统,R3下NtReadVirtualMemory和ZwReadVirtualMemory的定义完全相同):

这个call跟进去是一行很简单的汇编(本质上,这个就是Wow64SystemService函数,这个将调用信息跳转到wow64cpu.dll,注意,wow64cpu已经不是x32的Dll,是一个x64的Dll):

接着便来到了Wow64Transition(jmp 0033:wow64cpu.dll+6009这个将会跳转到wow64cpu.dll+6009这行命令,0033:这个会将段寄存器CS改为0033,CPU的汇编执行模式也被调整为x64汇编的模式):

接着wow64cpu会对内核调用号进行判断,然后包装参数。最后终于看到真正的x64的ntdll,由它call内核:

我们很容易想到:对于x86程序,我们其实可以通过Hook Wow64Transition来实现一个大Hook。具体Hook代码很简单:

基本Hook处理代码如下:

具体原理可以使用CE查看,可以想想我为什么这样写,也可以自己实现个更好的。Demo测试结果(我好像只Hook了一处,实际上我可能Hook了几乎所以的API,但是这个NtRaiseException命令似乎修复了我们的Hook,这里我没有深入研究,具体可以自己研究):

如果屏蔽掉我们的测试部分代码,程序很快就会因为拦截到过多的消息函数而堆栈崩溃(如何优化请自行思考):

点我下载
(已有 18 次下载)
引用模块
无 |