X-hub

JavaScript逆向工程:如何快速定位加密位置

详细介绍在JavaScript逆向分析中快速定位加密点的各种方法和技巧,包括控制台分析、断点调试、堆栈跟踪等

JavaScript逆向工程:如何快速定位加密位置

在进行JavaScript逆向工程时,定位加密位置是一个关键步骤。本文将介绍几种实用的方法来帮助你快速准确地找到关键的加密点。

基础准备工作

在开始定位加密位置之前,需要做以下准备:

  1. 安装好Chrome开发者工具
  2. 熟悉Network面板的使用
  3. 了解Sources面板的基本操作
  4. 掌握Console面板的调试技巧

常用定位方法

1. 请求分析法

这是最基本也是最常用的方法:

  1. 打开开发者工具的Network面板
  2. 勾选"Preserve log"选项
  3. 清空现有请求记录
  4. 执行目标操作(如登录、搜索等)
  5. 分析新产生的请求,找到包含加密参数的请求
// 示例:在请求中找到的加密参数
{
    "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进行抓包:

  1. 设置HTTPS抓包
  2. 对比请求前后的数据变化
  3. 分析加密参数的生成规律

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面板分析函数调用链:

  1. 开启Performance记录
  2. 执行目标操作
  3. 停止记录并分析调用栈
  4. 找出可疑的函数调用

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);
};

注意事项

  1. 代码完整性: 确保获取到的JavaScript代码是完整的,有些代码可能是动态加载的。

  2. 反调试处理: 注意网站可能有反调试机制,需要先处理这些机制。

  3. 加密算法变化: 某些网站会定期更换加密算法或密钥,需要持续关注。

  4. 环境依赖: 某些加密可能依赖特定的运行环境或外部库。

总结

定位JavaScript加密位置是一个需要耐心和技巧的过程。通过合理运用上述方法,可以更快速准确地找到关键的加密点。记住,逆向工程应该在合法和合规的前提下进行。

参考资源

如果你在实践中遇到任何问题,欢迎在评论区讨论交流。

评论