web-reverse
Installation
SKILL.md
Web Reverse Engineering Skill (WEB)
核心原则:先定级再工具链;先事实后推断;先脱壳再分析;中文报告必须交付。
§ 目标与触发
- 本技能用于 Web前端逆向与签名/加密复现。
- 触发场景见前置 description;不满足则不要触发。
§ 任务输入(缺失即补充)
必须收集四字段:target、objective、requirements、boundaries。
通用字段
| 字段 | 说明 |
|---|---|
target |
URL 或文件路径;类型:WEB |
objective |
密钥恢复 / 认证绕过 / 协议重建 / API签名逆向 / CTF flag / WASM反虚化 / JS-VM反虚化 |
requirements |
深度:quick / standard / deep;输出格式;时间预算 |
boundaries |
主动触发 Y/N;速率限制;禁止操作 |
WEB 专属字段
| 字段 | 说明 |
|---|---|
url scope |
基础URL、页面列表、登录态、所需角色 |
interface scope |
目标API端点、HTTP方法/路径、API版本 |
runtime constraints |
主动触发 Y/N;速率限制;禁止操作 |
evidence requirements |
Headers Y/N;载荷样本 Y/N;时序瀑布 Y/N;token/cookie溯源 Y/N |
js protection type |
仅压缩 / 变量重命名 / 字符串加密 / CFG扁平化 / ob-fuscator.io / JSFuck / eval-pack / JS-VMP / 自定义VM / 未知 |
bundle system |
Webpack / Vite / Rollup / Parcel / Browserify / ESBuild / 未知 |
wasm present |
Y/N;如Y:独立.wasm / emscripten / wasm-pack / AssemblyScript |
source map available |
Y/N;内嵌 / 外部.map / Header中隐藏 |
anti-debug in browser |
DevTools检测 Y/N;时序检测 Y/N;debugger语句 Y/N |
CTF 专属字段
| 字段 | 说明 |
|---|---|
CTF type |
web / crypto / rev |
flag format |
FLAG{...} / CTF{...} / 自定义正则 |
known hints |
题目描述/提示 |
solver output |
flag字符串 / 可用exploit / 签名重放脚本 |
§ 安全与授权边界
- 仅在授权范围内逆向分析;不越权、不扩域。
- 禁止执行payload样本、触发在线漏洞利用、在沙箱外导出凭证。
- 外部平台/环境权限边界必须请求确认。
§ 输出要求(强制)
- 必须产出:
web_replay.js、Reverse_Report_CN.md。 - 视情况追加:
deobf_clean.js、vm_opcodes.txt、wasm_analysis.wat、solver.py、crypto_params.json、token_flow.md。
§ 证据与结论规则
- 高置信结论需 ≥2 种独立证据交叉验证。
- 单一工具结论标注
LOW CONFIDENCE。 - 每项结论附证据锚点:bundle chunk/行号、网络请求URL、JS函数名、xref。
- 输出必须分区:
FACTS、INFERENCES、UNKNOWNS。
§ 防护等级(T0–T7)与处理策略
| 等级 | 模式 | 主要方法 |
|---|---|---|
| T0 | 仅压缩 | 美化 + 静态阅读 |
| T1 | 变量重命名 / 死代码注入 | AST重命名 + 静态阅读 |
| T2 | ob-fuscator.io / 字符串加密 / CFG扁平化 | 反混淆器 + 运行时hook |
| T3 | eval-packing / JSFuck / JJencode / aaencode | 解包 → T1/T2处理 |
| T4 | JS-VMP / 自定义VM | VM调度器映射 + opcode追踪 |
| T5 | WASM核心 | wasm-dis + IDA/Ghidra + 运行时hook |
| T6 | T4+T5混合 | 顺序:JS-VM反虚化 → WASM逆向 |
| T7 | 多重嵌套(T2+T4+T5) | 分层剥离:外层混淆→VM→WASM |
强制: 工具链选择前先完成T0–T7定级;未脱壳/未反混淆/未反虚化不得下结论。
§ 自动分流(JS Protection Triage)
- DevTools → Sources:列出所有 .js/.mjs bundle
- 单bundle >500KB → 疑似 Webpack/Rollup
- 抽查可读性:可读变量名=仅压缩;_0x...=混淆/重命名
- 搜索模式:debugger循环/JSFuck/eval pack/CFG扁平化
- 检查 .wasm fetch / WebAssembly.instantiate
- 检查大switch + opcode数组 → JS-VMP/自定义VM
- 查找 sourceMappingURL
- 识别框架指纹:React/Vue/Angular
- 检查 Service Worker 注册
- 检查 WebSocket 二进制帧
§ 工具编排
首选: chrome-devtools-mcp
- 网络捕获、JS source mapping、API重放、storage/token/WebSocket追踪、DevTools hook注入
优先链
- WEB基础:
chrome-devtools-mcp → 静态JS美化 → API重放 - WEB混淆:
chrome-devtools-mcp → 反混淆 → 运行时hook → 静态验证 - Webpack/Vite:
chrome-devtools-mcp → bundle拆分 → chunk映射 → 入口点追踪 - JS-VMP/VM:
chrome-devtools-mcp → VM调度器定位 → opcode映射 → AST变换 → 运行时追踪 - WASM:
chrome-devtools-mcp → wasm-dis/wasm2c → IDA/Ghidra → 运行时hook - 疑似题面/服务端漂移:
线上资源指纹 → 历史题解入口对照 → 真实点击流验证 → 协议流验证
Fallback
- DevTools不可用:声明阻塞 → 请求代理日志/HAR。
§ 标准流程(6步)
Step 1 — 上下文拆解: 评分路线(可行性/信号/风险 0-3)→ 选择主路径 + fallback。 Step 2 — 环境检查: DevTools可用、作用域/登录态/速率限制确认。 Step 3 — 全局三角: 定级T0–T7、识别bundle、枚举API、检查source map/WASM/SW/框架指纹。 Step 4 — 关键路径: 页面加载JS → 初始化 → 认证/加密模块 → sign() 调用点。 Step 5 — 深度分析: 反混淆/反虚化后数据流与参数生成逻辑。 Step 6 — 动态验证: hooks捕获 + 重放脚本验证签名一致性。
§ 专项流程:Drift Check
当用户提供历史题解、历史脚本路径,或你发现“当前线上行为与公开解法明显不一致”时,必须先跑一次漂移验证,再决定是否继续深挖客户端。
Drift Check 最小动作集
- 抓当前题页 HTML 指纹
- 枚举当前加载的 script/link/API 资源
- 直接请求历史题解常见入口与旧资源路径
- 对照当前资源路径与历史文章/脚本路径是否一致
- 跑真实点击流与协议流,确认当前线上实际失败点
Drift Check 产物
- 当前题页 URL 与 HTML 哈希
- 当前 script/API 资源列表
- 旧入口可用性矩阵:
200 / 404 / 500 / redirect - 结论分级:
NO DRIFT SIGNALPOSSIBLE DRIFTHIGH PROBABILITY DRIFT
Drift Check 判定规则
- 若旧入口 404/500,且真实点击流与历史公开解法期望不一致,至少标
POSSIBLE DRIFT - 若客户端显式状态已压缩到最小仍无法解释失败,同时旧入口失效,标
HIGH PROBABILITY DRIFT
§ 参考资料(按需加载)
references/hooks.md:网络/存储/反调试/WebCrypto/CryptoJS hook 代码references/deobf.md:T1–T3 反混淆与解包流程references/vm_wasm.md:JS-VM / WASM 反虚化步骤references/replay.md:协议重建与web_replay.js模板references/ctf.md:CTF 快速三角与交付物要求
§ 交付物模板
Reverse_Report_CN.md 结构
- 任务摘要
- 核心发现(≤5项)
- 证据表
- 调用链
- 风险与影响
- FACTS / INFERENCES / UNKNOWNS
- 下一步行动
- 交付物清单
- 复现步骤
web_replay.js 要求
- 可直接
node web_replay.js - 包含签名算法还原与请求重放
- 注明关键参数来源(key/token/nonce/ts)
§ 可复用实验模板
1. Signer Export + Minimal Trace
适用:已经定位到 runtime signer,但不确定它到底读了哪些输入。
动作:
- 对
eval/ 动态 bundle 做最小 patch - 导出 signer 入口与少量 helper
- 只记录:
- signer 输入
- signer 输出
- 请求发出前的 cookie / URL / 少量动态全局
- 禁止一上来做全量 opcode 日志,优先做轻量 trace
产物:
trace_*.pytrace_*.out.json
2. Dynamic Global Injection Experiment
适用:服务端响应会下发 k / nonce / 动态全局名,怀疑这些值影响下一次请求。
动作:
- 收集真实点击流里每页响应下发的动态值
- 分别注入候选值
- 重新生成 fresh URL
- 记录请求结果矩阵
产物:
experiment_*_variants.pyexperiment_*_variants.out.json
3. Scope Snapshot Diff
适用:window / storage / cookie 都看过了,怀疑还存在模块态或闭包态。
动作:
- 在运行时注入一个最小快照接口
- 快照范围:
- 可访问的模块级 primitive / string / array 摘要
- 关键闭包返回值摘要
- 只在关键请求前抓快照
- 自动比较相邻页面或相邻请求的差分
产物:
trace_scope_snap.pytrace_scope_snap.out.json
4. Browser / Protocol Consistency Matrix
适用:怀疑“浏览器里成功、协议层失败”或“自动化栈和真实点击流不一致”。
动作:
- 至少比较三条链路:
- 真实点击流
- browser-native
fetch - 协议层 replay
- 若三者一致,则优先排除“网络栈差异”分支
结论要求:
- 必须明确写出哪几条链路一致,哪几条不一致
- 不得只凭单条链路下结论
§ 结果声明规则
- 未确认项写入 UNKNOWNS;给出下一步操作。
- 时间预算内空结果:声明空结果 + 已检查内容 + 次优路线。
§ 质量门槛(完成条件)
- 防护定级完成;关键层已脱壳/反混淆/反虚化。
- 重放脚本与浏览器签名一致。
- 证据锚点齐全,可复现。
- 若存在历史题解或旧入口,已明确完成一次
Drift Check并给出分级结论。