手把手js逆向断点调试&js逆向前端加密对抗&企业SRC实战分享
字数 1712 2025-08-22 12:22:15

JS逆向工程实战指南:断点调试与前端加密对抗

0x1 前言

本文旨在为安全研究人员提供全面的JS逆向工程实战指南,涵盖基础概念、调试技巧、加密算法分析以及实际漏洞挖掘案例。适合刚接触JS逆向的初学者,也包含对经验丰富的安全研究人员有价值的实战技巧。

0x2 JS逆向基础概念

作用域(Scope)

作用域决定了变量、函数和对象在代码中的可访问范围:

  1. 全局作用域

    • 在所有函数和代码块之外声明的变量
    • 示例:
      const globalVar = "我是全局变量";
      function test() {
        console.log(globalVar); // 可访问
      }
      
  2. 函数作用域

    • 在函数内部声明的变量,仅在该函数内部可访问
    • 示例:
      function test() {
        const funcVar = "我是函数内变量";
        console.log(funcVar); // 可访问
      }
      console.log(funcVar); // 报错:未定义
      
  3. 块级作用域

    • {} 包裹的代码块中用 let/const 声明的变量
    • 示例:
      if (true) {
        const blockVar = "我是块内变量";
        console.log(blockVar); // 可访问
      }
      console.log(blockVar); // 报错:未定义
      

调用堆栈(Call Stack)

调用堆栈是JavaScript引擎管理函数调用顺序的数据结构,遵循"后进先出"原则:

  • 工作原理

    1. 函数被调用时,创建"执行上下文"并压入栈顶
    2. 函数执行完毕,其执行上下文从栈顶弹出
    3. 栈顶始终是当前正在执行的函数
  • 示例

    function a() {
      console.log("a开始");
      b();
      console.log("a结束");
    }
    function b() {
      console.log("b开始");
      c();
      console.log("b结束");
    }
    function c() {
      console.log("c执行");
    }
    a();
    
  • 调用堆栈过程

    1. 执行 a()a 入栈 → 栈: [a]
    2. a 中调用 b()b 入栈 → 栈: [a, b]
    3. b 中调用 c()c 入栈 → 栈: [a, b, c]
    4. c 执行完毕 → c 出栈 → 栈: [a, b]
    5. b 执行完毕 → b 出栈 → 栈: [a]
    6. a 执行完毕 → a 出栈 → 栈: []

0x3 加密算法定位技巧

使用浏览器开发者工具

  1. XHR断点

    • 在Chrome开发者工具的"Sources"面板中设置XHR断点
    • 可拦截特定URL模式的AJAX请求
  2. DOM断点

    • 可设置在DOM元素被修改时触发断点
    • 适用于表单提交前的事件监听
  3. 事件监听器断点

    • 可设置在特定事件(如click, submit)触发时中断

常见加密特征识别

  1. AES加密特征

    • 关键词:AES, CryptoJS.AES, mode, padding
    • 典型模式:CBC, ECB
    • 常见密钥长度:128, 192, 256位
  2. RSA加密特征

    • 关键词:RSA, publicKey, privateKey, modulus, exponent
    • 常见库:jsencrypt, forge
  3. 签名校验特征

    • 关键词:sign, signature, md5, sha1, sha256
    • 常见参数:timestamp, nonce, token

0x4 实战调试技巧

断点调试流程

  1. 定位关键函数

    • 通过搜索加密参数名(如encrypt, sign)找到相关函数
    • 通过调用堆栈回溯加密过程
  2. 动态修改

    • 在断点处修改变量值测试加密逻辑
    • 可绕过某些前端校验
  3. Hook技巧

    • 覆盖原生函数如JSON.stringify, XMLHttpRequest.send
    • 示例:
      var oldSend = XMLHttpRequest.prototype.send;
      XMLHttpRequest.prototype.send = function() {
        console.log("拦截请求:", arguments);
        return oldSend.apply(this, arguments);
      };
      

微信小程序加密分析

  1. AES加密绕过

    • 定位密钥生成逻辑
    • 提取或固定IV向量
  2. RSA加密分析

    • 获取公钥生成逻辑
    • 尝试固定公钥或修改加密参数
  3. Sign签名绕过

    • 分析签名生成算法
    • 尝试重放有效签名
    • 修改时间戳等参数测试

0x5 企业SRC实战案例:商城优惠券并发漏洞

漏洞发现过程

  1. 接口分析

    • 通过抓包发现优惠券领取接口
    • 分析请求参数和加密逻辑
  2. 并发测试

    • 使用工具同时发送多个领取请求
    • 观察服务器响应和账户余额变化
  3. 结果验证

    • 确认可超额领取优惠券
    • 验证漏洞可被利用获取超额优惠

漏洞修复建议

  1. 服务端校验

    • 增加领取频率限制
    • 实现原子操作保证数据一致性
  2. 签名强化

    • 增加请求唯一性标识
    • 强化签名算法复杂度
  3. 监控机制

    • 实现异常领取行为监控
    • 设置自动告警阈值

0x6 总结

JS逆向工程需要结合扎实的JavaScript知识、熟练的调试技巧和对加密算法的理解。通过本文介绍的方法,安全研究人员可以:

  1. 有效定位前端加密逻辑
  2. 掌握实用的调试和Hook技巧
  3. 分析常见加密算法实现
  4. 应用于实际漏洞挖掘场景

建议读者通过搭建本地靶场实践所学知识,逐步提升逆向分析能力。

JS逆向工程实战指南:断点调试与前端加密对抗 0x1 前言 本文旨在为安全研究人员提供全面的JS逆向工程实战指南,涵盖基础概念、调试技巧、加密算法分析以及实际漏洞挖掘案例。适合刚接触JS逆向的初学者,也包含对经验丰富的安全研究人员有价值的实战技巧。 0x2 JS逆向基础概念 作用域(Scope) 作用域决定了变量、函数和对象在代码中的可访问范围: 全局作用域 : 在所有函数和代码块之外声明的变量 示例: 函数作用域 : 在函数内部声明的变量,仅在该函数内部可访问 示例: 块级作用域 : 由 {} 包裹的代码块中用 let / const 声明的变量 示例: 调用堆栈(Call Stack) 调用堆栈是JavaScript引擎管理函数调用顺序的数据结构,遵循"后进先出"原则: 工作原理 : 函数被调用时,创建"执行上下文"并压入栈顶 函数执行完毕,其执行上下文从栈顶弹出 栈顶始终是当前正在执行的函数 示例 : 调用堆栈过程 : 执行 a() → a 入栈 → 栈: [a] a 中调用 b() → b 入栈 → 栈: [a, b] b 中调用 c() → c 入栈 → 栈: [a, b, c] c 执行完毕 → c 出栈 → 栈: [a, b] b 执行完毕 → b 出栈 → 栈: [a] a 执行完毕 → a 出栈 → 栈: [] 0x3 加密算法定位技巧 使用浏览器开发者工具 XHR断点 : 在Chrome开发者工具的"Sources"面板中设置XHR断点 可拦截特定URL模式的AJAX请求 DOM断点 : 可设置在DOM元素被修改时触发断点 适用于表单提交前的事件监听 事件监听器断点 : 可设置在特定事件(如click, submit)触发时中断 常见加密特征识别 AES加密特征 : 关键词: AES , CryptoJS.AES , mode , padding 典型模式: CBC , ECB 常见密钥长度:128, 192, 256位 RSA加密特征 : 关键词: RSA , publicKey , privateKey , modulus , exponent 常见库: jsencrypt , forge 签名校验特征 : 关键词: sign , signature , md5 , sha1 , sha256 常见参数: timestamp , nonce , token 0x4 实战调试技巧 断点调试流程 定位关键函数 : 通过搜索加密参数名(如 encrypt , sign )找到相关函数 通过调用堆栈回溯加密过程 动态修改 : 在断点处修改变量值测试加密逻辑 可绕过某些前端校验 Hook技巧 : 覆盖原生函数如 JSON.stringify , XMLHttpRequest.send 示例: 微信小程序加密分析 AES加密绕过 : 定位密钥生成逻辑 提取或固定IV向量 RSA加密分析 : 获取公钥生成逻辑 尝试固定公钥或修改加密参数 Sign签名绕过 : 分析签名生成算法 尝试重放有效签名 修改时间戳等参数测试 0x5 企业SRC实战案例:商城优惠券并发漏洞 漏洞发现过程 接口分析 : 通过抓包发现优惠券领取接口 分析请求参数和加密逻辑 并发测试 : 使用工具同时发送多个领取请求 观察服务器响应和账户余额变化 结果验证 : 确认可超额领取优惠券 验证漏洞可被利用获取超额优惠 漏洞修复建议 服务端校验 : 增加领取频率限制 实现原子操作保证数据一致性 签名强化 : 增加请求唯一性标识 强化签名算法复杂度 监控机制 : 实现异常领取行为监控 设置自动告警阈值 0x6 总结 JS逆向工程需要结合扎实的JavaScript知识、熟练的调试技巧和对加密算法的理解。通过本文介绍的方法,安全研究人员可以: 有效定位前端加密逻辑 掌握实用的调试和Hook技巧 分析常见加密算法实现 应用于实际漏洞挖掘场景 建议读者通过搭建本地靶场实践所学知识,逐步提升逆向分析能力。