inilne HOOK

IAT‑Hook 与 Inline‑Hook核心区别

对比项IAT HookInline Hook(内联Hook)
修改位置修改 IAT 表里面保存的函数地址,不改动函数本身机器码修改目标函数头部机器指令代码
可 Hook 范围只能 Hook 本模块导入表 IAT 中存在的外部 API 函数;自己模块内部自定义函数不能 IAT Hook任意函数都可以Hook:系统 API、自己写的自定义函数、C++ 虚函数都支持
检测难度相对容易检测;直接校验 IAT 表项的函数地址是否真实较难检测;需要校验函数头部机器码

Inline Hook 实现原理

  1. 修改目标函数最开头的机器码,植入一条 JMP 跳转指令,跳转到我们自己写的钩子函数
  2. x86 下 JMP 指令占5 个字节,会直接覆盖目标函数开头 5 字节原始指令
  3. 必须先备份被覆盖掉的 5 字节原始机器码
  4. 钩子函数执行自己逻辑(修改参数、拦截打印等)
  5. 执行完后,先执行备份好的被覆盖的 5 字节原指令;再跳回原函数剩下的代码继续运行
    流程:调用原函数 → jmp 跳到钩子函数 → 执行自定义逻辑 → 执行备份的 5 字节原指令 → 跳回原函数剩余代码

Inline Hook 代码层面要点

  1. 构造 JMP 机器码:0xE9 + 4 字节跳转偏移;需要正确计算相对偏移
    jmp 是相对跳转,偏移 = 目标钩子地址 − (当前 jmp 指令下一条指令地址)
  2. 操作前修改内存页属性,改为可读可写可执行,否则写内存报错
  3. Hook 卸载恢复:把备份的原始 5 字节机器码写回函数头部

Inline Hook 重要注意事项

  1. 钩子函数建议写裸函数(__declspec(naked)) 裸函数不会编译器自动生成栈帧,方便手动管理寄存器
  2. 手动保存 / 恢复寄存器(pushad /popad) 防止钩子函数破坏原本程序寄存器的值,导致程序崩溃
  3. JMP 相对偏移必须计算正确,偏移算错直接跑飞、程序崩溃
  4. 被覆盖的 5 字节指令,有可能正好是多条指令的一部分,会产生指令断裂问题(高级难点)

要点

  1. IAT‑Hook:改IAT 表函数指针;只能 Hook 导入的外部 API,容易检测
  2. Inline‑Hook:改函数头部机器码;覆盖 5 字节,jmp 跳转;可以 Hook 任意函数,更难检测
  3. Inline Hook 三件套:①备份原 5 字节代码;②写入 jmp;③钩子执行完还原被覆盖指令再返回原函数
  4. 钩子用裸函数,手动保存寄存器;jmp 要算对偏移
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值