[原创]X64系统中WIN32程序应用层拦截驱动层交互的通杀方案
X64系统中WIN32程序应用层拦截驱动层交互的通杀方案(WIN7x64测试通过)
在X64的时代,为了兼容WIN32程序的运行,使用了特殊的处理机制,https://bbs.pediy.com/thread-225175.htm这个帖子做了详细介绍,各位看官可以先脑补一下。
今天要讨论的问题是在一个应用的内部利用应用层(R3)HOOK来拦截驱动层(R0)调用的通杀方案,他能实现的效果是:
1、一个HOOK通杀所有。
2、R3层拦截驱动调用,可以篡改传递的参数。
3、可以修改驱动调用后的返回信息。
4、可以自己构造驱动返回信息而不调用驱动直接返回。
下面我们来看看是如何做到的:
Win32时代的 KiFastSystemCall大家应该不陌生,他是R3通过R0的一条道路,但在X64系统上WIN32程序中已经看不到他的影子,我们来看看变成什么样子了,如下图

我们会看到,首先是EAX,这个我理解成函数编号,ECX,我也理解成小编号,关键是call dword ptr fs:[C0],我们CTRL+G进入这个地址看看:
这里就是我们今天要讲的主角了,这句代码联通了R3与R0,这个内存空间实际是wow64cpu.dll,在OD内看不到名字,我们只要在这里进行HOOK后,就可以实现我上面说的功能了,HOOK的方法就各显神通了,下面我重点讲讲HOOK后的处理代码,跟我往下走:
这里我给了二张图,其实是一张,截不开而已,里面做了详尽的注释(这是我2016年写的代码,为了写教程又重新调试了一翻,加了注释方便大家能看明白)


这个代码里,涵盖了我上面说的3种方式,各位看官结合我的注释去理解吧,我重点讲一点,就是如何拦截驱动调用后的返回值,这里,我借助了全局变量,首先把原返回地址写入全局变量保存好,然后将驱动返回后处理的代码(上图没有贴这部分代码,自己脑补)地址写入dword ptr ss:[esp],这样当驱动执行完后会返回到[esp]这个地址里,也就返回到了我们要处理的代码中,那就是由你决定要干些什么了。
上述代码实现了:
1、处理了通过ZwDeviceIoContrlFile查询MAC的返回值,实现了MAC地址的随机。
2、处理了通过ZwDeviceIoContrlFile 查询硬盘序列号的返回值 ,实现了硬盘序列号的随机。
3、处理了通过ZwCreateSection创建共享内存实现限制多开的输入参数,将共享内存名实现随机化。
4、处理了通过ZwQuerySystemInformation查询信息驱动返回后的信息处理,实现了进程隐藏(隐藏部分的代码未贴出)。
注:原创手打,错误难免,不当之处望见谅。
