ruizkinio/forte-binja

GitHub: ruizkinio/forte-binja

Forte 为 Binary Ninja 提供独立的 MIPS16e 反汇编、混合模式 ELF 路由和 LLIL 提升能力,解决了原生 MIPS 架构无法解码压缩指令的问题。

Stars: 1 | Forks: 0

# Forte **为 Binary Ninja 提供的 MIPS16e 支持——混合模式 ELF 路由、反汇编和 LLIL。** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/ruizkinio/forte-binja/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Binary Ninja](https://img.shields.io/badge/Binary%20Ninja-4.0%2B-orange.svg)](https://binary.ninja/) [![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB.svg)](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, 二进制分析, 云安全运维, 云资产清单, 反汇编, 固件分析, 逆向工具, 逆向工程