逆向实战全流程与工具链

本节目标

我们走一遍虚构案例:某站列表接口带 sign,要还原它。

① 抓包:Network 看到 /api/list?page=1&sign=8a3f...
② 定位:全局搜 'sign' → 命中 makeSign(在模块 42)
③ 断点/Hook:Hook createHash('md5'),看到 sign = md5(sorted(params)+salt)
④ 还原:读 makeSign,确认拼接顺序、salt 常量 = 'APP_SALT'
⑤ 复现:Node 里重写 makeSign,用同样 page 算 sign,请求成功

自用工具链清单(按使用频率):

- 浏览器 DevTools(Network / Sources / Console)——日常 80% 工作
- Node.js + crypto——复现加密/哈希
- @babel/core——AST 反混淆(见 ast-pro)
- Charles / Fiddler——移动端抓包(可选)
- 一个「参数→sign」的本地验证脚本——随时自测

可运行的最小复现骨架:

// 运行环境:Node.js 18+(无需依赖)
// 运行:node jsr-l15.cjs
const crypto = require('crypto')
function makeSign(params, salt) {
  const raw = Object.keys(params).sort().map((k) => k + '=' + params[k]).join('&') + salt
  return crypto.createHash('md5').update(raw).digest('hex')
}
// 复现:用任意 page 都能算出合法 sign
const params = { page: '1' }
const sign = makeSign(params, 'APP_SALT')
console.log('复现 sign:', sign, '-> 可拼成 /api/list?page=1&sign=' + sign)

名词解释

工具链(Toolchain):你做逆向时「固定使用的一组工具组合」。就像木匠的工具箱,不需要每次现找。成熟的逆向者都有一套「DevTools + Node + babel + 抓包工具」的固定搭配,遇到新目标直接套流程,而不是临场摸索。建立工具链 = 把「经验」固化成「肌肉记忆」。

实战闭环(定位→还原→复现):逆向不是「读懂代码」就结束,而是「能在自己程序里复现出一致结果」才算完成。定位(找到算法)、还原(理解算法)、复现(写出来跑通)三步闭环,缺一步都不算赢。复现验证是整个流程的「验收标准」。

课后练习

练习 1:为什么「复现脚本」要能「用任意参数算出合法 sign」,而不只是复现某一次?

答案:因为真实场景你要批量/动态发请求,不能写死成某一次抓包的值。脚本必须对「任意输入」都算出合法 sign,才算真正还原了算法。只复现一次只是「抄答案」,不是「会做题」。

练习 2:工具链里为什么「本地验证脚本」很重要?

答案:它是你的「自测基准」——随时喂入参数看 sign 对不对,不用每次开浏览器抓包。把验证成本降到最低,才能快速迭代「我还原得对不对」。没有它,你会反复在浏览器里手动试,极慢。

总结

学完前面所有单点,真正的分水岭是「能不能把它们串成闭环」。我的观点:单点技术(抓包、断点、加密)很多人都会,但能稳定走完「定位→还原→复现」全流程的人很少,差距就在「有没有工具链、有没有验证脚本」。我的建议是:每搞定一个站点,就把「它的 sign 算法 + 你的复现脚本」存进工具箱,下次遇到同类结构直接复用。逆向不是每次从零开始的艺术,而是「模式识别 + 复用经验」的工程。最后强调:复现验证是不可省略的验收关——你以为懂了和真的算对,中间差的就是这一脚油门。