find-crypto-entry
定位加密参数 $ARGUMENTS 的生成入口。
目标:找到生成该参数的函数位置(脚本 URL + 行列号 + 函数名 + 调用路径 + 加密类型)。
策略选择
根据信号选择策略,不要按固定顺序执行:
策略 A: 请求发起栈(最快路径)
直接获取目标请求的 JS 调用栈,从栈中定位加密逻辑:
1. list_network_requests → 找到目标请求的 reqid
2. get_request_initiator(reqid) → 获取发起该请求的完整 JS 调用栈
3. 分析栈帧:跳过底层框架(axios/fetch),在中上层找业务代码
4. 在可疑帧处设断点验证
适用场景: 已知目标请求、能复现触发。这是 js-reverse-mcp 提供的最高效路径——一次调用直接拿到完整调用栈,无需手动设断点。
策略 B: 静态搜索
用 search_in_sources 搜参数名(带 excludeMinified=false)。大多数情况下直接找到赋值位置,然后读上下文追溯来源。
适用场景: 参数名是明文字符串,未被混淆。
策略 C: XHR/Fetch 断点
break_on_xhr 设在请求 URL 特征上,触发后从调用栈中找业务代码帧:
1. break_on_xhr(url_pattern) → 设置 XHR 断点
2. 触发请求(刷新页面或操作界面)
3. get_paused_info() → 获取调用栈 + 作用域变量
4. evaluate_script(expression, frameIndex) → 在指定帧检查变量
适用场景: 静态搜索无结果,需要从请求倒推。
策略 D: 函数追踪(无断点监控)
用 trace_function 追踪可疑函数的调用:
1. 通过策略 B/C 找到可疑函数位置
2. trace_function(scriptId, lineNumber) → 设置 logpoint 追踪
3. 触发请求 → 观察函数调用参数和频率
4. 不中断执行,适合追踪高频调用的加密函数
适用场景: 需要观察函数调用模式(参数、频率),或断点会影响执行流(如有反调试检测时)。
策略 E: 预注入拦截
在页面加载前注入拦截脚本,捕获加密函数调用:
1. inject_before_load(script) → 注入 Hook 脚本
2. 脚本示例:劫持 XMLHttpRequest.prototype.setRequestHeader / fetch
3. 刷新页面 → 拦截脚本在所有 JS 执行前生效
4. list_console_messages() → 读取拦截到的信息
适用场景: 加密在页面初始化阶段完成,普通断点来不及;或需要 Hook 原生 API(setRequestHeader/fetch)来全量捕获。
策略 F: WebSocket 消息分析
定位 WebSocket 协议中的加密参数:
1. get_websocket_messages() → 列出 WebSocket 连接和消息概览
2. get_websocket_messages(wsId) → 获取特定连接的消息详情
3. 分析消息模式(JSON? 二进制? Protobuf?)
4. 在 WebSocket 构造/send 处设断点追溯加密逻辑
适用场景: 目标不是 HTTP 请求而是 WebSocket 消息中的加密字段。
多策略组合: A/B/C 可以组合使用——先 A 快速获取调用栈定位范围,再 B 静态搜索确认代码,最后 D 追踪验证。
领域知识
agent 在逆向分析中容易踩的坑,这些是无法通过推理得出的经验:
加密参数的 3 种常见架构
- 业务代码直接赋值 — 在请求函数中
headers["x-sign"] = encrypt(data)。静态搜索直接找到。 - 请求拦截器统一加签 — axios interceptor 或 fetch wrapper 中统一添加。搜参数名可能只在拦截器中出现一次。
- 外部安全 SDK — 独立 JS 文件(通常混淆)挂载全局对象(如
window.h5sign),业务代码调用其方法。静态搜索能找到调用处,但 SDK 内部代码全被混淆。
OB 混淆的影响
当加密逻辑在 OB 混淆的文件中(特征:_0x 前缀、大型字符串数组、RC4 解密函数),所有字符串都被加密,静态搜索在该文件内无法匹配任何明文。但调用该文件的业务代码通常未混淆,从业务代码侧搜索更高效。
XHR 断点命中时的堆栈特点
XHR 断点命中在 send() 调用处,调用栈底部通常是框架代码(axios/fetch wrapper)。加密逻辑在栈的中上层。直接跳过底部框架帧,关注业务代码帧。
反检测环境下的注意事项
js-reverse-mcp 内置了 Patchright 反检测引擎,但某些场景仍需注意:
- 动态加密代码:部分站点的加密代码从 API 动态下发(不在页面 JS 中),需要先通过网络请求找到加密代码的下发接口。
- iframe 隔离:加密逻辑可能在 iframe 中执行。用
select_frame切换到目标 frame 再搜索/断点。 - Service Worker:签名可能在 SW 中生成。检查
list_scripts中是否有 SW 脚本。
反模式
- 不要反复 step_into — 容易掉进框架响应式系统(Vue reactivity、React fiber)。用
evaluate_script直接检查变量比单步跟踪高效得多。 - 不要在 OB 混淆文件中搜字符串 — 所有明文都被加密了,搜不到。从非混淆的调用方搜。
- 不要频繁刷新页面 — 每次刷新所有 scriptId 失效。设好断点再刷新,一次到位。
- 断点命中时优先用 evaluate_script 指定帧 — 传入
frameIndex参数可以在指定调用帧执行表达式,检查该帧的局部变量。 - 不要忽略 get_request_initiator — 这是定位加密入口最快的路径,一次调用直接获取完整 JS 调用栈,优先于手动设断点。
完成标准
找到以下信息即为完成:
入口位置:
- 参数:$ARGUMENTS
- 脚本:https://example.com/static/js/main.abc123.js
- 位置:第 X 行,第 Y 列
- 函数:functionName (或 anonymous)
- 调用路径:request → addSign → encrypt
- 加密类型:[标准算法名 | 外部SDK | WASM | VM保护 | 未知/需解混淆]
下一步建议:
- 标准算法 → /ast-deobfuscate 还原后用 Python 实现
- 外部 SDK → /env-patch 补环境运行
- WASM → /wasm-reverse 分析 WASM 模块
- VM 保护 → /env-patch 补环境 + 直接调用
只找入口,不做算法还原。