巧用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. 安全注意事项
- 仅用于授权测试:确保有合法权限
- 避免生产环境使用:调试模式会降低安全性
- 清理痕迹:测试完成后关闭调试会话
- 遵守法律法规:仅用于合法逆向工程目的
7. 工具推荐
- chrome-remote-interface:Node.js CDP客户端库
- Puppeteer:高级CDP封装
- Playwright:多浏览器自动化工具
- Selenium with CDP:结合Selenium使用CDP功能
8. 常见问题解决
8.1 连接被拒绝
- 检查Chrome是否以调试模式启动
- 验证端口是否正确
- 确保没有防火墙阻止连接
8.2 断点不生效
- 确认脚本已加载
- 检查行号是否正确
- 尝试使用
Debugger.setBreakpointByUrl
8.3 数据获取失败
- 确保在正确上下文中执行
- 检查跨域限制
- 尝试使用
Runtime.evaluate的contextId参数
这份文档涵盖了CDP在JS逆向中的核心应用,从基础配置到高级技巧,重点突出了实际逆向工程中的关键技术和解决方案。如需更详细案例,可参考原文档提供的PDF版本。