JS 逆向与代码混淆还原相关方法、资源及思路总结
JS 逆向与代码混淆还原相关方法、资源及思路总结
一、核心目标与场景
- 核心目标:破解客户端加密逻辑(如签名、参数加密)、绕过安全验证机制,常见于 API 签名(sign)、数据加密(AES、HMAC 等)分析
- 应用场景:网站、微信小程序等,需处理混淆代码还原、加密算法逆向、签名生成逻辑分析等问题
二、代码混淆类型及还原方法
1. 常见混淆类型及特征
| 混淆类型 | 特征 | 还原方法 |
|---|---|---|
| eval 混淆 | 含eval关键字 |
去除eval()后在控制台输出,新建 JS 文件优化 |
| JJEncode | 包含很多$ |
复制代码到控制台执行,查看结果 |
| AAEncode | 包含大量颜文字 | 去掉结尾括号后在控制台执行 |
| JSFuck | 包含大量[]、()、+、! |
保存到本地,在 node 环境运行 |
| Obfuscator | 包含大量0x开头无意义字符串 |
控制台输出美化代码后断点调试;利用 AST 技术;在线工具(如https://webcrack.netlify.app/、https://deli-c1ous.github.io/javascript-deobfuscator/);结合 AI 还原 |
2. 混淆基本技术
- 变量和函数重命名:将有意义的名称改为
a、b等短名称 - 字符串编码:将字符串转为十六进制等编码形式
- 控制流混淆:改变代码执行流程结构,如将
if语句转为自执行函数形式
3. 高级混淆技术
- 代码压缩和优化:移除空白、注释,缩短变量名,简化表达式
- 代码拆分和重组:拆分成多部分,动态加载执行
- 自我修改代码:运行时解密并执行自身
三、JS 逆向关键技术与工具
1. AST 技术
定义:抽象语法树,是源代码的树状结构表示,将代码分解为语法单元并展示层次关系
主要用途
:
- 代码反混淆:还原变量名、解析控制流混淆、展开常量表达式
- 代码分析:识别关键函数、提取加密算法、分析数据流
- 代码修改:插入调试代码、移除反调试代码、修改业务逻辑
常用工具和库:Babel、Esprima、acorn、recast、jscodeshift
基本工作流程:解析(将代码转为 AST)→ 遍历(访问 AST 节点)→ 修改(转换 AST)→ 生成(将 AST 转回代码)
在线工具:https://astexplorer.net/、https://www.kitboxpro.com/tools/js-reverse 等
2. 逆向辅助工具
- v-jstools
- 安装:下载项目后,在浏览器开发者模式添加
- 配置:按自身需求在浏览器中进行相关设置
- 用途:辅助定位加密逻辑,通过控制台标注加密函数,简化断点调试
- JSRpc
- 项目地址:https://github.com/jxhczhl/JsRpc
- 使用流程:植入 JSEnv 并启动 ws 服务端→本地替换加密函数 JS 文件→访问注册接口测试加密
- 联动使用:启动 jsrpc 后,将相关代码粘贴到浏览器控制台,替换加密位置内容并调试
- Autodecode插件(burp插件)
3. 微信小程序相关工具
- 反编译工具:https://github.com/biggerstar/wedecode、https://github.com/Angels-Ray/UnpackMiniApp
- 调试工具:WechatOpenDevTools-Python(https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python)
4. Yak 脚本
- 特点:专为网络安全测试设计,易于学习,支持热加载,集成能力强
- 用途:可用于自动测试网站漏洞、模拟攻击验证防御措施等,如在 JS 逆向中配置热加载处理加密逻辑
四、签名绕过相关
1. 常见签名绕过方法
- 直接提取签名算法:静态分析 JS 代码定位签名生成函数,提取逻辑用其他语言重实现(适用于算法不依赖环境变量的情况)
2. 网站防御措施
- 将核心算法放在 WebAssembly 中
- 使用代码混淆增加分析难度
- 绑定用户会话和设备指纹
- 设置短时效的签名
- 服务端加强验证逻辑
五、微信小程序逆向流程
- 反编译
- 运行 wedecode 工具,选择对应选项
- 对于加密的小程序,先用另一款工具解密
- 回到 wedecode 工具,输入解密后文件夹路径进行解密
- 调试
- 使用 WechatOpenDevTools-Python 工具,运行后打开微信小程序进行调试
- 结合反编译代码,分析加密手法、sign 签名等(与浏览器调试类似)
六、案例思路总结
- 加密逻辑分析:通过定位数据包,分析启动器,设置断点调试,追踪加密函数及参数(如密钥、向量等)
- 混淆代码还原:根据混淆类型特征,选择对应还原方法(控制台执行、在线工具、AST 技术、AI 辅助等)
- 工具联动使用:如结合 JSRpc 和魔术方法,利用 v-jstools 辅助定位加密位置,通过 Yak 脚本热加载配置处理加密逻辑
- 验证加密逻辑:逆向得到加密算法后,通过测试数据验证,确保还原正确
七、注意事项
- 混淆可能轻微影响代码执行性能,且使调试困难
- 混淆不是加密,有经验的开发者仍可逆向工程
- 确保混淆代码不违反任何开源许可证
- 混淆是保护前端代码的有效手段,但不能替代服务器端的安全措施