5.2 KiB
name, description, metadata
| name | description | metadata | ||
|---|---|---|---|---|
| js-reverse-automation | 通过 chrome-devtools-mcp 连接真实浏览器,自动定位前端加密入口,生成 JSRPC 注入代码、Flask 代理和 Burp autoDecoder 对接文档。 |
|
JS 逆向自动化
通过 JSRPC 与真实浏览器完成前端加密入口定位、运行时取证、对抗分析、验证和工程化交付。浏览器连接、文档身份和 action 级结果必须形成可复核证据链。
适用场景
- 登录/注册页面密码加密
- API 请求签名
- 表单字段加密
- 响应数据解密
输入格式
Target URL: https://xxx/login
Parameters To Analyze: password
Optional Fetch Example: fetch("https://xxx/api/login", {...})
核心流程
- 预分析 Fetch Example(如果有)→ 提取加密算法、参数格式、目标 URL
- 打开页面 → 注入 Hook → 触发目标动作
- 捕获网络请求 → 定位加密函数
- 注册 JSRPC → 生成 Flask/Burp 产物
- 验证输出 → 按标准最终交付格式输出完整结果
遇到反调试、反 Hook、JSVMP、动态 Cookie、环境型签名或动态加载时,先生成并运行 adversarial_runtime_probe.js;只有观察到明确对抗信号后,才使用 --mode intervene 或源码级插桩。
详细工作流
详见 workflow/pipeline.md
对抗与验证能力
- 对抗运行时探针:反调试、完整性检查、环境属性、动态代码、响应链、Worker/WebSocket/WASM/iframe 加载事件。
- 持久 Hook:页面重新赋值后自动检测丢失并尝试恢复;所有 Patch 可通过
uninstall()回滚。 - Hook 组合:对抗探针与运行时加密探针共享
__JSRA_HOOK_REGISTRY__,同一 API 采用可卸载的分层包装,外部替换只触发一次重建。 - 安全证据:原始捕获采用有界循环引用安全快照,避免 CryptoJS/JSEncrypt 对象导致导出失败。
- 浏览器会话契约:注入、调用和导航绑定到当前 tab/document;断线、超时、暂停或导航后不复用旧引用,避免把未知状态误报成成功。
- 控制流观测:可选观察控制台清理、历史导航、存储访问和关闭页面等干扰信号;只有明确启用干预模式时才阻止受控动作,默认不改变业务行为。
- 源码级保守插桩:针对明确选择的简单属性读取生成 tap,不默认改写全量代码。
- 对抗差分:比较基线与干预后的事件、请求、错误和新增证据;差分报告不等于目标已被绕过。
- 完整交付:标准 JSRPC 产物在调用期间捕获最终
fetch/XHR网络请求,返回明文、最终 route、密文/签名请求体、HTTP 状态和业务响应;最终结果同时保留分析结果、验证表、可复制命令、关闭命令、Burp autoDecoder 配置和生成产物;对抗信息作为补充证据追加。 - 能力边界:验证码、WebAuthn、设备证明、跨域隔离 Realm 和未导出的 WASM 内部函数仍需保留为人工或 unsupported 路径。
交付前强制检查
生成 Flask 代理后必须执行:
python3 scripts/check_delivery_contract.py \
--proxy generated/flask_proxy.py \
--output artifacts/delivery_contract.json
该检查必须同时通过 JSRPC 地址归一化、Burp application/octet-stream 完整报文、Content-Length 重建和 dataBody wrapper 四项回归。jsrpc.base_url 可以填写 http://127.0.0.1:12080 或 http://127.0.0.1:12080/go,生成器必须保证最终只请求一次 /go。
端口监听不等于 JSRPC 可用。最终报告前还必须使用真实浏览器执行 action 级 smoke test,并确认返回 plaintext、最终 route、非空 requestBody、HTTP 状态和业务响应;/list 无 action、/go 返回 400 或 Flask 返回 502 时,不得写“Flask 代理验证通过”。
将 action 级结果保存后执行:
python3 scripts/validate_browser_evidence.py \
--input artifacts/jsrpc_smoke.json \
--output artifacts/browser_evidence.json
如果同时保存了浏览器桥接状态、tabId 和当前 documentId,再增加 --require-session。超时、断线、待恢复或文档身份变化只能标记为未确认,不能通过重放旧请求来补证据。
Burp 整包模式必须支持外层 Content-Type: application/octet-stream,从内层 HTTP 报文识别真实 Content-Type,返回完整改写报文;请求/响应方向仍每次只能选择一个,解密接口和加密接口可以同时配置。
约束规则
详见 constraints/rules.md
参考资料(按需加载)
- 反调试:
references/antidebug-patterns.md - 复杂入口:
references/advanced-entrypoints.md - 证据收集:
references/evidence-collection.md - 能力边界:
references/capability-boundaries.md - 输出契约:
references/output-contract.md - 最终报告模板:
references/final-report-template.md - 对抗运行时:
references/adversarial-runtime.md - 浏览器会话与证据:
references/browser-session-contract.md
Token 预算
- 单次调用:50,000 token
- 最大工具调用:20 次
- 停止条件:找到入口并验证通过 / 所有降级策略失败 / Token 预算耗尽