ruizkinio/forte-binja
GitHub: ruizkinio/forte-binja
Forte 为 Binary Ninja 提供独立的 MIPS16e 反汇编、混合模式 ELF 路由和 LLIL 提升能力,解决了原生 MIPS 架构无法解码压缩指令的问题。
Stars: 1 | Forks: 0
# Forte
**为 Binary Ninja 提供的 MIPS16e 支持——混合模式 ELF 路由、反汇编和 LLIL。**
[](https://github.com/ruizkinio/forte-binja/actions/workflows/ci.yml)
[](LICENSE)
[](https://binary.ninja/)
[](https://www.python.org/)
Forte 填补了固件分析中的一个实际空白:Binary Ninja 的 MIPS 架构目前无法解码 MIPS16e,因此压缩函数可能会显示为无效或具有误导性的 MIPS32 指令。Forte 添加了独立的大端序和小端序 MIPS16e 架构,并将它们连接到标准的 MIPS32 架构以处理混合模式的 ELF 文件。
Forte 完全在 Binary Ninja 内部运行。它使用 [pypcode](https://github.com/angr/pypcode) 作为其 SLEIGH 解码引擎;它不会启动 Ghidra 或任何外部反汇编器。
## 工作进展
- 大端序 `mips16e` 和小端序 `mips16el` 架构
- 16 位和扩展的 32 位 MIPS16e 指令
- 奇数地址 ELF 模式标记,规范化为偶数指令地址
- MIPS32 ↔ MIPS16e 混合模式架构路由
- 直接、条件、间接、调用和返回的控制流元数据
- 延迟槽仅被精确提升(lift)一次
- Linux o32 参数、返回、已保存寄存器、栈和全局指针规则
- 常见的整数、内存、指针、控制流和浮点 p-code 被提升至 Binary Ninja LLIL
- 内置自测、现有数据库填充(seeding)以及 LLIL 覆盖率报告
## 快速入门
### 手动安装
将仓库克隆到 Binary Ninja 的用户插件目录:
```
# macOS
git clone https://github.com/ruizkinio/forte-binja \
"$HOME/Library/Application Support/Binary Ninja/plugins/forte-binja"
# Linux
git clone https://github.com/ruizkinio/forte-binja \
"$HOME/.binaryninja/plugins/forte-binja"
```
在 Windows 上,克隆到:
```
%APPDATA%\Binary Ninja\plugins\forte-binja
```
Binary Ninja 会读取 `requirements.txt` 并安装 `pypcode`。安装后请重启 Binary Ninja。
### 分析混合模式 ELF
为了获得最干净的结果:
1. 安装 Forte 并重启 Binary Ninja。
2. 在新的分析数据库中打开原始 ELF 文件。
3. Forte 会自动将奇数的函数符号地址路由到 MIPS16e。
4. 使用 **Tools → Forte → Report LLIL Coverage** 检查提升覆盖率。
对于已经在 `.bndb` 中打开的 ELF,请使用:
- **Tools → Forte → Seed Functions from Odd ELF Symbols**
- 从地址上下文菜单中使用 **Forte → Analyze MIPS16e Function Here**
在填充(seed)旧数据库时,Forte 不会删除或覆盖现有函数。
## 为什么奇数地址很重要
MIPS ELF 工具链通常将 MIPS16 函数符号存储为 `real_address | 1`。最低位用于选择压缩 ISA 模式;它不是字节地址的一部分。
```
ELF function symbol: 0x00401c95
Instruction address: 0x00401c94
Architecture: mips16e
```
Forte 钩入(hook)了 Binary Ninja 的 `mips32` 和 `mipsel2` 地址关联,因此模式标记会选择正确的架构,同时分析会在规范的偶数地址处继续进行。
## 架构
```
flowchart LR
ELF["Mixed MIPS ELF"] --> TAG{"Function address odd?"}
TAG -- No --> M32["Binary Ninja mips32 / mipsel32"]
TAG -- Yes --> M16["Forte mips16e / mips16el"]
M16 --> PCODE["pypcode SLEIGH p-code"]
PCODE --> FLOW["Branches and delay slots"]
PCODE --> LLIL["Binary Ninja LLIL"]
LLIL --> ANALYSIS["MLIL / HLIL / cross-references"]
```
解码器有意设计为独立于 Binary Ninja。CI 可以验证端序、指令长度、分支目标和延迟槽处理,而无需提供 Binary Ninja 许可证或专有固件。
## 验证
运行独立测试套件:
```
python -m pip install -r requirements-dev.txt -r requirements.txt
pytest
ruff check .
```
在 Binary Ninja 内部,使用 **Tools → Forte → Run Decoder Self-Test**。覆盖率命令会报告在 Forte 函数中遇到的每个 p-code 操作码,并清晰地标识出仍然回退到未实现 LLIL 的操作。
此仓库中不包含任何固件镜像、供应商二进制文件、凭据或 Binary Ninja 数据库。
## 状态与限制
Forte 是一个 alpha 架构插件。它已经可用于控制流恢复和常见的固件代码,但它尚未被证明具有完整的 MIPS16e ISA 或 LLIL 覆盖率。
- 不常见的 SLEIGH 操作可能会发出 `LLIL_UNIMPL`。
- DSP、协处理器和异常的浮点行为需要更多的测试夹具(fixtures)。
- 现有数据库可能保留了在安装 Forte 之前创建的不正确的函数;重新打开原始 ELF 可以提供最干净的分析。
- 首个发布版本针对 32 位 MIPS16e。MIPS16e2 和供应商扩展需要单独验证。
在提交错误报告时,请尽可能附加上最小可分发的字节序列——而不是受版权保护的固件。
## 路线图
- 扩展经验证的 p-code 到 LLIL 覆盖率
- 添加来自可自由分发的 MIPS16e 二进制文件的语料库测试
- 通过间接调用改善模式转换
- 添加架构修补和汇编支持
- 将 Forte 提交到 Binary Ninja 的社区插件仓库
## 贡献
欢迎提供专注于特定问题的测试夹具、提升器(lifter)修正和混合模式 ELF 报告。
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 和[安全策略](SECURITY.md)。
## 许可证
Forte 基于 [MIT 许可证](LICENSE) 提供。
标签:Binary Ninja插件, MIPS架构, pypcode, Wayback Machine, 二进制分析, 云安全运维, 云资产清单, 反汇编, 固件分析, 逆向工具, 逆向工程