JS Hook 实战 | 基于Webpack的JS加解密分析
字数 1279 2025-08-11 21:26:27
JS Hook 实战教学:基于Webpack的JS加解密分析
前言
本教学文档基于FreeBuf文章《JS Hook 实战 | 基于Webpack的JS加解密分析》,详细讲解如何通过JS Hook技术分析并绕过Web应用中的数据加密机制。
案例背景
在对某站点短信验证码业务进行接口遍历测试时,发现目标对手机号码信息进行了加密,且采用非对称加密方式,每次加密的数据都不相同。
工具准备
- 浏览器:Chrome
- 抓包工具:Yakit
- 调试工具:Chrome开发者工具
分析步骤
1. 识别加密行为
首先通过抓包观察到目标站点对关键数据(如手机号)进行了加密,加密形式如下:
{
"mobile": "RSA加密后的字符串",
...
}
2. XHR断点调试
- 在Chrome开发者工具中,切换到Sources面板
- 在XHR/fetch Breakpoints中添加断点,针对发送验证码的API端点
3. 触发请求并分析
- 重新发送验证码请求,触发断点
- 观察调用堆栈(Call Stack),逐步分析加密过程
4. 定位加密函数
通过调试发现加密逻辑:
t.$crypt.RSA.encrypt(o.userName)
其中:
t.userName是手机号的明文t.$crypt.RSA.encrypt是加密方法
5. Hook加密方法
为了修改手机号,需要在数据加密前进行字符串替换,可通过以下两种方式实现:
方法一:使用Fiddler抓包替换
- 配置Fiddler自动响应规则
- 拦截目标JS文件并替换修改后的版本
方法二:Chrome浏览器本地替换(推荐)
- 在Sources面板的Overrides选项卡中,添加一个本地文件夹作为重载目录
- 找到目标JS文件,右键选择"Save for Overrides"保存到重载目录
- 修改JS文件,添加Hook代码
6. 实现Hook代码
在加密函数前插入Hook逻辑:
// 保存原始加密函数
const originalEncrypt = t.$crypt.RSA.encrypt;
// 重写加密函数
t.$crypt.RSA.encrypt = function(data) {
// 在这里进行字符串替换
if (data === "原始手机号") {
data = "新手机号";
}
console.log("加密数据:", data);
return originalEncrypt.call(this, data);
};
7. 验证Hook效果
- 刷新页面,触发修改后的JS文件
- 观察控制台输出,确认Hook成功
- 检查网络请求,确认手机号已被替换并正确加密
8. 处理复杂场景
在本案例中,验证码发送需要两个请求:
- 第一个请求返回动态加密值,用于检验第二个请求的合法性
- 两个请求中的手机号都需要替换
操作方法相同,需要对两个请求中的加密函数分别进行Hook。
关键点总结
- 加密识别:通过抓包识别哪些字段被加密
- 断点调试:使用XHR断点定位加密代码位置
- 调用堆栈分析:通过调用堆栈找到加密函数
- Hook策略:在加密前进行数据替换
- 本地替换:Chrome的Overrides功能是最稳定的Hook方式
- 复杂流程处理:注意多个相关请求可能需要分别Hook
注意事项
- Webpack打包的应用中,函数和变量名可能被混淆,需要耐心分析
- 非对称加密每次结果不同,不能简单替换加密后的字符串
- 确保Hook代码在加密函数被调用前执行
- 对于生产环境,可能需要处理代码压缩和混淆的情况
扩展应用
此技术不仅可用于测试,还可用于:
- 自动化测试中的测试数据准备
- 安全审计中的加密逻辑分析
- 逆向工程中的加密算法研究
通过掌握JS Hook技术,可以有效分析Web应用中的加密机制,为安全测试和开发调试提供有力工具。