【补天白帽黑客城市沙龙-西安站】巧用Chrome-CDP远程调用Debug突破JS逆向
字数 1628 2025-08-29 08:29:41

巧用Chrome-CDP远程调用Debug突破JS逆向技术文档

1. 技术背景

Chrome DevTools Protocol (CDP) 是Chrome浏览器提供的一套远程调试协议,允许开发者通过协议接口与浏览器进行交互,实现调试、监控和控制浏览器行为的功能。

2. CDP核心功能

2.1 基础连接方式

  • WebSocket连接:通过ws://localhost:9222/devtools/page/[PAGE-ID]建立连接
  • 命令行启动:chrome --remote-debugging-port=9222
  • 常用端口:默认9222,可自定义

2.2 主要调试模块

  • DOM:获取和操作页面DOM结构
  • Network:监控网络请求
  • Debugger:JavaScript调试核心功能
  • Runtime:执行JavaScript代码
  • Page:控制页面导航和截图
  • Target:管理浏览器目标(标签页、iframe等)

3. JS逆向突破技术要点

3.1 绕过反调试技术

  1. 检测断点绕过

    • 通过CDP的Debugger.setBreakpointsActive禁用断点
    • 使用Debugger.skipAllPauses跳过所有暂停
  2. 无限debugger防护突破

    // 通过CDP执行
    Debugger.setBreakpointsActive({active: false});
    Debugger.setSkipAllPauses({skip: true});
    
  3. 时间差检测绕过

    • 使用Emulation.setVirtualTimePolicy控制虚拟时间
    • 冻结时间戳:Emulation.setVirtualTimePolicy({policy: "pause"})

3.2 动态Hook技术

  1. 函数Hook

    Debugger.setInstrumentationBreakpoint({
        instrumentation: "beforeScriptExecution"
    });
    
  2. 原型链监控

    Debugger.setBreakpointOnFunctionCall({
        objectId: prototypeObjId,
        functionName: "targetMethod"
    });
    
  3. 事件监听拦截

    DOMDebugger.setEventListenerBreakpoint({
        eventName: "click",
        targetName: "button#submit"
    });
    

3.3 内存操作技术

  1. 堆内存分析

    HeapProfiler.takeHeapSnapshot({reportProgress: true});
    
  2. 对象属性追踪

    Runtime.getProperties({
        objectId: targetObjId,
        ownProperties: true
    });
    
  3. 闭包变量提取

    Debugger.getScriptSource({scriptId: targetScriptId});
    

4. 实战应用流程

4.1 环境准备

  1. 启动Chrome调试模式:

    chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-profile
    
  2. 获取可调试页面列表:

    curl http://localhost:9222/json/list
    

4.2 基础调试流程

  1. 建立WebSocket连接
  2. 启用必要域:
    {
        "id": 1,
        "method": "Debugger.enable"
    }
    
  3. 设置断点:
    {
        "id": 2,
        "method": "Debugger.setBreakpointByUrl",
        "params": {
            "lineNumber": 123,
            "url": "https://target.com/main.js"
        }
    }
    

4.3 高级逆向技巧

  1. 函数调用追踪

    Debugger.setBreakpointOnFunctionCall({
        objectId: targetObjId,
        functionName: "encrypt"
    });
    
  2. 加密参数拦截

    Debugger.onPaused((params) => {
        const callFrames = params.callFrames;
        const scopeChain = callFrames[0].scopeChain;
        // 提取加密参数
    });
    
  3. AST修改重载

    Debugger.setScriptSource({
        scriptId: targetScriptId,
        scriptSource: modifiedScript
    });
    

5. 安全防护对抗

5.1 检测CDP连接

  • 检查navigator.webdriver属性
  • 监控window.chrome对象变化
  • 检测WebSocket连接行为

5.2 防护绕过技术

  1. 属性伪装

    Runtime.evaluate({
        expression: 'delete navigator.webdriver',
        includeCommandLineAPI: true
    });
    
  2. 行为模拟

    Input.dispatchMouseEvent({
        type: 'mouseMoved',
        x: 100,
        y: 200,
        button: 'left',
        clickCount: 1
    });
    
  3. 环境混淆

    Emulation.setUserAgentOverride({
        userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...'
    });
    

6. 工具链整合

6.1 常用工具

  • chrome-remote-interface:Node.js CDP客户端库
  • Puppeteer:高级CDP封装
  • Selenium with CDP:结合自动化测试

6.2 自定义工具开发

  1. 基础连接类

    const CDP = require('chrome-remote-interface');
    
    async function connect() {
        const client = await CDP();
        const {Debugger, Runtime} = client;
        await Debugger.enable();
        await Runtime.enable();
        return client;
    }
    
  2. 断点管理模块

    async function setBreakpoint(client, url, lineNumber) {
        const {Debugger} = client;
        return Debugger.setBreakpointByUrl({
            lineNumber,
            url
        });
    }
    
  3. 调用栈分析工具

    async function analyzeCallStack(client) {
        const {Debugger} = client;
        Debugger.paused(async (params) => {
            const callFrames = params.callFrames;
            // 分析调用关系
        });
    }
    

7. 高级应用场景

7.1 加密算法逆向

  1. 定位加密函数入口
  2. 拦截加密参数
  3. 重建加密流程

7.2 反爬虫机制突破

  1. 动态token生成分析
  2. 行为验证绕过
  3. 指纹伪装技术

7.3 混淆代码解析

  1. AST还原技术
  2. 控制流平坦化解构
  3. 字符串加密解密

8. 最佳实践

  1. 调试会话管理

    • 使用Target.attachToTarget管理多个页面
    • 通过Target.createTarget创建隔离环境
  2. 性能优化

    • 限制断点数量
    • 使用Debugger.setBreakpointsActive动态开关
    • 减少不必要的事件监听
  3. 错误处理

    client.on('error', (err) => {
        console.error('CDP连接错误:', err);
        // 重连逻辑
    });
    

9. 资源推荐

  1. 官方文档

    • Chrome DevTools Protocol Viewer
    • Puppeteer API文档
  2. 开源工具

    • chrome-remote-interface
    • PyChromeDevTools
    • CDP4J
  3. 进阶学习

    • V8引擎调试接口
    • WebAssembly调试技术
    • 浏览器安全模型

本技术文档涵盖了使用Chrome CDP进行JS逆向的核心技术要点,从基础连接到高级逆向技巧,为安全研究人员提供了完整的解决方案。实际应用中需注意法律合规性,仅用于授权测试场景。

巧用Chrome-CDP远程调用Debug突破JS逆向技术文档 1. 技术背景 Chrome DevTools Protocol (CDP) 是Chrome浏览器提供的一套远程调试协议,允许开发者通过协议接口与浏览器进行交互,实现调试、监控和控制浏览器行为的功能。 2. CDP核心功能 2.1 基础连接方式 WebSocket连接:通过 ws://localhost:9222/devtools/page/[PAGE-ID] 建立连接 命令行启动: chrome --remote-debugging-port=9222 常用端口:默认9222,可自定义 2.2 主要调试模块 DOM :获取和操作页面DOM结构 Network :监控网络请求 Debugger :JavaScript调试核心功能 Runtime :执行JavaScript代码 Page :控制页面导航和截图 Target :管理浏览器目标(标签页、iframe等) 3. JS逆向突破技术要点 3.1 绕过反调试技术 检测断点绕过 : 通过CDP的 Debugger.setBreakpointsActive 禁用断点 使用 Debugger.skipAllPauses 跳过所有暂停 无限debugger防护突破 : 时间差检测绕过 : 使用 Emulation.setVirtualTimePolicy 控制虚拟时间 冻结时间戳: Emulation.setVirtualTimePolicy({policy: "pause"}) 3.2 动态Hook技术 函数Hook : 原型链监控 : 事件监听拦截 : 3.3 内存操作技术 堆内存分析 : 对象属性追踪 : 闭包变量提取 : 4. 实战应用流程 4.1 环境准备 启动Chrome调试模式: 获取可调试页面列表: 4.2 基础调试流程 建立WebSocket连接 启用必要域: 设置断点: 4.3 高级逆向技巧 函数调用追踪 : 加密参数拦截 : AST修改重载 : 5. 安全防护对抗 5.1 检测CDP连接 检查 navigator.webdriver 属性 监控 window.chrome 对象变化 检测WebSocket连接行为 5.2 防护绕过技术 属性伪装 : 行为模拟 : 环境混淆 : 6. 工具链整合 6.1 常用工具 chrome-remote-interface :Node.js CDP客户端库 Puppeteer :高级CDP封装 Selenium with CDP :结合自动化测试 6.2 自定义工具开发 基础连接类 : 断点管理模块 : 调用栈分析工具 : 7. 高级应用场景 7.1 加密算法逆向 定位加密函数入口 拦截加密参数 重建加密流程 7.2 反爬虫机制突破 动态token生成分析 行为验证绕过 指纹伪装技术 7.3 混淆代码解析 AST还原技术 控制流平坦化解构 字符串加密解密 8. 最佳实践 调试会话管理 : 使用 Target.attachToTarget 管理多个页面 通过 Target.createTarget 创建隔离环境 性能优化 : 限制断点数量 使用 Debugger.setBreakpointsActive 动态开关 减少不必要的事件监听 错误处理 : 9. 资源推荐 官方文档 : Chrome DevTools Protocol Viewer Puppeteer API文档 开源工具 : chrome-remote-interface PyChromeDevTools CDP4J 进阶学习 : V8引擎调试接口 WebAssembly调试技术 浏览器安全模型 本技术文档涵盖了使用Chrome CDP进行JS逆向的核心技术要点,从基础连接到高级逆向技巧,为安全研究人员提供了完整的解决方案。实际应用中需注意法律合规性,仅用于授权测试场景。