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 需要下面几个步骤实现:

  1. 设置硬件断点
  2. 注册 VEH 异常处理函数
  3. 编写异常处理函数,实现自己的 hook 代码