freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

HotFixHook & 原理与实现(2)
2021-12-21 18:47:07
所属地 辽宁省

作者 | 榴莲

编辑 | 楌橪

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 内核安全/内网攻防

# 渗透测试 # 系统安全 # 数据安全 # 企业安全 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者