find-crypto-entry
定位加密参数 $ARGUMENTS 的生成入口。
输出目标:入口位置(脚本URL + 行号/列号 + 函数名)
执行流程
Step 0: 网络请求定位(首选)⭐
最高效路径,直接获取已发生请求的调用栈:
- •
list_network_requests({ resourceTypes: ["xhr", "fetch"] })- 列出请求 - •
get_network_request(reqid)- 确认 $ARGUMENTS 参数位置(URL/Header/Body) - •
get_request_initiator(requestId)- 直接获取 JS 调用栈
结果判断:
- •✅ 调用栈有效 → 跳到 Step 3
- •❌ 调用栈为空或无意义 → 继续 Step 1
Step 1: 静态搜索
当 Step 0 无法定位时,进行静态分析:
- •
search_in_sources({ query: "$ARGUMENTS" })- 搜索加密参数名 - •
分流逻辑:
- •结果 ≤ 50:检查赋值语句(如
headers.$ARGUMENTS = ...) - •结果 > 50:转向搜索拦截器特征:
- •
interceptors.request.use - •
XMLHttpRequest.prototype.send - •
window.fetch =
- •
- •结果 ≤ 50:检查赋值语句(如
- •
find_in_script(scriptId, query)- 获取精确行号列号
结果判断:
- •✅ 找到明确赋值位置 → 跳到 Step 4
- •❌ 结果太多或无法确定 → 继续 Step 2
Step 2: 动态断点
静态搜索无法锁定时,设置断点:
方案 A(推荐):
code
set_breakpoint_on_text({ text: "$ARGUMENTS", urlFilter: "main" })
方案 B:
code
break_on_xhr({ url: "api关键词" })
⚠️ 提示用户:请在浏览器中触发包含 $ARGUMENTS 参数的请求
结果判断:
- •✅ 断点命中 → 继续 Step 3
- •❌ 断点未命中 → 检查断点条件是否正确,或尝试其他方案
Step 3: 堆栈分析
获取调用栈后,执行灰名单过滤:
code
get_paused_info({ includeScopes: true })
过滤规则:
| 级别 | 特征 | 动作 |
|---|---|---|
| Level 1 跳过 | axios, react-dom, vue, jquery, webpack/runtime | 框架噪声,跳过 |
| Level 2 检查 | 含 security, encrypt, auth, fingerprint 的 node_modules | 可疑安全SDK,检查 |
| Level 3 优先 | 非 node_modules(/src/, /app/) | 业务代码,优先检查 |
结果判断:
- •✅ 找到可疑帧 → 继续 Step 4
- •❌ 全是框架代码 → 返回 Step 2 尝试其他断点位置
Step 4: 确认入口
在可疑帧上验证:
code
evaluate_on_callframe({
expression: "arguments",
frameIndex: 0
})
寻找加密特征:
- •位运算:
^,&,|,>>> - •魔法常量:
0x67452301(MD5),0x6a09e667(SHA256)
结果判断:
- •✅ 确认是加密入口 → 输出结果
- •❌ 不是加密逻辑 → 检查调用栈上一帧,或返回 Step 3 检查其他帧
输出格式
找到入口后,输出:
code
入口位置: - 参数:$ARGUMENTS - 脚本:https://example.com/static/js/main.abc123.js - 位置:第 1 行,第 45678 列 - 函数:anonymous (或具体函数名) - 调用路径:request → addSign → encrypt
注意事项
- •优先使用
get_request_initiator- 无需断点,最高效 - •优先使用
set_breakpoint_on_text- 对压缩代码友好 - •只找入口,不做算法还原 - 保持 skill 单一职责
- •每个 Step 失败后有明确跳转 - 避免卡住