Hook 技术与动态执行
本节目标
- 理解「Hook(钩子)」:在不动原代码前提下拦截函数调用
- 用 Node 演示「替换函数」实现 Hook
- 知道 Hook 在逆向里怎么帮你「偷看输入/输出」
Hook = 把目标函数「替换/包裹」掉,在它执行前后插入你的逻辑(比如打印参数、改返回值)。逆向里常用来「不打断点也能看到每次加密的输入输出」。
// 运行环境:Node.js 16+(无需依赖)
// 运行:node jsr-l14.cjs
// 假设目标函数(可能是某个库/闭包里的)
function encrypt(data) { return '密文:' + data }
// —— Hook:包裹原函数,偷看输入输出 ——
const _orig = encrypt
encrypt = function (data) {
console.log('[HOOK] 输入:', data) // 执行前打印输入
const r = _orig(data) // 调用原实现
console.log('[HOOK] 输出:', r) // 执行后打印输出
return r
}
encrypt('hello') // 你会看到输入 hello、输出 密文:hello浏览器里的 Hook:在 DevTools Console 里,对 window 上的目标函数或 XMLHttpRequest.prototype.send 直接赋值替换,页面后续调用就被你截获。还能 Hook crypto 的 createCipheriv 看 key/iv。
动态执行:把抠出来的算法函数,在 Node 里用真实输入跑一遍,验证和网站上算的一致——这就是「复现验证」。
名词解释
Hook(钩子):在不修改原函数源码的前提下,「拦截」它的调用,在前后插入自己的逻辑。类比:你在水管上接了个透明旁路,水(数据)流过时你能看一眼、甚至改一改,再放回去。逆向里 Hook 用来「无侵入地观察」每次加密的输入输出,比断点更省事(不用每次手动暂停)。
动态执行(Dynamic Execution):把从前端抽出的算法,拿到 Node/浏览器里「真正跑一遍」,喂入真实数据看输出。它是「复现验证」的关键一步——只有动态执行的结果和网站一致,才算还原成功。静态读代码永远不如动态跑一遍可靠。
课后练习
练习 1:Hook 和「直接改源码」比,优势在哪?
答案:Hook 不改原文件、不破坏其他逻辑,且能「持续观察每次调用」(断点每次要手动继续)。在浏览器里 Hook
XMLHttpRequest.prototype.open之类,能看到页面所有请求;改源码则得重新打包、容易出错。
练习 2:Hook crypto.createCipheriv 能看到什么关键信息?
答案:能看到每次加密调用的 algorithm(如 aes-128-cbc)、key、iv——这正是 AES 复现要的四个要素里的三个。Hook 它是「无痛提取加密参数」的利器,比读代码找 key/iv 快得多。
总结
Hook 是逆向里「性价比最高的观察手段」,没有之一。我的观点:与其在几千行混淆代码里苦找 key/iv,不如直接在浏览器里 Hook 住 crypto.createCipheriv,让程序「自己把密钥吐给你看」。它本质上是「让目标主动暴露」,而不是「你去猜」。但要注意:Hook 只能看到「运行时确实发生的调用」,如果某分支没走到就看不到——所以配合「触发对应操作」才能钓全参数。新手常低估动态执行:你把算法抽出来在 Node 跑通,比读十遍代码都踏实。Hook + 动态执行,是「从看懂到复现」的最短路径。