全球首个自主逆向工程师。
用于逆向工程二进制文件的LLM编排
大多数任务遵循线性关系:任务越难,通常耗时越长。逆向工程(及二进制分析)是一种任务,其实际难度其实并不高,但执行时间却可能长达数小时甚至数天,即使是只有几百个函数的二进制文件也是如此。
Kong 使用NSA级别的逆向工程框架,将机械层自动化。Kong 可以接收一个完全混淆且剥离了符号的二进制文件,运行完整的分析管线:对函数进行分类、构建调用图上下文、通过LLM引导的反编译恢复类型和符号,并将结果写回 Ghidra 的程序数据库。输出的二进制文件中,某个 FUN_00401a30 变成了 parse_http_header,并恢复了结构体、参数名和调用约定。
为什么存在
剥离了符号的二进制文件丢失了所有使代码可读的上下文:函数名、类型信息、变量名、结构体布局。恢复这些上下文是大多数逆向工程任务的主要工作,而且很大程度上是模式匹配:识别标准库函数、从用法推断类型、通过调用图传播名称。
LLM 恰好擅长这类模式匹配。但直接将原始反编译器输出丢给LLM并问“这个函数是做什么的?”得到的结果平平无奇。模型缺乏调用上下文、交叉引用信息以及二进制文件结构的整体概况。此外,大多数混淆的二进制文件会引入极端的技术来阻止逆向工程。
Kong 的解决方案是:在接触LLM之前,先通过 Ghidra 的程序分析(调用图、交叉引用、字符串引用、数据流)构建丰富的上下文窗口,然后按依赖顺序编排分析,使每个函数都能从其已被命名的被调用者中受益。此外,Kong 还引入了它自己的、首创的自主反混淆管线。
Kong 适用于大多数 Ghidra 可反编译的二进制文件(目前如此,更多架构即将推出)。
高: Kong 能够可靠地反编译、去混淆并恢复名称、类型和结构。
中: 反编译可用但噪音较大。预期部分恢复和较低的置信度分数。
低: 反编译存在显著缺陷,结果将不完整、嘈杂或不可读。
注意: 二进制文件的大小与函数数量、LLM成本及完成时间正相关。然而,二进制文件的大小也与置信度负相关,因此在分析较大的二进制文件时请记住这一点。
Kong 采用由监督器协调的五阶段管线,负责协调分类、并行分析和后处理:
┌──────────────────────┐
│ 分类 │
│ 枚举、分类、 │
│ 构建调用图、 │
│ 匹配签名 │
└──────────┬───────────┘
│
▼
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 分析 │ │ 分析 │ │ ... │
│ (叶子函数) │ │ (下一层级) │ │ │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────┬───────┴────────────────┘
│
▼
┌──────────────────────┐
│ 清理 │
│ 规范化、去重 │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ 综合 │
│ 统一名称、构建 │
│ 结构体、去混淆 │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ 导出 │
│ analysis.json + │
│ Ghidra 写回 │
└──────────────────────┘
分类 枚举二进制文件中的所有函数,按大小(微小/小/中等/大)分类,构建调用图,检测源语言,并针对已知标准库和加密函数运行签名匹配。匹配签名的函数被标记为已解析,并跳过LLM分析。
分析 使用工作队列按从底向上的顺序处理调用图中的函数。对于每个函数,Kong 从 Ghidra 的程序数据库构建上下文窗口——反编译、交叉引用、字符串引用以及已分析被调用者的签名——规范化反编译器输出,并将其发送给LLM以恢复名称、类型和参数。如果在函数的反编译中检测到混淆,Kong 会运行一个带有符号工具访问权限的自主去混淆过程,然后再输出分析结果。结果会立即写回 Ghidra,以便下游调用者看到更新后的名称。
清理 统一分析过程中累积的结构体类型提议,并重试任何在分析阶段应用失败的函数签名。
综合 对所有已分析函数进行全局审视。使用一次LLM调用审查连接最多的函数,统一命名约定,从字段访问模式综合出结构体定义,并优化在更广泛上下文中看起来不一致的名称。
导出 写入最终的 analysis.json 并将所有恢复的名称、类型和签名应用回 Ghidra 的程序数据库。
# 1. 安装 Kong
uv pip install kong-re
# 2. 设置你的 API 密钥
export ANTHROPIC_API_KEY="sk-ant-..."
# 和/或
export OPENAI_API_KEY="sk-..."
# 3. 运行设置向导(仅首次)
kong setup
# 4. 分析一个二进制文件
kong analyze ./path/to/stripped_binary
设置向导让你选择要使用的 LLM 提供商,并设置默认提供商。Kong 会自动检测你的 Ghidra 和 JDK 安装位置,将二进制文件加载到进程内的 Ghidra 实例中,并运行完整的管线。
git clone https://github.com/amruth-sn/kong.git
cd kong
uv sync
uv run kong setup
uv run kong analyze ./path/to/stripped_binary
# 运行设置向导
kong setup
# 分析一个剥离了符号的二进制文件(使用配置的默认提供商)
kong analyze ./binary
# 使用特定提供商分析
kong analyze ./binary --provider openai
# 覆盖模型
kong analyze ./binary --provider openai --model gpt-4o-mini
# 显示二进制文件元数据而不运行分析
kong info ./binary
# 对照真实源码评估分析输出
kong eval ./analysis.json ./source.c
结果写入输出目录(默认:./kong_output_{binary_name}/):
kong_output_{binary_name}/
├── analysis.json # 所有恢复的函数名称、类型、参数
└── events.log # 管线执行追踪
Kong 自主地从剥离了符号的 liblzma.so.5.4.1 中重构了完整的 XZ 后门(CVE-2024-3094)攻击链——在15分钟内以90-95%的置信度识别了所有五个核心植入函数,成本为 $6.63。
请参阅 BENCHMARKS.md 获取完整案例研究和复现说明。
kong/
├── __main__.py # CLI 入口点(click)
├── config.py # KongConfig, LLMProvider, LLMConfig
├── db.py # SQLite 配置存储(~/.config/kong/)
├── banner.py # ASCII 横幅,API 密钥助手
├── agent/
│ ├── supervisor.py # 管线协调器
│ ├── triage.py # 函数枚举 + 分类
│ ├── analyzer.py # LLM 引导的函数分析
│ ├── queue.py # 基于BFS的调用图工作队列
│ ├── signatures.py # 已知函数签名匹配
│ ├── prompts.py # 系统提示 + 输出模式
│ ├── events.py # 管线追踪的阶段/事件类型
│ └── models.py # FunctionResult 数据类
├── ghidra/
│ ├── client.py # 进程内 GhidraClient(PyGhidra/JPype)
│ ├── types.py # FunctionInfo, BinaryInfo, XRef 等
│ └── environment.py # Ghidra/JDK 自动检测
├── llm/
│ ├── client.py # AnthropicClient
│ ├── openai_client.py # OpenAIClient
│ ├── usage.py # TokenUsage, 成本追踪, 定价注册表
│ └── limits.py # 模型特定限制 + 速率限制器
├── normalizer/
│ └── syntactic.py # 反编译器输出规范化
├── synthesis/
│ └── semantic.py # 全局名称统一 + 结构体综合
├── evals/
│ ├── harness.py # 真实源码提取 + 评分
│ └── metrics.py # symbol_accuracy, type_accuracy
├── export/
│ └── source.py # analysis.json + Ghidra 写回
├── signatures/
│ ├── stdlib.json # C 标准库签名
│ └── crypto.json # 加密函数签名
└── tui/
└── app.py # Textual TUI
Kong 采用 Apache License 2.0 许可证。Kong 是一个免费且开源的项目。
该许可证与 Ghidra 许可证兼容,并允许商业使用。
欢迎通过 GitHub Issues 提交问题和功能请求。
特别感谢 KeygraphHQ 的 Shannon 项目,它为这个项目提供了灵感。我的动力来自于复制 Shannon 用于其基于Web的渗透测试工具的同类型管线,并将其应用于二进制分析和反编译。
小心那只猴子。
Kong: 世界上第一个AI逆向工程师
| C | C++ | Go | Rust |
|---|
| x86 | 高 | 高 | 中 | 中 |
| x86-64 | 高 | 高 | 中 | 中 |
| ARM (32位) | 高 | 高 | 中 | 低 |
| AArch64 | 高 | 高 | 中 | 低 |
| MIPS | 中 | 中 | 低 | 低 |
| PowerPC | 中 | 中 | 低 | 低 |
| 变量 | 是否必需 | 描述 |
|---|
ANTHROPIC_API_KEY | 至少一个 | Anthropic API 密钥(Claude) |
OPENAI_API_KEY | 至少一个 | OpenAI API 密钥(GPT-4o) |
GHIDRA_INSTALL_DIR | 否 | Ghidra 安装路径(如未设置则自动检测) |
JAVA_HOME | 否 | JDK 路径(如未设置则自动检测) |
KONG_CONFIG_DIR | 否 | 覆盖配置目录(默认:~/.config/kong) |