在Web安全与数据爬取领域,JavaScript加密黑盒的逆向工程是核心技术之一。本文基于行业通用方法论与实战案例,提炼出一套标准化的五步逆向流程,涵盖目标定位、代码提取、逻辑分析、算法复现到自动化集成的全链路解决方案,帮助开发者系统性突破加密壁垒。
第一步:目标定位——锁定加密入口
核心任务
识别请求中的加密参数(如sign
、token
)及其调用链路。
抓包分析
通过Chrome DevTools的Network面板捕获目标接口,筛选携带加密参数的请求。例如,某网系统的查询接口/rxxx/xxxxxte
中,nonce
(随机数)和sign
(签名)是关键加密字段。
关键参数溯源
利用搜索功能(Ctrl+Shift+F)在JS文件中定位参数生成逻辑。例如,搜索encryptByMD5
或getKeyParams
等关键词,可快速定位加密函数。
工具推荐
-
Fiddler:跨域抓包
-
Postman:接口调试
对抗策略
开发者需警惕接口参数名动态变化(如随机哈希命名),此时需依赖调用栈回溯或XHR断点追踪。
第二步:代码提取——剥离混淆层
核心任务
获取加密逻辑所在的JS文件,并完成反混淆处理。
本地代码覆盖
使用Chrome Overrides功能将线上JS文件替换为本地副本,持久化调试修改后的代码。例如,通过覆盖chunk-xxx.js
文件,插入日志输出或修改加密逻辑。
反混淆技术
针对字符串加密、控制流平坦化等混淆手段,使用JSNice、Babel AST解析器还原代码逻辑。例如,某航空平台的Authorization生成代码通过AST解析后,暴露出RSA公钥和动态时间戳的拼接规则。
工具推荐
-
AST Explorer:语法树分析
-
Prettier:代码格式化
对抗策略
警惕“自毁代码”(如定时器触发代码删除),需优先保存原始文件副本。
第三步:逻辑分析——动态调试与HOOK拦截
核心任务
通过断点调试和HOOK技术追踪加密函数调用链。
动态调试技巧
在Chrome DevTools中设置条件断点,观察加密函数输入输出。例如,某金融APP的encryptByAES
函数通过断点捕获到IV(初始化向量)为固定值12xxxxxxxxxxxef
。
HOOK技术应用
使用Frida或Tampermonkey拦截关键函数。例如,HOOK Cipher.doFinal()
可捕获AES加密前的明文数据,或通过SSL_write拦截HTTPS请求的原始载荷。
案例
某医疗平台通过HOOK JSON.parse
函数,发现响应数据解密前的Base64编码逻辑,成功绕过反爬机制。
第四步:算法复现——跨语言移植与验证
核心任务
将JS加密逻辑转化为Python等后端语言代码。
算法还原
对加密函数进行逐行翻译。例如,某翻译平台的sign
参数生成逻辑为:
def generate_sign(timestamp, nonce, skey, body): raw = f"{timestamp}{nonce}{skey}{body}" md5_hash = hashlib.md5(raw.encode()).hexdigest().upper() rsa_sign = rsa_encrypt(md5_hash, public_key) # 使用逆向得到的RSA公钥 return base64.b64encode(rsa_sign).decode()
该逻辑通过对比线上请求验证一致性。
对抗动态密钥
若加密密钥依赖环境变量(如浏览器指纹),需模拟生成逻辑。例如,某电商平台通过document.querySelector
获取隐藏的RSA公钥,需在代码中硬编码或动态爬取。
工具推荐
-
PyExecJS:执行JS代码
-
Cryptography:加密算法库
第五步:自动化集成——构建高鲁棒性请求框架
核心任务
将逆向结果封装为可持续运行的爬虫或测试工具。
请求模拟
使用Requests或Playwright构建请求链,处理Cookie、IP轮询等反爬策略。例如,某平台的登录流程需先获取动态skey
,再生成签名,最终提交加密表单。
容错与迭代
针对密钥更新、代码混淆升级等风险,设计自动化监控机制。例如,通过AST解析定期对比JS文件差异,或部署CI/CD流水线自动测试加密逻辑有效性。
案例
某风控系统通过定期抓取JS文件哈希值,触发逆向流程重新执行,确保爬虫持续可用。
总结:逆向工程的核心思维
-
分层突破:从网络层到代码层逐级拆解,避免陷入全局混淆的复杂性。
-
动态对抗:加密方案持续迭代,需建立自动化响应机制(如密钥池动态更新)。
-
合规边界:逆向仅用于技术研究,需遵循Robots协议与数据隐私法规。
开发者可系统化应对各类加密场景,将“黑盒”转化为可维护、可扩展的技术资产。