欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]X64系统中WIN32程序应用层拦截驱动层交互的通杀方案

[原创]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查询信息驱动返回后的信息处理,实现了进程隐藏(隐藏部分的代码未贴出)。


注:原创手打,错误难免,不当之处望见谅。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功