JavaScript逆向工程:如何快速定位加密位置
详细介绍在JavaScript逆向分析中快速定位加密点的各种方法和技巧,包括控制台分析、断点调试、堆栈跟踪等
JavaScript逆向工程:如何快速定位加密位置
在进行JavaScript逆向工程时,定位加密位置是一个关键步骤。本文将介绍几种实用的方法来帮助你快速准确地找到关键的加密点。
基础准备工作
在开始定位加密位置之前,需要做以下准备:
- 安装好Chrome开发者工具
- 熟悉Network面板的使用
- 了解Sources面板的基本操作
- 掌握Console面板的调试技巧
常用定位方法
1. 请求分析法
这是最基本也是最常用的方法:
- 打开开发者工具的Network面板
- 勾选"Preserve log"选项
- 清空现有请求记录
- 执行目标操作(如登录、搜索等)
- 分析新产生的请求,找到包含加密参数的请求
// 示例:在请求中找到的加密参数
{
"timestamp": "1641456789",
"sign": "a1b2c3d4e5f6g7h8i9j0",
"data": "U2FsdGVkX1+9X9..."
}
2. 关键字搜索法
在Sources面板中搜索可能的加密关键字:
// 常见的加密相关函数名或变量名
encrypt
decrypt
md5
sha1
sha256
AES
DES
RSA
sign
signature
使用快捷键 Ctrl + Shift + F
(Windows) 或 Cmd + Shift + F
(Mac) 进行全局搜索。
3. 堆栈跟踪法
通过Console设置监听来跟踪函数调用:
// 监听所有XMLHttpRequest请求
(function() {
let open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
console.trace('XHR Request');
return open.apply(this, arguments);
}
})();
4. 参数断点法
在可能的加密参数上设置断点:
// 1. 使用debugger
Object.defineProperty(window, 'sign', {
set: function(value) {
debugger;
console.log('sign value:', value);
}
});
// 2. 使用console.trace()
Object.defineProperty(window, 'encrypt', {
get: function() {
console.trace('Encryption function called');
return function() { /* ... */ };
}
});
5. 特征识别法
寻找常见的加密特征:
// 1. Base64编码特征
if (str.match(/^[A-Za-z0-9+/=]+$/)) {
console.log('可能是Base64编码');
}
// 2. MD5特征(32位十六进制)
if (str.match(/^[a-f0-9]{32}$/)) {
console.log('可能是MD5加密');
}
// 3. URL编码特征
if (str.includes('%')) {
console.log('可能包含URL编码');
}
进阶技巧
1. 代理抓包分析
使用Charles或Fiddler进行抓包:
- 设置HTTPS抓包
- 对比请求前后的数据变化
- 分析加密参数的生成规律
2. 变量监控技术
使用Proxy监控可疑对象:
// 监控整个window对象
window = new Proxy(window, {
get: function(target, property) {
if (property.toLowerCase().includes('encrypt')) {
console.trace(`访问了可疑属性: ${property}`);
}
return target[property];
},
set: function(target, property, value) {
if (property.toLowerCase().includes('encrypt')) {
console.trace(`设置了可疑属性: ${property}`);
}
target[property] = value;
return true;
}
});
3. 函数调用链分析
使用Performance面板分析函数调用链:
- 开启Performance记录
- 执行目标操作
- 停止记录并分析调用栈
- 找出可疑的函数调用
4. WebAssembly检测
某些加密可能在WebAssembly中实现:
// 监控WebAssembly的实例化
const originalInstantiate = WebAssembly.instantiate;
WebAssembly.instantiate = function() {
console.trace('WebAssembly被实例化');
return originalInstantiate.apply(this, arguments);
};
实战案例
案例一:登录加密定位
// 1. 监听表单提交
document.querySelector('form').addEventListener('submit', function(e) {
console.trace('表单提交');
});
// 2. 监听密码字段变化
document.querySelector('input[type="password"]').addEventListener('input', function(e) {
console.trace('密码输入');
});
案例二:签名参数定位
// 监控URL参数变化
let originalPushState = history.pushState;
history.pushState = function() {
console.trace('URL发生变化');
return originalPushState.apply(this, arguments);
};
注意事项
-
代码完整性: 确保获取到的JavaScript代码是完整的,有些代码可能是动态加载的。
-
反调试处理: 注意网站可能有反调试机制,需要先处理这些机制。
-
加密算法变化: 某些网站会定期更换加密算法或密钥,需要持续关注。
-
环境依赖: 某些加密可能依赖特定的运行环境或外部库。
总结
定位JavaScript加密位置是一个需要耐心和技巧的过程。通过合理运用上述方法,可以更快速准确地找到关键的加密点。记住,逆向工程应该在合法和合规的前提下进行。
参考资源
如果你在实践中遇到任何问题,欢迎在评论区讨论交流。
评论