1. 项目概述:从一次登录请求说起
最近在做一个企业办公系统的自动化对接项目,客户用的是泛微OA。大家都知道,这类系统为了安全,登录时的密码肯定不会明文传输。我像往常一样打开浏览器的开发者工具,准备抓个包看看接口,结果发现提交的 password 字段是一串长得离谱的、毫无规律的字符,明显是经过前端加密处理了。这活儿一下就变得有意思了——不搞清楚这个加密逻辑,后续的自动化登录、单点登录集成啥的都无从谈起。这其实就是典型的JS逆向场景:目标明确,就是逆向分析前端JavaScript代码,找到密码的加密算法和密钥,最终能在我们自己的脚本或程序里复现这个加密过程。
“JS逆向三百例”这个系列,就是想通过一个个真实的、有代表性的案例,把JS逆向的思路、工具和技巧串起来讲透。今天这个泛微OA前端密码加密,就是一个非常经典的案例。它涉及到了常见的混淆、加密库的识别、关键逻辑的定位,以及如何将零散的JS代码片段,整理成我们可用的Python或Node.js代码。整个过程,就像侦探破案,从网络请求这个“结果”出发,一步步回溯到产生这个结果的“源代码”。无论你是做爬虫遇到加密参数,还是做安全测试、自动化运维需要模拟登录,这套分析方法都是通用的核心技能。
2. 核心思路与工具准备
逆向分析不是漫无目的地看代码,得有清晰的思路和顺手的工具。我的核心思路永远是“由外而内,顺藤摸瓜”。
2.1 逆向分析的核心路径
2.2 必备工具清单
工欲善其事,必先利其器。以下是进行JS逆向的“瑞士军刀”:
- 浏览器开发者工具(Chrome DevTools / Firefox Developer Edition) :这是主战场。尤其是Sources面板(用于查看、搜索、调试JS)、Network面板(用于抓包)、Console面板(用于执行临时代码测试)。
- 代码美化工具(Pretty Print) :线上JS代码通常被压缩成一行,难以阅读。DevTools中有一个 {} (Pretty Print)按钮,可以一键将混淆压缩的代码格式化,这是逆向的第一步。
- Overrides功能(本地代码替换) :在Sources面板的Overrides标签页,可以指定一个本地文件夹,然后将线上JS文件映射并保存到本地。你可以在本地修改代码(例如,添加日志、修改逻辑),刷新页面后浏览器会加载你本地的版本,极大方便调试和测试。
- Fiddler / Charles(抓包与改包) :虽然浏览器自带抓包,但这类专业工具功能更强大,可以拦截和修改任意请求/响应,设置断点,进行压力测试等,在复杂场景中非常有用。
- Node.js环境 :用于在本地执行和测试还原出来的JavaScript加密函数。很多时候,加密逻辑依赖浏览器环境的一些特有对象(如 window 、 document ),需要在Node.js中模拟这些环境,或者将代码改写成不依赖浏览器的纯逻辑。
- Python环境及相关库 :最终我们往往需要在Python中实现加密。常用的库有:
- execjs : 用于执行JavaScript代码。当你把关键的JS加密函数抠出来后,可以直接用这个库在Python中调用。
- PyExecJS : 类似 execjs 的另一个选择。
- Crypto /
