PE Stripper Backend / Bruno / curl / nginx 静态文档

PE Stripper API — Bruno 手动测试指南

本文档用于对已部署在 http://192.168.99.220:8080 的 PE Stripper 后端进行 Bruno 手工联调与回归测试,覆盖 legacy 接口、前端兼容接口以及文件下载类接口的验证方式。

服务地址:http://192.168.99.220:8080 静态页地址:http://192.168.99.220/ 测试样本:QQ.exe 样本大小:73,288 bytes 样本 MD5:3a66e40ad49e7cb8ff0aa2aeffb40405
Bruno 集合文件下载 (Postman v2.1) 导入 Bruno: File → Import Collection → 选择此 JSON 文件
测试目标确认每个接口的入参与返回格式是否符合预期,并验证可下载文件的成功链路。
建议顺序/health/detect / /info/api/v1/trace/api/v1/trace/clear / /api/v1/trace/replace
推荐工具Bruno 负责手工调试与保存请求;curl 用于快速复核与复制给后端/前端联调人员。

快速准备

建议先把测试样本 QQ.exe 放到本机某个固定目录,再执行以下初始化命令。后文所有 curl 命令均基于这些变量展开,复制后即可运行。

BASE_URL="http://192.168.99.220:8080"
FILE="./QQ.exe"
OUT_DIR="./out"
mkdir -p "$OUT_DIR"
如果你使用的是 Bruno,可以在环境变量中直接创建 baseUrl,并把 URL 写成 {{baseUrl}}/api/path。如果 curl 在 Windows PowerShell 中执行,注意转义规则与 Bash 不同,建议优先在 Git Bash、WSL 或 Linux/macOS 终端运行本文命令。

Bruno Collection Setup

1. 创建 Collection 与环境

  1. 打开 Bruno,新建一个 Collection,例如 PE Stripper
  2. 新建 Environment,例如 local-vm
  3. 添加变量:baseUrl = http://192.168.99.220:8080
  4. 所有请求 URL 统一写为:{{baseUrl}}/xxx

2. 创建请求目录建议

  • 01-health
  • 02-legacy-detect
  • 03-legacy-strip
  • 04-legacy-info
  • 05-trace-detect
  • 06-trace-clear
  • 07-trace-replace

3. Bruno 中 multipart/form-data 的配置方式

  1. Method 选择 POST
  2. Body 类型选择 Multipart Form
  3. 文件字段使用 file,类型选择文件并指向 QQ.exe
  4. 文本字段直接按后文接口说明填写,例如 file_type=1file_path=QQ.exe
  5. 二进制下载接口成功后,确认 Bruno 响应面板显示为二进制或文件流;必要时将响应另存到本地,后续再回传做二次检测。
建议在 Bruno 中先完成 /api/v1/trace,从返回值里复制 basic_info.file_md5 与某几个带偏移的 trace 项,再构造 /api/v1/trace/clear 请求,这样最接近真实前端联调链路。
GET/health

用途:健康检查。用于确认后端 HTTP 服务已启动并能正常返回 JSON。

内容
请求方法GET
请求 URL{{baseUrl}}/health
请求体
预期状态码200
curl -sS "$BASE_URL/health"
{
  "status": "ok"
}
POST/detect

用途:legacy 检测接口。上传 PE 文件,返回检测报告,适合快速确认样本包含哪些可疑元数据、PDB、版本信息、静态网络指标等。

字段类型必填说明
filefile要检测的 PE 文件。
curl -sS -X POST \
  -F "file=@$FILE" \
  "$BASE_URL/detect"
{
  "filename": "tmpxxxx.exe",
  "timestamp": "2022-01-15T09:44:12+00:00",
  "pdb_path": "D:\\devops\\workspace\\...\\QQ.pdb",
  "rich_header": { "raw": "...", "entries": [ ... ], "valid": true },
  "has_signature": false,
  "version_info": {
    "CompanyName": "Tencent",
    "FileDescription": "腾讯QQ",
    "FileVersion": "9.5.6.28129",
    "ProductName": "腾讯QQ",
    "ProductVersion": "9.5.6.28129"
  },
  "section_names": [".text", ".rdata", ".data", ".rsrc", ".reloc"],
  "static_ips": [],
  "static_domains": [],
  "static_urls": []
}
该接口返回的是核心检测结果原始风格;字段更“后端化”,适合做能力确认,不适合作为前端协议联调基线。
POST/strip

用途:legacy 一键清除接口。直接返回处理后的二进制文件,适合验证“全量清除”链路。

字段类型必填说明
filefile要清除的 PE 文件。
curl -sS -X POST \
  -F "file=@$FILE" \
  "$BASE_URL/strip" \
  -o "$OUT_DIR/QQ.cleaned.legacy.exe"
curl -sS -D - -o /dev/null -X POST \
  -F "file=@$FILE" \
  "$BASE_URL/strip"
HTTP/1.1 200 OK
content-disposition: attachment; filename="QQ.cleaned.exe"
content-type: application/octet-stream
这是下载型接口。Bruno 中验证时,重点查看状态码、响应头 Content-Disposition 与文件是否可保存,而不是 JSON 面板。
POST/info

用途:legacy 基本信息摘要接口。返回比 /detect 更精简的结果,适合做快速巡检。

字段类型必填说明
filefile要分析的 PE 文件。
curl -sS -X POST \
  -F "file=@$FILE" \
  "$BASE_URL/info"
{
  "filename": "tmpxxxx.exe",
  "timestamp": "2022-01-15T09:44:12+00:00",
  "sections": [".text", ".rdata", ".data", ".rsrc", ".reloc"],
  "has_signature": false,
  "has_rich_header": true,
  "pdb_path": "D:\\devops\\workspace\\...\\QQ.pdb",
  "static_ips": 0,
  "static_domains": 0,
  "static_urls": 0
}
POST/api/v1/trace

用途:前端兼容检测接口。该接口是手工联调的核心入口,返回统一的 envelope,并把结果按 identity_tracegroup_tracecontrol_trace 等分类。

字段类型必填说明
filefile待检测样本。
file_typetext当前固定传 1
file_pathtext原始文件路径描述,测试时可传 QQ.exe 或客户端看到的路径。
curl -sS -X POST \
  -F "file=@$FILE" \
  -F "file_type=1" \
  -F "file_path=QQ.exe" \
  "$BASE_URL/api/v1/trace"
{
  "code": 0,
  "message": "success",
  "data": {
    "basic_info": {
      "file_size": 73288,
      "file_md5": "3a66e40ad49e7cb8ff0aa2aeffb40405",
      "file_name": "QQ.exe",
      "file_description": "QQ.exe",
      "trace_clear_count": 7,
      "file_format_name": "BinExecute/Microsoft.EXE[:X86]"
    },
    "trace_info": {
      "identity_trace": [
        {
          "trace_description": "编译时间戳",
          "value": "2022-01-15T09:44:12+00:00",
          "offset_start": 288,
          "offset_end": 292,
          "size": 4
        },
        {
          "trace_description": "PDB路径",
          "value": "D:\\devops\\workspace\\...\\QQ.pdb",
          "offset_start": 14572,
          "offset_end": 14650,
          "size": 78
        }
      ],
      "group_trace": [
        { "trace_description": "公司信息", "value": "Tencent", "offset_start": 57952, "offset_end": 57966 },
        { "trace_description": "产品信息", "value": "腾讯QQ", "offset_start": 58008, "offset_end": 58016 },
        { "trace_description": "文件版本信息", "value": "9.5.6.28129", "offset_start": 58052, "offset_end": 58074 },
        { "trace_description": "产品版本信息", "value": "9.5.6.28129", "offset_start": 58052, "offset_end": 58074 },
        { "trace_description": "资源语言", "value": "080404b0", "offset_start": 0, "offset_end": 0 }
      ],
      "control_trace": []
    }
  }
}
验证重点 1code 必须为 0messagesuccess
验证重点 2basic_info.file_format_name 应为 BinExecute/Microsoft.EXE[:X86]
验证重点 3记录 basic_info.file_md5,后续 /api/v1/trace/clear 要用到。
验证重点 4关注各 trace 项是否含真实偏移;只有有意义的偏移项才适合回传做 targeted clear。
如果 file_type 不是 1,预期返回 400 且 JSON 为 {"code":1,"message":"unsupported_file_type","data":null}
POST/api/v1/trace/clear

用途:前端兼容定向清除接口。根据 clear_info 中给出的偏移与替换规则,对指定痕迹做定点清除或替换;成功返回二进制文件流。

字段类型必填说明
filefile原始样本。
file_typetext固定传 1
file_md5text通常取自 /api/v1/trace 返回的 basic_info.file_md5
clear_infotext字符串化 JSON 数组,每项描述一段要清除的字节范围。

推荐联调步骤

  1. 先请求 /api/v1/trace
  2. 复制一到多个带偏移的 trace 项。
  3. 构造 clear_info,回传给 /api/v1/trace/clear
  4. 保存返回的二进制,再重新调用 /api/v1/trace/detect 比对效果。
curl -sS -X POST \
  -F "file=@$FILE" \
  -F "file_type=1" \
  -F "file_md5=3a66e40ad49e7cb8ff0aa2aeffb40405" \
  -F 'clear_info=[{"checked":true,"clear_start":288,"clear_end":292,"clear_size":4,"clear_type":2,"clear_replace":"","trace_description":"编译时间戳"},{"checked":true,"clear_start":14572,"clear_end":14650,"clear_size":78,"clear_type":2,"clear_replace":"","trace_description":"PDB路径"}]' \
  "$BASE_URL/api/v1/trace/clear" \
  -o "$OUT_DIR/QQ.cleaned.targeted.exe"
curl -sS -D - -o /dev/null -X POST \
  -F "file=@$FILE" \
  -F "file_type=1" \
  -F "file_md5=3a66e40ad49e7cb8ff0aa2aeffb40405" \
  -F 'clear_info=[{"checked":true,"clear_start":288,"clear_end":292,"clear_size":4,"clear_type":2,"clear_replace":"","trace_description":"编译时间戳"}]' \
  "$BASE_URL/api/v1/trace/clear"
HTTP/1.1 200 OK
content-disposition: attachment; filename="QQ.cleaned.exe"
content-type: application/octet-stream
{
  "code": 1,
  "message": "invalid_clear_info: ...",
  "data": null
}
成功时是二进制文件流,失败时才是 JSON 错误 envelope。因此在 Bruno 中要同时检查状态码与响应内容类型,不要默认按 JSON 解析成功响应。
POST/api/v1/trace/replace

用途:检测并替换一体化接口。上传样本后,服务端先自动识别可替换项,再按表单字段执行 zero-fill 或定值替换,最后返回修改后的二进制文件。

字段类型必填说明
filefile原始样本。
file_typetext固定传 1
file_pathtext建议传可传样本路径描述,例如 QQ.exe
可选 replace 字段: replace_timestampreplace_pdbreplace_companyreplace_product_namereplace_file_versionreplace_product_versionreplace_original_filenamereplace_static_ipreplace_static_urlreplace_static_domain
替换规则:省略字段 = 跳过;字段值传 zero = 零填充;传其他值 = 按给定内容替换。replace_timestamp 支持 ISO-8601 或 Unix 时间戳字符串。
curl -sS -X POST \
  -F "file=@$FILE" \
  -F "file_type=1" \
  -F "file_path=QQ.exe" \
  -F "replace_timestamp=2024-01-02T03:04:05+00:00" \
  -F "replace_pdb=zero" \
  -F "replace_company=zero" \
  -F "replace_product_name=PE Stripper Demo" \
  -F "replace_file_version=1.0.0.0" \
  -F "replace_product_version=1.0.0.0" \
  -F "replace_original_filename=demo.exe" \
  "$BASE_URL/api/v1/trace/replace" \
  -o "$OUT_DIR/QQ.replaced.exe"
curl -sS -D - -o /dev/null -X POST \
  -F "file=@$FILE" \
  -F "file_type=1" \
  -F "file_path=QQ.exe" \
  -F "replace_timestamp=1710000000" \
  -F "replace_company=zero" \
  "$BASE_URL/api/v1/trace/replace"
HTTP/1.1 200 OK
content-disposition: attachment; filename="QQ.replaced.exe"
content-type: application/octet-stream
如果时间戳格式非法,预期返回 400 与 JSON 错误 envelope;如果字段未传,则对应项保持不变。

测试用例

下表可直接作为 Bruno 手工回归清单。建议至少覆盖成功路径、典型错误路径以及前端真实链路三大类。

编号 接口 场景 输入要点 预期结果
T01GET /health健康检查成功200,JSON 为 {"status":"ok"}
T02POST /detectlegacy 检测成功上传 QQ.exe200,返回文件名、时间戳、PDB、版本信息等
T03POST /detect缺少文件不传 file4xx,返回参数错误
T04POST /striplegacy 清除成功上传 QQ.exe200,返回二进制下载,文件名类似 *.cleaned.exe
T05POST /info信息摘要成功上传 QQ.exe200,返回 sections、签名状态、PDB 路径、静态网络指标数量
T06POST /api/v1/trace前端兼容检测成功file + file_type=1 + file_path=QQ.exe200code=0basic_info.file_md5 存在,trace 分组完整
T07POST /api/v1/trace不支持的 file_typefile_type=2400,JSON 为 unsupported_file_type
T08POST /api/v1/trace核对样本特征同 T06basic_info.file_format_name = BinExecute/Microsoft.EXE[:X86]
T09POST /api/v1/trace/clear定向清除成功使用 trace 返回的 MD5 与真实偏移构造 clear_info200,返回二进制下载,文件名类似 *.cleaned.exe
T10POST /api/v1/trace/clearclear_info 非法传入错误 JSON 字符串400,JSON envelope,messageinvalid_clear_info
T11POST /api/v1/trace/clear不支持的 file_typefile_type=2400,JSON 为 unsupported_file_type
T12POST /api/v1/trace/replace替换成功传入 1 个或多个 replace_* 字段200,返回二进制下载,文件名类似 *.replaced.exe
T13POST /api/v1/trace/replacezero-fill 逻辑replace_pdb=zeroreplace_company=zero下载成功,后续复检对应字段应被抹零或清空
T14POST /api/v1/trace/replace时间戳格式错误replace_timestamp=bad-value400,返回 JSON 错误
T15完整链路trace → clear → re-trace先检测,再清除编译时间戳/PDB,再对输出文件重检清理项数量减少,或对应 trace 不再出现/偏移变化符合预期

附:建议的 Bruno 请求命名

01 Health Check
02 Detect Legacy
03 Strip Legacy Download
04 Info Summary
05 Trace Detect Frontend
06 Trace Clear Targeted
07 Trace Replace One-shot
08 Trace Invalid File Type
09 Trace Clear Invalid clear_info
10 Replace Invalid Timestamp
如果你需要把结果同步给前端或测试同学,建议在 Bruno Collection 中额外保存一个“成功样例请求”和一个“典型失败样例请求”,方便后续快速复现协议问题。