巧用Chrome-CDP远程调用Debug突破JS逆向
字数 1097
更新时间 2025-08-22 12:23:42

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

1. CDP (Chrome DevTools Protocol) 基础

1.1 什么是CDP

  • Chrome DevTools Protocol (CDP) 是Chrome浏览器提供的远程调试协议
  • 允许开发者通过HTTP/WebSocket接口与浏览器实例交互
  • 提供对DOM、网络、性能、JavaScript调试等功能的控制

1.2 CDP核心功能

  • DOM操作:获取、修改页面DOM结构
  • 网络监控:拦截、修改网络请求
  • JavaScript调试:断点设置、变量查看、调用栈追踪
  • 执行环境控制:注入JS代码、修改执行上下文

2. 远程调试配置

2.1 启动Chrome调试模式

chrome.exe --remote-debugging-port=9222 --user-data-dir=remote-profile
  • --remote-debugging-port:指定调试端口
  • --user-data-dir:指定用户数据目录(避免影响主配置)

2.2 获取调试目标

访问 http://localhost:9222/json 获取可调试页面列表

{
  "description": "",
  "devtoolsFrontendUrl": "/devtools/inspector.html?ws=localhost:9222/devtools/page/FA7FAB6A4B789E8B3A4C5D6E7F8A9B0",
  "id": "FA7FAB6A4B789E8B3A4C5D6E7F8A9B0",
  "title": "Example Page",
  "type": "page",
  "url": "https://example.com",
  "webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/FA7FAB6A4B789E8B3A4C5D6E7F8A9B0"
}

3. CDP在JS逆向中的应用

3.1 绕过反调试

  • 方法1:通过CDP覆盖调试检测函数
Page.addScriptToEvaluateOnNewDocument({
  source: `
    window.console.debug = () => {};
    Object.defineProperty(window, 'debugger', {get: () => {}});
  `
});
  • 方法2:禁用断点触发
Debugger.setSkipAllPauses({ skip: true });

3.2 动态Hook函数

Debugger.setBreakpointByUrl({
  lineNumber: 123,
  url: "https://example.com/script.js"
});

Debugger.pauseOnAsyncCall({
  parentStackTraceId: "..."
});

3.3 内存数据提取

Runtime.evaluate({
  expression: "window.sensitiveData",
  returnByValue: true
});

4. 实战案例:突破加密参数

4.1 定位加密函数

Debugger.searchInContent({
  scriptId: "...",
  query: "encrypt"
});

4.2 设置断点并提取参数

Debugger.setBreakpoint({
  location: {
    scriptId: "...",
    lineNumber: 456
  }
});

Debugger.on("paused", (event) => {
  const callFrames = event.callFrames;
  const localScope = callFrames[0].scopeChain[0];
  
  Runtime.getProperties({
    objectId: localScope.object.objectId
  }).then((result) => {
    console.log("Local variables:", result);
  });
});

4.3 修改函数行为

Runtime.evaluate({
  expression: `
    window.originalEncrypt = window.targetFunction;
    window.targetFunction = function(params) {
      console.log("Intercepted params:", params);
      return window.originalEncrypt(params);
    }
  `
});

5. 高级技巧

5.1 网络请求拦截

Network.setRequestInterception({
  patterns: [{
    urlPattern: "*",
    resourceType: "XHR",
    interceptionStage: "HeadersReceived"
  }]
});

Network.on("requestIntercepted", (event) => {
  Network.getResponseBodyForInterception({
    interceptionId: event.interceptionId
  }).then((response) => {
    console.log("Intercepted response:", response);
  });
});

5.2 DOM事件监听

DOMDebugger.setInstrumentationBreakpoint({
  eventName: "click"
});

DOMDebugger.on("instrumentationBreakpoint", (event) => {
  console.log("DOM event intercepted:", event);
});

5.3 性能分析

Profiler.start();
// 执行操作...
Profiler.stop().then((profile) => {
  console.log("CPU profile:", profile);
});

6. 安全注意事项

  1. 仅用于授权测试:确保有合法权限
  2. 避免生产环境使用:调试模式会降低安全性
  3. 清理痕迹:测试完成后关闭调试会话
  4. 遵守法律法规:仅用于合法逆向工程目的

7. 工具推荐

  1. chrome-remote-interface:Node.js CDP客户端库
  2. Puppeteer:高级CDP封装
  3. Playwright:多浏览器自动化工具
  4. Selenium with CDP:结合Selenium使用CDP功能

8. 常见问题解决

8.1 连接被拒绝

  • 检查Chrome是否以调试模式启动
  • 验证端口是否正确
  • 确保没有防火墙阻止连接

8.2 断点不生效

  • 确认脚本已加载
  • 检查行号是否正确
  • 尝试使用Debugger.setBreakpointByUrl

8.3 数据获取失败

  • 确保在正确上下文中执行
  • 检查跨域限制
  • 尝试使用Runtime.evaluatecontextId参数

这份文档涵盖了CDP在JS逆向中的核心应用,从基础配置到高级技巧,重点突出了实际逆向工程中的关键技术和解决方案。如需更详细案例,可参考原文档提供的PDF版本。

相似文章
相似文章
 全屏