【免费下载链接】AI_JS_DEBUGGER
基于Chrome开发者协议(CDP)的AI自动化JavaScript逆向分析工具
AI_JS_DEBUGGER 是一款基于 Chrome 开发者协议(CDP)的 AI 自动化 JavaScript 逆向分析工具,它能把"断点触发 → 收集上下文 → 大模型决策 → 执行步调"做成一个全自动调试循环,由大模型在每一步自动选择单步入(step_into)、单步出(step_out)或单步跳过(step_over),最终自动产出加解密分析报告。这篇文章带你深入拆解这套 AI 调试循环的工作原理。
一、手动单步调试有多痛苦?
做前端 JS 逆向时,常规姿势是:打断点 → 在 DevTools 里手动点"单步跳过/单步进入"按钮 → 一路盯着变量 → 关键参数(如加密密钥 key、iv)一闪而过就错过了。
痛点很直观:
| 手动调试的痛点 | AI_JS_DEBUGGER 的解法 |
|---|---|
| 不知道该步入还是步过,容易钻进无关函数 | 大模型根据代码语义自动决策步调 |
| 人工盯变量,容易漏掉 key/iv 等关键值 | 每次暂停自动抓取作用域变量喂给模型 |
| 陷入混淆代码/循环出不来 | 内置"嵌套过深就 step_out"的决策规则 |
| 调试完还要人工整理结论 | 自动汇总日志并生成 Markdown 分析报告 |
核心思路一句话:把"人肉点单步按钮"这件事,交给大模型 + CDP 协议来做。
二、整体架构:三层协作的调试循环
整个循环由三部分组成,源码入口都在仓库里可以找到:
- CDP 客户端层:CDPClient 封装了与 Chrome/Edge 的通信,负责启动/连接浏览器、注入 Hook 脚本、发送 CDP 命令(下断点、单步、取变量等)。
- 调试循环调度层:continuous_debugging() 是整个 AI 调试循环的主函数,文档注释写得很清楚——"通过AI分析断点处的代码和变量状态,自动决定下一步调试操作(步入、步出或步过)"。
- AI 决策层:AIManager.get_debug_instruction() 把调试信息打包成 Prompt 发给大模型(兼容 OpenAI 格式,Qwen、DeepSeek、GPT、Claude 等均可),解析模型返回的 JSON 指令。
循环骨架非常简洁(对应 debugging_loop()):
- 等待断点触发(
Debugger.paused事件) - 收集断点处的调试信息(调用堆栈 + 代码上下文 + 作用域变量)
- AI 分析并返回下一步操作指令
- 执行 AI 决定的 CDP 步调命令
- 重复,直到超时或出错
下面按这个顺序逐层拆解。
三、第一步:断点暂停,收集"调试上下文"
断点触发后,真正干活的是 process_debugger_paused(),它负责把一次暂停"翻译"成大模型能读懂的文本。收集内容包括:
- 暂停位置:函数名、脚本 URL、行列号;
- 代码上下文:由 get_code_context() 截取断点前后约 150 字符(可通过
debug.context_chars配置),并在当前位置插入➤标记,让模型一眼看到"执行到哪了"; - 调用堆栈:最多 3~5 帧(内存紧张时自动降级),避免上下文爆炸;
- 作用域变量:通过
Runtime.getProperties递归抓取局部/块级作用域,带多重过滤——跳过window、DOM 节点、函数等噪音,优先保留key、iv、token、data等加密相关属性名; - 混淆检测:detect_jsvmp_patterns() 会静态分析当前脚本,识别大量 switch-case、密集数组访问、eval/Function 等 JSVMP 特征,并把"建议用 step_over 而非 step_into 减少进入混淆代码"这样的提示直接写进上下文——这等于给大模型递了一份"作弊小抄"。
所有信息压缩成一段纯文本后写入调试会话文件,同时作为本轮的 AI 输入。一个工程细节:如果压缩后的调试信息超过 100KB,会按 50KB 分片并只取前两个分片(见 ai_debugger.py#L326-L334),防止超长大模型窗口。
四、第二步:大模型的"决策大脑"
这是全文最核心的一环。AI_JS_DEBUGGER 通过 get_debug_instruction() 向大模型提问,构造的 messages 分三部分:
- 系统提示词:定义角色(JavaScript 逆向分析专家)和三个可选动作;
- 历史上下文:用一个容量为 3 的 deque 记录最近 3 次暂停的上下文摘要,随请求一起带上,让模型具备"短期记忆",避免对同一段代码反复做出相同决策;
- 当前调试信息:即第三步收集的压缩上下文。
提示词本身也经过精心设计,写在 config.yaml 的prompts.debug里,可自由修改。它告诉模型重点识别这些加密线索:
- 函数名含
encrypt/decrypt/AES/RSA/MD5/SHA/Crypto等关键词; - JS 特有加密手段:
btoa/atob、TextEncoder、crypto.subtle; - 位运算加密:XOR(
^)、位移(<<、>>)、按位与或; - 网络请求函数:
fetch/XMLHttpRequest/axios/getSign/getToken等; - 主流加密库:CryptoJS、WebCrypto、jsencrypt、sjcl 等;
- 混淆特征:eval/Function 动态执行、控制流扁平化、单字符变量名。
并且给出了精确决策规则,例如:
- step_over:首次遇到加密函数调用或 eval/Function 动态代码
- step_over:在加密函数内部的非核心步骤或复杂混淆代码
- step_out:嵌套超过 3 层或陷入重复循环时
模型的输出被强约束为 JSON 格式,且三个操作中只能有一个为true:
{ "step_into": false, "step_out": false, "step_over": true, "reason": "当前处于混淆的 switch 分支,避免深入" }解析逻辑做了双重保险(ai_manager.py#L124-L138):优先按 JSON 解析;如果模型返回的不是合法 JSON,就退化成对返回文本做关键词匹配;任何情况下出错都兜底返回step_over——宁可保守地"跳过一行",也不让循环卡死。
五、第三步:指令映射为 CDP 单步命令
拿到instruction后,调度层做一次简单的字符串匹配,映射到 CDP 协议命令(ai_debugger.py#L356-L361):
| 大模型指令 | CDP 命令 | 行为 |
|---|---|---|
包含step_into | Debugger.stepInto | 步入函数内部 |
包含step_out | Debugger.stepOut | 步出当前函数 |
| 其他 | Debugger.stepOver | 执行当前行,停在下一行 |
执行时会检查浏览器是否仍处于暂停状态(错误信息含while paused则跳过本次步调),每次步调结果都会通过 WebSocket 推送到 Web 界面,你可以实时观察 AI 的每一次"走位"。
值得一提的是,这套步调能力同时开放给了人工接管:Web 界面背后是 step-into / step-out / continue 三个 REST 接口,AI 自动循环和手动单步共用同一套 CDP 通道,随时可以"人机切换"。
六、闭环收尾:超时退出与自动出报告
循环并非无限运转,内置了两道保险:
- 暂停超时:首次等待断点给 60 秒,之后每次 30 秒(ai_debugger.py#L218-L228)。长时间没触发断点即视为调试结束;
- 总时长上限:整个调试任务包在
asyncio.wait_for中,默认 600 秒封顶。
一旦结束,收尾流程自动完成三件事:
- 把 Hook 脚本捕获的
[debug]日志(AES/RSA 等加解密的 key/密文/明文)追加写入调试会话文件(ai_debugger.py#L384-L403); - 调用 debugger_analyze() 把完整调试数据交给"分析模型"(长上下文模型优先),生成 Markdown 分析报告;
- 报告落盘到
result/report/目录,可通过 Web 界面管理,例如仓库中的示例报告 analysis-2025-11-17-17-15-40.md——其中不仅还原了 AES-CBC 加解密逻辑和硬编码密钥,还直接附了一段可用的 mitmproxy 解密脚本。
至此,"断点 → 上下文 → 模型决策 → 单步执行 → 报告"的完整闭环打通,全程无需人工点击任何单步按钮。
七、快速上手与调优建议
启动项目(Python 3.11+,需 Chrome/Edge 与一个兼容 OpenAI 格式的大模型 API Key):
git clone https://gitcode.com/gh_mirrors/ai/AI_JS_DEBUGGER cd AI_JS_DEBUGGER pip install -r requirements.txt python3 run_flask.py然后访问http://localhost:5001,在 Web 界面选择断点模式(固定 JS 文件断点或 XHR 请求断点)、配置模型即可开始。
几条实用建议:
- 模型选择:决策环节每次只处理压缩后的上下文,小快模型(如 qwen-turbo、gpt-mini 级)就够用且省成本;分析报告环节可单独指定长上下文模型,两者在 config.yaml 中分开配置;
- 断点选不好?用 XHR 模式,系统会自动回溯顶层调用堆栈并重新下断点,省去"找不到断点位置"的烦恼;
- 想改 AI 的"性格":直接编辑
prompts.debug里的决策规则,比如把"嵌套超过 3 层才 step_out"改成更激进的阈值; - 压缩成一行 JS 怎么断点:取消浏览器 JS 美化后查看断点行列号(行数一般为 0),FAQ 里有详细说明(见 README.md)。
八、总结
AI_JS_DEBUGGER 的调试循环设计得非常"工程化":
- 上下文采集有边界——限制堆栈帧数、变量属性数、分片截断,喂给模型的是"高信噪比"信息;
- 决策有强约束——JSON 输出格式 + 明确的决策规则 + 三级降级解析,出错永远兜底
step_over; - 循环有保险丝——暂停超时 + 总时长上限,绝不失控;
- 结果可沉淀——每轮调试自动产出可复用的分析报告和 mitmproxy 脚本。
对新手而言,这套循环相当于一个会看 DevTools 的"副驾驶":你只负责下好断点,剩下的步入、步出、步过,交给大模型。这也是"AI + CDP"结合在 JS 逆向场景里一个相当成熟的落地范式。
【免费下载链接】AI_JS_DEBUGGER
基于Chrome开发者协议(CDP)的AI自动化JavaScript逆向分析工具
相关推荐
如何用FreeSimpleGUI在5分钟内创建你的第一个Python桌面应用
如何用FreeSimpleGUI在5分钟内创建你的第一个Python桌面应用 想要快速为Python脚本添加图形界面?FreeSimpleGUI正是你需要的终极
桌面应用UI组件跨平台剖析TrustClaw智能体核心:ToolLoopAgent如何驱动100步工具调用循环
剖析TrustClaw智能体核心:ToolLoopAgent如何驱动100步工具调用循环 TrustClaw 是一个可自托管的个人 AI 智能体(AI Agen
Wing 异步模型与隐式 await:inflight 函数如何自动等待异步调用
Wing 异步模型与隐式 await:inflight 函数如何自动等待异步调用 导读 Wing 语言采用 preflight / inflight 双阶段执行
编程语言编译器云原生语言运行时
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考