hook & 算法剥离
一、 Hook
Hook (钩子) 技术,本质上是一种 “截获” 技术。它的核心思想是改变程序的正常执行流,让程序在执行某个特定函数(目标函数)之前、之中或之后,先跳去执行我们自定义的代码,然后再(通常)跳回原来的位置继续执行。
在逆向工程中,Hook 主要做三件事:
-
窥视(Spy): 查看函数接收了什么参数,返回了什么结果(例如:查看加密函数的明文输入)。
-
篡改(Modify): 修改参数或返回值(例如:把
CheckPassword()的返回值强行改成true)。 -
阻断(Block): 阻止原函数执行(例如:绕过联网验证)。
Hook 的两种常见形式:
-
静态 Hook (Static Hook / Patching):
-
例: 使用 dnSpy 修改
.exe文件本身,插入Console.WriteLine,保存并在硬盘上生成一个新的.exe。 -
特点: 修改了文件,永久生效。
-
-
动态 Hook (Dynamic Hook / Runtime Hook):
-
工具: Frida, Cheat Engine, Detours。
-
方法: 程序在内存中跑得好好的,Hook 工具直接修改内存中的指令,把函数的入口改成一条
JMP指令,跳转到自己的代码。 -
特点: 不修改硬盘上的文件,重启后失效,更隐蔽。
-
二、 Hook vs. 算法剥离:全方位对比
| 特性 | 算法剥离 (Extraction) | Hook (拦截) |
|---|---|---|
| 核心逻辑 | 把核心代码复制出来,隔离运行。 | 在原程序内部插入探针。 |
| 依赖性 | 对环境非常敏感。 如果代码依赖了很多全局变量、复杂的类库、配置,剥离很麻烦。 |
环境友好。 直接复用原程序的所有环境(内存、变量、配置全都是现成的)。 |
| 操作难度 | 需要手动修复依赖报错,一旦跑通,想怎么测都行。 | 容易破坏堆栈平衡,或者因为插入代码引发异常。 |
| 反调试对抗 | 强。 完全无视原程序的反调试检测。 |
弱。 原程序如果有完整性校验(Hash check),发现代码被改了可能会自毁。 |
| 适用场景 | 纯算法/数学逻辑。 如:加密算法、矩阵运算、解压算法。 |
系统交互/复杂状态。 如:网络发包、UI交互、依赖大量上下文的游戏逻辑。 |