我曾经对Unix、Windows及某些嵌入式系统中软件相关的二进制逆向工程比较擅长,而对WEB前端逆向很陌生。2024上半年学习过一段时间WEB前端逆向,有些感想,对某些初学者或许是个参考。 ☆ F12调试基础 先熟悉F12调试。主要关注三个面板,Console/Sources/Network。先不考虑对抗场景,就拿普通场景练手,熟悉各种基本操作。Network重点关注Initiator列的调用栈回溯。Sources重点关注各种类型的断点如何设置。没有捷径,多用自然熟。 熟悉F12的过程中我接触到axios库,起初在Console中学,后来在nodejs中用得多,该库比较实用。还有个ajaxhook库,我也学了,但后来的逆向实践中几乎没用上过。 练习axios库时,遭遇跨源资源共享(CORS)、Mixed Content、Content Security Policy (CSP),学会如何处理。比如修改"meta http-equiv",提供支持CORS的HTTPS服务等等。放狗搜关键字,实测一些用例,别怕麻烦。 我用Python的flask模块实现支持CORS的HTTPS服务,也用原生http.server、ssl等模块实现过。该需求在后来的逆向实践中多次遭遇过。 接下来熟悉"Override content"。我几乎不用Fiddler、Burp之类的工具干这事,本地Overrides简单、实用。 接下来学Tampermonkey插件使用、油猴脚本编写。比如有些论坛统计在线时长,弄个最简单的定时刷新,藉此掌握脚本语法。 js调试不像二进制调试,缺失的能力非常多,需要借助Hook技术拦截函数、辅助调试。有传统的Hook,也有ES6 JS Proxy技术可用,我的经验是,绝大多数时候用不上后者。 F12还有许多犄角旮旯的东西,用多了总会碰上,前面说的是最基础的一部分,入门时需优先掌握。 ☆ 反调试 假设已掌握F12调试基础知识,找站练手,大概率遭遇"反调试"。 定时器型无限debugger最常见。还有图省事的console-ban、devtools-detector之流。每种都实际对付一下,掌握基本的"反反调试"套路。 有些网站会替换(屏蔽)console.log,给F12调试增加障碍,可用油猴脚本提前备份console.log。 ☆ 反混淆 现在的网站反调试时,大部分都同步启用"js混淆",此时纯靠F12动态调试不明智。 为此学习Babel,所谓"AST反混淆"。一路学过来,到这一步算是出现一点小门槛。许多初学者在此步出现畏难情绪,或者找个现成工具对付个例,而不自己实现反混淆。我的经验是,学Babel,自己实现反混淆,反上三四个站,就越过门槛了,以后好处多多。我最早碰上的是"jsjiami.com.v7/v6",写了几个工具。后来即使不是这种混淆手段,小改工具也是一样对付。 ☆ 不断练习 经历了前几步的锤炼后,上52pojie找一些别人写过分析的网站练手。他人写的终是他人的,不是自己的,得自己实操一番。我大概练过十几个站,这些逆向目标可能还活着,但加密手段不太可能与文章保持一致,毕竟一写出来,站方就会针对性加强、改变。某种意义上,这更适合初学者练习提高,一方面,不是完全摸不着北,另一方面,不能完全照搬,出现新的挑战,我正是在此过程中遭遇原本没有的wasm。 ☆ wasm 这一块的知识与前面的有较大差别,熟悉二进制逆向的,更容易上手,但并不等价于传统二进制逆向,主要缺乏静态分析、动态调试的工具。不是说没有,而是非常不强大。 我在这个阶段学习了纯汇编wasm编程、纯C wasm编程、Go/TinyGo、Emscripten,这四种。wasm对我是个新东西,不想一上来就逆向它。先学习正经wasm开发是怎么样的,有哪些API可用,有哪些编译工具链,各自生成的wasm各有什么特征,有哪些静态分析、动态调试工具,如何静态Patch wasm等等。这些问题是所有二进制逆向工程都需要优先回答的。当这些正向问题得到合理解答后,再去逆向网站中的wasm。 不说别的,静态Patch wasm,这是项实用技能,应该掌握它。碰上过一个wasm带时间戳检查,Chrome动态调试wasm很困难。后来找出时间戳检查函数,汇编级静态Patch,使之恒返回True,再结合Overrides启用Patch过的wasm,最终调试清楚加密相关算法。 ☆ CyberChef 这是github上的开源工具,比许多在线工具强多了,支持绝大多数WEB前端逆向会碰上的算法,全离线使用,推荐。 ☆ 面向GPT学习WEB前端逆向 我问ChatGPT 3.5好多js相关的问题,省了太多时间。若用其他付费AI,只会更爽。还没体会到AI妙处的,或许不适合逆向工程这行。 有句话,当答案变得唾手可得,真正有价值的反而是提出问题的能力。 ☆ 迭代式拓展知识边界 WEB前端逆向所涉及的知识点说多不多、说少不少,难者不会、会者不难,不要指望一两周就全掌握,不是一两个站就练得完的。与所有的逆向工程一样,需要迭代式拓展知识边界。 假设今天看到一篇新文章,其中提到三个知识点,前两个相对容易复现、实操,第三个囿于当前知识储备不明所以,不必沮丧,权且记下,留待日后再来。第一次碰上别人说"Local Overrides",不知道在说啥。第一次碰上别人说wasm,猜得出是个啥,不知道怎么下手。第一次碰上"JS RPC",一脸懵。都会有第一次遭遇,看得懂的就练练,暂时看不懂的,记下,回头再看。不断看新文章,不断练手,不断回头看,不断迭代。 ☆ 认真记录 好记性不如烂笔头,认真记录每一次逆向工程,经验、教训、猜测、疑问,统统记下来,我曾在两三个不同的目标网站逆向工程记录中提取出共性的经验结论。 关于如何记录,不重复写了,说过太多年、太多次,悟者自悟。 ☆ 最后 翻了翻自己的WEB前端逆向笔记,内容多得已能出本书,但也出不了书。我写东西很是肆意妄为,不大受约束,口语太多,嬉笑怒骂皆由心,不会为了出版社编辑的各种正确而修改什么。所以,二十多年从未自取其辱。 众所周知,WEB前端逆向与黑、灰产强相关。有些人挂在嘴边的,只是混口饭吃。也对,有可能几年都有公家饭吃,还能顺便学会踩缝纫机。若只是出于永远的好奇心,也就罢了。尽个人事,碎嘴一下,别做黑产。