【补天白帽黑客城市沙龙-西安站】巧用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 绕过反调试技术
-
检测断点绕过:
- 通过CDP的
Debugger.setBreakpointsActive禁用断点 - 使用
Debugger.skipAllPauses跳过所有暂停
- 通过CDP的
-
无限debugger防护突破:
// 通过CDP执行 Debugger.setBreakpointsActive({active: false}); Debugger.setSkipAllPauses({skip: true}); -
时间差检测绕过:
- 使用
Emulation.setVirtualTimePolicy控制虚拟时间 - 冻结时间戳:
Emulation.setVirtualTimePolicy({policy: "pause"})
- 使用
3.2 动态Hook技术
-
函数Hook:
Debugger.setInstrumentationBreakpoint({ instrumentation: "beforeScriptExecution" }); -
原型链监控:
Debugger.setBreakpointOnFunctionCall({ objectId: prototypeObjId, functionName: "targetMethod" }); -
事件监听拦截:
DOMDebugger.setEventListenerBreakpoint({ eventName: "click", targetName: "button#submit" });
3.3 内存操作技术
-
堆内存分析:
HeapProfiler.takeHeapSnapshot({reportProgress: true}); -
对象属性追踪:
Runtime.getProperties({ objectId: targetObjId, ownProperties: true }); -
闭包变量提取:
Debugger.getScriptSource({scriptId: targetScriptId});
4. 实战应用流程
4.1 环境准备
-
启动Chrome调试模式:
chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-profile -
获取可调试页面列表:
curl http://localhost:9222/json/list
4.2 基础调试流程
- 建立WebSocket连接
- 启用必要域:
{ "id": 1, "method": "Debugger.enable" } - 设置断点:
{ "id": 2, "method": "Debugger.setBreakpointByUrl", "params": { "lineNumber": 123, "url": "https://target.com/main.js" } }
4.3 高级逆向技巧
-
函数调用追踪:
Debugger.setBreakpointOnFunctionCall({ objectId: targetObjId, functionName: "encrypt" }); -
加密参数拦截:
Debugger.onPaused((params) => { const callFrames = params.callFrames; const scopeChain = callFrames[0].scopeChain; // 提取加密参数 }); -
AST修改重载:
Debugger.setScriptSource({ scriptId: targetScriptId, scriptSource: modifiedScript });
5. 安全防护对抗
5.1 检测CDP连接
- 检查
navigator.webdriver属性 - 监控
window.chrome对象变化 - 检测WebSocket连接行为
5.2 防护绕过技术
-
属性伪装:
Runtime.evaluate({ expression: 'delete navigator.webdriver', includeCommandLineAPI: true }); -
行为模拟:
Input.dispatchMouseEvent({ type: 'mouseMoved', x: 100, y: 200, button: 'left', clickCount: 1 }); -
环境混淆:
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 自定义工具开发
-
基础连接类:
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; } -
断点管理模块:
async function setBreakpoint(client, url, lineNumber) { const {Debugger} = client; return Debugger.setBreakpointByUrl({ lineNumber, url }); } -
调用栈分析工具:
async function analyzeCallStack(client) { const {Debugger} = client; Debugger.paused(async (params) => { const callFrames = params.callFrames; // 分析调用关系 }); }
7. 高级应用场景
7.1 加密算法逆向
- 定位加密函数入口
- 拦截加密参数
- 重建加密流程
7.2 反爬虫机制突破
- 动态token生成分析
- 行为验证绕过
- 指纹伪装技术
7.3 混淆代码解析
- AST还原技术
- 控制流平坦化解构
- 字符串加密解密
8. 最佳实践
-
调试会话管理:
- 使用
Target.attachToTarget管理多个页面 - 通过
Target.createTarget创建隔离环境
- 使用
-
性能优化:
- 限制断点数量
- 使用
Debugger.setBreakpointsActive动态开关 - 减少不必要的事件监听
-
错误处理:
client.on('error', (err) => { console.error('CDP连接错误:', err); // 重连逻辑 });
9. 资源推荐
-
官方文档:
- Chrome DevTools Protocol Viewer
- Puppeteer API文档
-
开源工具:
- chrome-remote-interface
- PyChromeDevTools
- CDP4J
-
进阶学习:
- V8引擎调试接口
- WebAssembly调试技术
- 浏览器安全模型
本技术文档涵盖了使用Chrome CDP进行JS逆向的核心技术要点,从基础连接到高级逆向技巧,为安全研究人员提供了完整的解决方案。实际应用中需注意法律合规性,仅用于授权测试场景。