HotFixHook & 原理与实现(2)

发布者:极安御信
发布于:2021-12-21 18:51

图片


作者 | 榴莲

编辑 | 楌橪


HotFixHook也可以称为热补丁,这种HOOK方法本质上与InlineHook没有什么区别,但是它的效率更高,之所以这样,是因为HotFix的指令替换原理与Inline不同。InlineHook因为占用了函数头至少5个字节的空间,所以这种方式是影响函数正常运行的,如果需要在HOOK函数中调用原有的执行流程,那么就必须在调用原有流程之前卸载掉HOOK,也就是将被替换的字节码还原。而当退出之前如果想要继续接管这个函数,那么又需要将HOOK代码再次替换掉。

图片那么一来二去,每次调用HOOK函数都需要摘一次挂一次HOOK,造成了很大的资源浪费,导致效率降低。而HotFix采取了另外的替换思路。例如说MessageBoxA原有的函数实现是下图这样的:

图片

如果是InlineHook,那么就会直接替换5个字节,变成下图这样:

图片

而HotFixHook采取另外的思路,因为根据上面的第一张图可以发现,函数头的位置是8BFF,也就是mov edi,edi,这种代码本身在函数中并没有起到任何作用,也就说,即使破坏了这句硬编码,但是只要从函数地址加二的位置上开始执行,依然不影响函数的正常功能,也因此,我们可以将这两个字节替换成EB F9,也就是一个短跳指令,如下图:

图片

此时我们就可以在75E034CB的位置往下数,此处地址距离函数头正好有5个字节的空间,那么我们就可以将JMP ADDRESS的指令放到这5个字节里。完成流程劫持的目的,并且,如果我们需要调用原始函数,只需要跳过短跳即可。修改完成后如下图:

图片

下面,我们采用MessageBoxA的Hook作为例子,实际体验一下HotFixHook的实现方式。

图片

 长按扫码,分享朋友圈

我这里采用的操作系统是Windows 10 20H2(19042.1288),集成开发环境采用的是Visual Studio 2017。那么我们先来创建一个DLL项目。步骤如下:

1.选择新建项目

图片

2:选择Windows桌面->动态链接库(DLL),点击确定

图片

3:注释#include “pch.h”,添加#include <Windows.h>。删除framework.h、pch.h以及pch.cpp文件。

图片

4:配置

4.1 选择属性

图片


4.2 修改运行库以及Spectre缓解,选择应用

图片4.3 修改预编译头,选择应用

图片

5.   在每一个分支中,添加break,防止DLL注入失败。

图片

6.   在MessageBoxA的函数名上F12,就可以看到函数原型

图片

7.   复制出来,实现一个函数指针,以及一个HOOK后的执行流程函数

7.1 函数指针如下图:

图片

7.2 HOOK后的函数如下图:

图片

8.   接下来我们实现HOOK函数

图片

9.   实现卸载HOOK函数

图片

10.  在DLL_PROCESS_ATTACH与DLL_PROCESS_DETACH中分别调用HOOK与卸载HOOK函数

图片


11.生成文件

图片

12.取出文件到桌面或其他位置

图片

13.测试HOOK效果

13.1.首先写一个目标程序,代码如下

图片

13.2使用注入器(自行编写或网上下载,这里我用的是自己写的)将我们生成的模块注入到目标进程中。

正常情况下:

图片


HOOK后:

图片

到了这里,我们就完成了整个HotFixHook的代码编写

图片


关于作者

作者:rkvir(榴莲老师)

简介:曾任某安全企业技术总监;看雪讲师;曾任职国内多家大型安全公司;参与*2国家级安全项目

擅长:C/C++/Python/x86/x64汇编/系统原理&

研究方向:二进制漏洞/FUZZ/Windows内核安全/内网攻防



声明:该文观点仅代表作者本人,转载请注明来自看雪