Files
reverse-skills-max/vendor-new/js-reverse-automation--skill/js-reverse-automation/references/final-report-template.md

5.0 KiB

最终报告模板

验证通过!现在输出最终结果。


JS 逆向分析完成  <任务名称>

分析结果

  • 加密函数:<函数路径>
  • 加密方式:<算法/编码/组合>
  • 入口路径:<页面入口或运行时路径>
  • 置信度:高(网络请求 + 运行时 Hook 双重验证)

验证结果

测试 输入 输出
JSRPC <plaintext> <ciphertext/signature>
Flask 代理 <original body> <transformed body>

验证命令

curl -sS --get \
  --data-urlencode group=<group> \
  --data-urlencode action=<action> \
  --data-urlencode 'param={"parameter":"<parameter>","value":"<plaintext>"}' \
  http://127.0.0.1:12080/go

预期结果必须包含明文、最终请求体、密文/签名和最终业务响应。

将上述真实返回保存为 artifacts/jsrpc_smoke.json 后,必须执行:

python3 scripts/validate_browser_evidence.py \
  --input artifacts/jsrpc_smoke.json \
  --output artifacts/browser_evidence.json

只有 browser_evidence.json 中 passed=true 时,才能在报告中写“验证通过”。如果保存了桥接连接、tabId 和 documentId,追加 --require-session。

Flask 代理验证

curl --noproxy '*' -sS -X POST http://127.0.0.1:<flask_port>/<route> \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'dataBody=<完整的原始 URL-encoded 请求体>' \
  --data-urlencode 'dataHeaders=<可选的请求头 JSON>'

预期结果必须返回代理改写后的请求体,其中目标字段已完成加密或签名;如果配置了响应透传,还应包含最终业务响应。

Burp“请求数据包/响应数据包”整包模式还必须单独验证:

curl --noproxy '*' -sS -X POST http://127.0.0.1:<flask_port>/encode \
  -H 'Content-Type: application/octet-stream' \
  --data-binary $'POST /path HTTP/1.1\\r\\nHost: target\\r\\nContent-Type: application/x-www-form-urlencoded\\r\\n\\r\\npassword=plaintext'

预期返回完整 HTTP 报文,目标字段已替换且 Content-Length 已同步。外层 application/octet-stream 不代表目标 body 是二进制;代理必须识别内层 HTTP 报文的 Content-Type。

Burp autoDecoder 页面配置

以下 <flask_port> 必须替换为 artifacts/flask_status.json 中服务实际返回的 port。如果默认端口被占用,服务管理器会自动选择备用端口。

请求体加密

  • 加密接口:http://127.0.0.1:<flask_port>/encode。
  • 可以同时配置加密接口和解密接口;当前测试时选择“请求数据包”,不要同时选择“响应数据包”。两者是互斥方向。
  • 原始数据包区域粘贴完整 HTTP 请求,不要只粘贴 body。
  • “处理请求头”:仅当签名或加密依赖请求头时勾选,否则不勾选。
  • “请求 base64 编码”:只有请求体进入接口前需要 Base64 编码时勾选。
  • “请求自动 base64 解码”:只有接口需要先自动还原 Base64 请求体时勾选。
  • “Proxy、Repeater 等模块真实调试”:需要在 Burp Proxy/Repeater 联调时勾选,否则不勾选。

响应体解密

  • 解密接口:http://127.0.0.1:<flask_port>/decode(可与加密接口同时配置)。
  • 取消选择“请求数据包”,改为选择“响应数据包”,不能同时选择两个方向。
  • 原始数据包区域粘贴完整 HTTP 响应,不要只粘贴 body。
  • “处理响应头”:仅当响应解密依赖响应头时勾选,否则不勾选。
  • “响应 base64 编码”:只有响应体进入接口前需要 Base64 编码时勾选。
  • “响应自动 base64 解码”:只有接口返回 Base64、需要还原二进制响应时勾选。
  • 响应方向传递 requestorresponse=response;请求方向传递 requestorresponse=request。

启用请求头或响应头处理时,接口必须返回 请求头 + "\\r\\n\\r\\n\\r\\n\\r\\n" + 改写后的请求/响应体。

关闭服务命令

kill $(lsof -t -i:12080)
kill $(lsof -t -i:<flask_port>)

Burp autoDecoder 配置

  • 加密接口:http://127.0.0.1:<flask_port>/encode
  • 解密接口:http://127.0.0.1:<flask_port>/decode(可与加密接口同时配置)
  • HTTP 方法:POST
  • 表单字段:dataBody、dataHeaders
  • 生成后必须通过 python3 scripts/check_delivery_contract.py --proxy generated/flask_proxy.py --output artifacts/delivery_contract.json。
  • jsrpc.base_url 无论配置为 http://127.0.0.1:12080 还是带 /go 的完整地址,最终请求只能包含一次 /go。

生成的产物

  • analysis_result.json
  • generated/jsrpc_inject.js
  • generated/flask_proxy.py
  • generated/burp-autodecoder.md
  • artifacts/validation_report.json
  • artifacts/browser_evidence.json

对抗分析追加

  • 对抗类型:<反调试/反 Hook/环境检测/动态加载>
  • 探针健康:<丢失补丁/重建错误/丢弃事件>
  • 差分结论:<观察结果/干预结果>