CodePatch hook api

CodePatch hook api

技术原理

该种hook方法修改了目标api入口地址处的一些字节(32位和64位需要修改的字节数不同),通常修改为jmp xxx的形式,使得目标api跳转到我们的代码中执行。注意我们需要保存目标api入口处的原字节,以便脱钩。

为了能够在目标进程中执行这些操作,我们需要将代码注入到目标进程中去,通常使用远程线程dll注入技术达到该目的。

基本步骤

  1. 注入dll,DllMain中调用了钩取和脱钩的处理函数
  2. DllMain根据事件执行钩取或脱钩函数

钩取函数

代码很简单,通过修改目标api的入口处的5个字节(32位系统)达到钩取的目的。这里需要说一下如何计算jmp的操作数。

地址计算

上图展示了在32位系统中地址计算的原理与过程,下面说说在64位系统中的计算原理与过程:

在 64 位 Windows 系统中,使用 codepatch(通常指通过修改代码进行 API 挂钩)来 Hook 一个 API 函数,通常需要修改目标 API 入口处的至少 12 个字节。

在 x64 架构中,一条完整的、能够实现绝对远跳转的指令序列(例如 JMP RIP+imm32或通过寄存器的间接跳转)通常需要 12 到 14 个字节。这是因为:mov rax, 0x1122334455667788(将 64 位目标地址加载到 RAX 寄存器)这条指令本身就占用 10 个字节。紧随其后的 jmp rax指令占用 2 个字节。

为了保证修改的原子性和避免破坏可能存在的跨指令边界,实际操作中,更常见和安全的做法是准备一个 14 或 16 字节的补丁空间。例如,许多 Hook 库会备份并替换 API 函数开头的 14 个字节,以确保覆盖任何可能被部分修改的多字节指令。

脱钩函数

热补丁技术

如果使用上面的流程hook一个比较通用的API,那么会频繁地进行钩取和脱钩,这会影响系统的性能和稳定性。为了解决这个问题,就有了热补丁技术。

一些api的入口部分有如下特征:

入口处的NOP和mov edi,edi指令都是无意义的,我们可以修改这些指令的字节,使得目标进程跳转我们的代码中执行,在我们的代码中使用跳转回到mov指令的下一条指令,恢复目标api的执行。

具体操作如下:

  1. 将mov指令的两个字节修改为一个short jmp,操作数是第一条NOP指令的地址
  2. 将5条NOP指令修改为jmp xxx,xxx就是我们自己的代码地址

使用这样的二次跳转,就不需要进行脱钩操作,因为我们修改的字节对目标api的执行没有任何影响。

在使用热补丁技术的时候,需要观察目标api入口处是否满足对应的特征。

相关推荐
梁辰兴3 天前
软件工程:逆向工程
软件工程·逆向工程·应用场景·梁辰兴·抽象层次·工程过程·方法工具
学逆向的8 天前
inilne HOOK
前端·网络安全·hook
熵增就是商的余数25 天前
[LLMD]互动深度:算法揭秘·逆向推演完整过程(新增纯净观测窗口)
逆向工程·动态映射·生态建设·互动深度·算法推演·递增结构·认知重构
字节暗面1 个月前
四款 APP 加固强度测评:让 AI 拆了四个包,结果有点出乎意料
android·逆向工程·加固
k4m7v2pz1 个月前
Rust 程序在 ReactOS 上“加载即崩“:从崩溃地址 0x6107104d 到 CRT 依赖的深度排查
rust·交叉编译·逆向工程·reactos·pe格式·windows兼容
阿昭L1 个月前
ZwQuerySystemInformation通过PsLoadedModuleList枚举内核模块
windows·逆向工程·windows内核
深蓝电商API1 个月前
Hook XMLHttpRequest 实战
爬虫·hook
阿昭L2 个月前
静态反汇编:线性算法与递归向下算法
逆向工程
胡耀超2 个月前
固件逆向:从一坨二进制,到一个可以被解释的系统
python·逆向工程·硬件安全·二进制分析·电子数据取证·嵌入式安全·固件逆向
John_ToDebug3 个月前
Windows客户端热修复技术:从原理到工程实践
c++·经验分享·hook