逆向工程专家智能体:自主规划分析路径,从原始证据中推导每一项事实,并在机械验证关卡下收敛——固件、协议、Web/JS、风控、二进制。
kunglao-agent 是一套自主逆向工程系统:你给它目标和待解问题,它自己把问题做上几小时到几天 —— 自己规划路径,worker 死了能补位,崩溃了能续跑;只有当每个答案都从原始证据推导出来、并扛过机械校验门控之后,它才收敛交卷。
简体中文 · English
它目前以 Claude Code 插件的形式分发 —— Claude Code 是你对话的界面,但不是产品的本体。产品是这套循环:专家 worker 先做静态分析,独立验证者从原始证据盲重推每一条事实,机械门控决定分析何时算完成。交付物是一个事实库:每条 claim 都有字节锚定、独立验证、证据索引 —— 信任靠机器执行,不靠口头约定。
术语约定:
kunglao-agent、PROVEN、RED-CHECKER(独立验证者)、fact、claim、MCP、task_spec.yaml、claim-register.yaml、evidence/_index.json等已建立术语保留英文原文,其余均为中文。
PROVEN;每条 fact 都通过 evidence/_index.json 锚定到带 sha256 的原始证据。kunglao-agent 跑在 Claude Code 里。从磁盘上的样本到 verdict:
在任意目录下,进入 Claude Code:
/plugin marketplace add amd2g2zz/kunglao-agent
/plugin install kunglao-agent@kunglao-agent
(开发模式也可以:claude --plugin-dir /path/to/kunglao-agent。)
/kunglao-agent:init ~/cases/synth-dropper --type windows
kunglao-init 搭好工作区、写好 CLAUDE.md、按你选的 --type 探测工具链、生成 .mcp.json。你选的类型有 HARD 工具缺失时,init 会 HARD-reject —— 修复指引就写在错误块里。
/kunglao-agent:analysis ~/cases/synth-dropper
> 分析目标:确认这个 dropper 的持久化手段和网络出口,
> 每条结论都要能从原始证据复现。
> 验证逻辑:关键结论必须由独立验证者盲重推一致才算成立。
> 约束:静态优先,样本不许在宿主机执行。
把需求说清楚 —— 分析目标(你要知道什么)、验证逻辑(凭什么信答案)、约束(不许做什么)。写得越具体,结果越可控:只写目标不写验证逻辑,结论就只是模型的口头担保;两者都给,每条结论才有机械背书。约束可选——不写就由系统按静态优先原则自行决定路径。需求记入 task_spec.yaml,之后循环自动推进,不需要你再指挥。常见的口头需求怎么写成合格的任务描述,见怎么写任务描述。
claim-register.yaml # 每条 claim 都 terminal,带验证者签核
facts/F<NNN>.md # 字节锚定、可复现、frontmatter 契约
evidence/_index.json # 每个 fact 对应一份原始证据(sha256 + 路径)
runs/ # 会话审计轨迹
循环的完成判据 —— oracle —— 是从你写下的最终状态机械推导出来的。写得含糊,oracle 就含糊,分析就会漂向"能证明什么",而不是"你要什么"。下面四种说法覆盖了大部分漂移场景:用户原话是什么、通常的真实含义是什么、一个合格的任务描述长什么样、oracle 据此锚定什么。
通常的真实含义: 离线复现 App 的签名/加密算法 —— 一个 unidbg harness 或一份独立重写,运行时既不要设备也不要 App。不是"分析这个 App";App 只是算法的宿主。
> 样本:v7.2 APK;行为:给 api.example.com/v2/* 请求生成 `sign`
> 头的那个签名函数。
> 判据:独立复现(unidbg 或重写)对全部抓包 (input → sign) 对
> 逐字节重放一致 —— 含扣留对 —— 运行时不依赖设备和 App。
> 附证据:captures/sign-pairs.jsonl —— 从真机会话抓到的 20 组
> 输入/输出对,其中 10 组扣留、不参与分析。
oracle 锚定在: 每一对都逐字节重放一致(包括扣留对),且复现可独立运行。
这话说的是两个不同目标里的一个 —— 先说清是哪个:
合格的描述 (a):
> 样本:v7.2 APK;行为:本地配置缓存 files/.cfg/v2.dat 落盘即加密。
> 判据:给出抓到的 v2.dat 的明文,并与 App 实际渲染的内容对得上
> (字段名和取值与随包截图一致)。
合格的描述 (b):
> 样本:v7.2 APK;行为:api.example.com/v2/* 的请求体用静态密钥加密。
> 判据:定位算法和密钥,然后做 canary 回环 —— 用还原出的密钥加密
> 已知明文,与设备产出的密文逐字节一致。
> 附证据:captures/request-bodies.jsonl —— 从设备抓到的密文请求体,
> 连同产生它们的请求。
oracle 锚定在: (a) 明文与 App 实际渲染的内容对得上;(b) 算法 + 密钥定位成功,且 canary 回环与设备产出的密文逐字节一致。"解出来过一次"两条都不满足。
通常的真实含义: 还原线上格式(wire format)—— 帧定界、字段语义,外加一个能跑的编解码器。
> 样本:某安卓聊天 App;行为:gateway.example.com:443 上的 TCP 协议,
> 抓包见 gateway-session.pcap。
> 判据:编解码器对每一帧抓包逐字节回环一致,且对扣留帧解出的字段
> 与观察到的 App 行为吻合。
> 附证据:captures/gateway-session.pcap —— 40 帧,另留 1 帧扣留、
> 不参与分析。
oracle 锚定在: 编解码器对每帧抓包逐字节回环一致;扣留帧解出的字段与观察到的 App 行为吻合。
通常的真实含义: 要的是"位置 + 证明"。指认一个代码位置很便宜;答案只有在证明"就是这里"之后才有用。
> 样本:v7.2 APK;行为:每个请求附带的 `sign` 头。
> 判据:指认计算 `sign` 的类/方法(或 native 函数),并在该点 hook,
> 用相同输入复现出抓包里的 `sign` 值。
> 附证据:captures/sign-session.jsonl —— 抓到的 `sign` 值及其请求输入。
oracle 锚定在: 指名道姓的类/方法/native 函数,加上该点的 hook 能复现抓包值。
sign 头的签名函数"才是目标。典型顺序:init 建工作区 → analysis 提需求开跑 → (中途出岔子用 resume)→ 收敛读报告 → 插件升级后对旧工作区跑一次 upgrade。
一次分析的"形状" —— 你敲什么、拿到什么、去哪看。 一个小型 Windows dropper 落在 ~/cases/synth-dropper:
/kunglao-agent:init ~/cases/synth-dropper --type windows # 探测 Ghidra、VM 可达性
/kunglao-agent:analysis ~/cases/synth-dropper
> "这个二进制干了什么,回连到哪里?"
接下来循环自己跑 —— 路线随样本实际情况调整,不是固定剧本。你可以走开(见长时程自主运行)。收敛之后读下面的交付物。
再给两条端到端的路径 —— 挑一条匹配你的目标(普通 Windows PE / Linux ELF 二进制就走上面的示范案例)。
/kunglao-agent:init ~/cases/sample.apk --type android
/kunglao-agent:analysis ~/cases/sample.apk
> "capability / persistence / network entry points"
/kunglao-agent:init ~/cases/sample.apk --type android
/kunglao-agent:analysis ~/cases/sample.apk
> "这个 APK 有没有动态加载和反调试?如果有,代码藏在哪,做了什么?"
bins/<sha256>(APK 本身)、facts/(类图谱、native .so 清单)、evidence/(抓包、dump)。/kunglao-agent:init ~/cases/example-site.com --type web
/kunglao-agent:analysis ~/cases/example-site.com
> "XHR 签名是怎么算的,nonce 从哪来?"
evidence/(抓包、去混淆后的代码)、facts/(签名密钥、nonce 推导)。web 是 beta 阶段目标 —— 工具链门槛刻意放得很低;能力缺失由循环在实际需要时浮出来,而不是 init 卡住。一个声明登记加事实库,信任靠机器执行,不靠口头约定:
PROVEN 要求独立盲验证者逐字节重推一致;CONVERGED 要求每个主问题都有字节级证据、零孤立 claim、不空转。evidence/_index.json 追到原始证据(capture / trace / dump / 二进制)。按设计排除派生摘要。没有任何 claim 能靠作者自己说了算:必须由独立验证者盲重推一致,并通过一组机械门控。完整门控设计见 docs/design/loop-engineering.md。
跑完之后,各文件回答不同的问题:
fact 样例:
id: F061
status: VERIFIED-BY-W01-static-byte-recheck
claim_id: C-401
provenance:
- {role: sample, path: bins/<sha>}
- {role: capture_log, path: runs/c329-inner-pe.bin} # 经 evidence/_index.json 引用
reproduce: python -c "import struct; ..." # 对着引用的证据跑
verifier_sign_off: {verifier: kunglao-redteam, verdict: CONFIRMED}
真实的分析不是二十分钟的聊天。kunglao-agent 能一直钉在问题上,不需要人一步步带着走:
/kunglao-agent:resume <工作区> 从落盘状态重建断点现场,并给出下一步动作。你给它目标和问题;它把问题做上几小时到几天,从故障里恢复,收敛了你来读结论。
local 会被 init HARD-reject。runs/ 里有新条目说明循环活着;心跳死了、或同一决策反复出现而没有新 fact,就是卡了 —— /kunglao-agent:resume <工作区> 给出诊断和下一步。init 时选的 --type 决定哪些 HARD 工具必须装。指引默认折叠 —— 展开你的目标。所有类型都需要两个 MCP server: ghidra(claude mcp add ghidra -- <path>/bridge-mcp-ghidra.exe)和 sequential-thinking(claude mcp add sequential-thinking -- npx -y @modelcontextprotocol/server-sequential-thinking)。
以上所有内容的统一真源 —— 随时可探测:python scripts/mcp_probe.py <ws> --type <windows|linux|android|web|macos>(退出码 1 = HARD 缺失)。
动态调试需要一个 agent 能驱动的执行控制平面。KUNGLAO_CHANNEL 在五个一等公民 channel 里选一个 —— 你环境里已有什么就用什么,没有降级模式:
local红线: local 只为静态工作准备 —— 绝不在主机上执行、调试、注入样本。任何动态需求都把KUNGLAO_CHANNEL切到vmr/ssh/docker/adb;动态任务配local会被 init HARD-reject。
channel 探测只对动态任务跑(纯静态任务直接跳过)。ssh channel 上的执行流过 ssh-mcp 控制平面(npm i -g ssh-mcp);裸 CLI ssh 是兜底。远程 docker 走 ssh 时,设 KUNGLAO_DOCKER_CONTAINER。
四个变量覆盖大多数场景:
很少用到:KUNGLAO_DOCKER_CONTAINER(ssh/docker channel 的 docker 执行目标)、KUNGLAO_FRIDA_PORT(默认 1337)、KUNGLAO_DIE(DIE 路径,兜底 PATH)、KUNGLAO_CLAUDE_JSON(用户级 MCP 注册表的测试覆盖)。
block_malware_exec hook 强制;动态只跑在 VM/容器/设备里,且要求逐会话授权。欢迎贡献。流程:从 dev 切分支,一个改动一个分支,PR 回 dev。
git worktree add .worktrees/<name> -b <name> dev
uv sync --locked
uv run python -m pytest -q
gh pr create --base dev
设计文档在 docs/ 与 specs/。见许可证。
单一真源:scripts/mcp_probe.py;kunglao-init 在缺失时生成工作区 .mcp.json(--no-mcp 跳过;已有文件绝不覆盖)。探测:python scripts/mcp_probe.py <ws> --type <windows|linux|android|web|macos> —— 退出码 1 = HARD 缺失,2 = 仅 WARN 缺失。
一个工作区对应一次样本分析:
<workspace>/
├── bins/<sha256> # 样本(gitignore)
├── task_spec.yaml # primary_questions / scope / constraints / success_criteria
├── claim-register.yaml # claim C-NN(OPEN/PROVEN/STAMP/...)
├── claim_deps.yaml # claim DAG
├── facts/ # 字节锚定 fact F-NNN.md + _INDEX.md
├── evidence/ # 原始证据 + _index.json(eid → 路径 + sha256)
├── runs/ # worker-status、plan、ledger、.heartbeat.json
├── blockers/ # 每个 claim 的失败归因记录
└── CLAUDE.md # 工作区规则,kunglao-init 生成
kunglao hook 只落在工作区层级;你的全局 ~/.claude/settings.json 永远不会被写入。
双协议许可:AGPL-3.0 用于个人、学术、内部使用(免费 —— 见 LICENSE);闭源或 SaaS 商业使用需要商业许可 —— 见 LICENSE-commercial.md。
| 工具 | 作用 | 安装 |
|---|
| Claude Code | kunglao-agent 的运行环境 | 按 Anthropic 官方文档 |
| Python 3.10+ | 插件自带 uv 管理的锁定环境,你不用动 | 系统装或 uv 管 |
uv | 锁定环境解析器 | pip install uv 或 astral.sh/uv |
| Ghidra 或 IDA | 二选一,作为反编译器 | 见按目标类型分工具链 |
| 命令 | 什么时候用 | 做什么 |
|---|
/kunglao-agent:init <路径> --type <windows|linux|android|web|macos> | 开始一次分析,先建工作区 | 搭建工作区,按类型探测工具链,写 CLAUDE.md 和 .mcp.json;HARD 工具缺失时 HARD-reject,错误块里带修复指引 |
/kunglao-agent:analysis <路径>(别名 analyze) | init 之后,提出任务、开跑分析 | 一次性收集你的分析目标 / 验证逻辑 / 约束,进入收敛循环:派工 / 验证往复,收敛后出报告 |
/kunglao-agent:resume <路径> | 崩溃、重启之后,或任何"我刚才跑到哪了" | 只读的断点简报(健康状态、open claim、在跑 worker、崩溃时间线)加上状态机给出的下一步 |
/kunglao-agent:upgrade <路径> [--dry-run] | 插件升级后打开旧工作区,或升级时提示版本戳落后 | 把工作区脚手架(hooks、模板、事件词表)迁移到当前插件版,--dry-run 可预览;用户数据(claims、facts、evidence)绝不触碰,字节级漂移即拒绝(RC=4) |
/kunglao-agent:help | 忘了命令 | 打印用法列表 |
| 问题 | 去哪看 |
|---|
| 做完了吗 | 循环的退出码 —— CONVERGED(0)表示每个主问题都有已验证的答案;逐条 claim 状态在 claim-register.yaml |
| 找到了什么 | facts/F<NNN>.md —— 一条 fact 一个文件,由 claim-register.yaml 映射回 claim |
| 怎么复现 | evidence/_index.json —— fact → 原始证据(路径 + sha256);每条 fact 带 reproduce: 命令 |
| 具体发生了什么 | runs/ —— 逐 tick 的 ledger 和 worker 状态 |
| Tier | 工具 | 安装 |
|---|
| HARD | pefile(Python) | pip install pefile |
| HARD | die(Detect It Easy) | KUNGLAO_DIE 环境变量或在 PATH —— ntinfo.com |
| HARD | floss(FLARE FLOSS) | 按 flare-floss 文档 装 |
| HARD | Ghidra 或 IDA | 二选一;见内部 |
| HARD(T2/T3) | VMware + vmr-shell,或 ssh/docker channel | 见自带分析环境 |
| HARD(T2/T3) | frida-server(改名,自定义端口) | 设备/VM 侧二进制,默认端口 1337 |
Windows 的 T3 动态还要用 x64dbg MCP;volatility(内存取证)和 IDA-Pro MCP 可选 —— 见内部的 MCP 清单。
| Tier | 工具 | 安装 |
|---|
| HARD | file、readelf、objdump | binutils 包 |
| HARD | Ghidra 或 IDA | 二选一 |
| HARD(T2/T3) | VMware + vmr-shell,或 ssh/docker 控制平面 | 见自带分析环境 |
| HARD(T2/T3) | frida-server(改名,自定义端口) | 设备端二进制,端口 1337 |
| WARN | gdbserver(主机侧 PATH)、strace、ltrace | 可选补充 |
ssh-mcp 给远程 / 云 / docker 主机开 ssh 控制平面。
| Tier | 工具 | 安装 |
|---|
| HARD | aapt 或 aapt2(或 unzip 兜底) | Android SDK build-tools |
| HARD | jadx(DEX → Java 反编译器) | skylot/jadx |
| HARD | apktool(APK 资源解码 / 重打包) | iBotPeaches/Apktool |
| HARD | gitnexus(反编译后图谱) | npm i -g gitnexus |
| HARD | Ghidra 或 IDA | 仅当 APK 含 native .so |
| HARD | adb + 已 root 设备,ro.debuggable=1 | platform-tools + 设备端自定义 frida |
| HARD | frida-server(改名,自定义端口 1337) | 设备端二进制 |
| HARD | android_server(IDA 远程调试) | 设备端二进制,端口 23946 |
| WARN | apkid | pip install apkid |
| WARN | baksmali | 从 smali releases 下载 |
| Tier | 工具 | 安装 |
|---|
| WARN | camoufox-reverse MCP(web) | 反检测 Firefox(hook / trace / 网络抓包) |
| WARN | docker(web channel 默认) | Docker Desktop,或显式 KUNGLAO_CHANNEL=ssh |
| WARN | lipo、otool、nm、codesign、xattr(macOS) | Xcode Command Line Tools |
| WARN | ghidra MCP(macOS) | 推荐 —— 见内部的清单 |
两者都是 beta 阶段目标:能力缺失由循环在实际需要时浮出来,而不是 init 卡住。macOS 的动态分析走 ssh channel(连到 Mac 主机);要用可选的 x64dbg 浏览器侧调试,就按上面的 Windows 工具链装。
| Channel | 驱动什么 | 前置 |
|---|
vmr(默认) | VMware 驱动的 VM,任何客户机系统 —— snapshot/revert 工作流是它不可替代的价值 | vmr-shell 技能;KUNGLAO_VM_HOST + 端口 9876/1337 |
ssh | 任何 ssh 可达的机器:远程裸机、云 VM、Mac、远程 docker 主机 | 密钥认证 —— 探测会真的跑一次 BatchMode ssh ... true |
docker | 本机或远程 docker daemon —— docker exec 等价于任何控制路径 | docker version 绿;可选 KUNGLAO_DOCKER_CONTAINER |
adb | 安卓模拟器或真机 | adb devices 能看到设备;adb forward tcp:1337 tcp:1337 给 frida |
local | 仅主机侧静态分析 | 无 —— 见下面的红线 |
| 变量 | 默认 | 含义 |
|---|
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS | 未设 | 必须保持未设或 0 —— 真值会让派工走 teammate channel,会被拒绝 |
KUNGLAO_CHANNEL | vmr | 动态分析执行控制平面:vmr | ssh | docker | adb | local —— 见自带分析环境 |
KUNGLAO_VM_HOST | 未设 | 动态分析的 VM/主机(vmr-shell :9876,Frida :1337) |
GHIDRA_HOME | 未设 | Ghidra 安装根目录(要含 support/analyzeHeadless.bat) |
| MCP server | Tier | Scope | 用途 | 注册 |
|---|
ghidra | HARD | 所有 type 必需 | 反编译 / 静态分析 | claude mcp add ghidra -- <path>/bridge-mcp-ghidra.exe |
sequential-thinking | HARD | 所有 type 必需 | 结构化推理 | claude mcp add sequential-thinking -- npx -y @modelcontextprotocol/server-sequential-thinking |
x64dbg | HARD | Windows T3 动态 | 动态调试(VM 远程) | claude mcp add x64dbg -- x64dbg-automate-mcp |
volatility | WARN | Windows T3 | 内存取证 | claude mcp add volatility -- python <path>/volatility_mcp_server.py |
ida-pro-vm | WARN | 选 IDA 时 | 远程 IDA 分析 | claude mcp add --transport http ida-pro-vm <ida-mcp-url> |
gitnexus | HARD | Android 图谱构建 | 反编译后知识图谱 | claude mcp add gitnexus -- gitnexus mcp |
virustotal | WARN | CTI | 威胁情报(家族归属假设) | claude mcp add virustotal -- npx -y @burtthecoder/mcp-virustotal |
ssh-mcp | WARN | channel | ssh 执行控制平面 | claude mcp add ssh-mcp -- ssh-mcp |
camoufox-reverse | WARN | web(beta) | 浏览器 JS 逆向(hook / trace / 网络抓包) | claude mcp add camoufox-reverse -- python -m camoufox_reverse_mcp |