Skip to content

hook & 算法剥离

一、 Hook

Hook (钩子) 技术,本质上是一种 “截获” 技术。它的核心思想是改变程序的正常执行流,让程序在执行某个特定函数(目标函数)之前、之中或之后,先跳去执行我们自定义的代码,然后再(通常)跳回原来的位置继续执行。

在逆向工程中,Hook 主要做三件事:

  1. 窥视(Spy): 查看函数接收了什么参数,返回了什么结果(例如:查看加密函数的明文输入)。

  2. 篡改(Modify): 修改参数或返回值(例如:把 CheckPassword() 的返回值强行改成 true)。

  3. 阻断(Block): 阻止原函数执行(例如:绕过联网验证)。

Hook 的两种常见形式:

  1. 静态 Hook (Static Hook / Patching):

    • 例: 使用 dnSpy 修改 .exe 文件本身,插入 Console.WriteLine,保存并在硬盘上生成一个新的 .exe。

    • 特点: 修改了文件,永久生效。

  2. 动态 Hook (Dynamic Hook / Runtime Hook):

    • 工具: Frida, Cheat Engine, Detours。

    • 方法: 程序在内存中跑得好好的,Hook 工具直接修改内存中的指令,把函数的入口改成一条 JMP 指令,跳转到自己的代码。

    • 特点: 不修改硬盘上的文件,重启后失效,更隐蔽。


二、 Hook vs. 算法剥离:全方位对比

特性 算法剥离 (Extraction) Hook (拦截)
核心逻辑 把核心代码复制出来,隔离运行。 在原程序内部插入探针。
依赖性 对环境非常敏感。

如果代码依赖了很多全局变量、复杂的类库、配置,剥离很麻烦。
环境友好。

直接复用原程序的所有环境(内存、变量、配置全都是现成的)。
操作难度 需要手动修复依赖报错,一旦跑通,想怎么测都行。 容易破坏堆栈平衡,或者因为插入代码引发异常。
反调试对抗 强。

完全无视原程序的反调试检测。
弱。

原程序如果有完整性校验(Hash check),发现代码被改了可能会自毁。
适用场景 纯算法/数学逻辑。

如:加密算法、矩阵运算、解压算法。
系统交互/复杂状态。

如:网络发包、UI交互、依赖大量上下文的游戏逻辑。