https://blog.csdn.net/qq_38474570/article/details/120457798
- 一般的 hook
- 找到 hook 点,更改机器码为 jmp 或者 call 跳转到自己的操作逻辑上,然后修复被波坏的机器码,然后跳回原 hook 点继续执行
- 缺点
- 没有办法规避 CRC32 检测
- jmp 至少破坏 5 个 byte,动静太大
- 若原来的位置就是 jmp,那还要重新计算偏移,容易出错
- hook 点位明显,容易“黑吃黑”
- 普通 hook
- 对 hook 点用 0xCC 替换
- 产生异常,通过 AddVectoredExceptionHandler 来实现自定义的逻辑,然后跳转回原来的 hook 点执行
- 缺点
- 还是会破坏一个字节
- 无法通过 CRC32 检测
- 高级 hook
- 对 hook 下硬件断点,不改变原来有的硬编码
- 找准 hook 点,通过设置 DR0-DR3/DR7 下的硬件断点,通过自定义的异常处理函数接管,来实现自定义的处理逻辑
- 优点
- 可以绕过普通的 CRC32 检测
- 并不是直接从 hook 点跳转到自定义的处理函数,不容易被其他人找到
- 缺点
- 硬件断点只有四个
- 原程序一旦设置 DR0-DR4 为零,或者 DR7 的硬件断点开关为 0,硬件断点立刻失效
- 更高级的 hook
- VT 读写分离
- 找到 hook 点更改原来的机器码为 jmp 或者 call,跳转到自己的处理逻辑,然后修复被破坏的机器码,然后跳回原来的 hook 点位继续执行
- 优点
- 通过页的读写分离,可以直接隔离 CRC32 和 dll 模块检测
- 缺点
- 要开启 VT,性能损耗
- VT 可以嵌套,可能会被其他的 VT 监控
实现硬件 hook 需要下面几个步骤实现:
- 设置硬件断点
- 注册 VEH 异常处理函数
- 编写异常处理函数,实现自己的 hook 代码