Dump-GUY/ida-nativeaot

GitHub: Dump-GUY/ida-nativeaot

一款 IDA Pro 插件,通过解析 ReadyToRun 元数据来恢复符号剥离的 .NET Native AOT 二进制文件中的类型系统、虚方法和字符串字面量。

Stars: 37 | Forks: 1

# IDA NativeAOT 🧩 [![Python 3](https://img.shields.io/badge/Python-3.x-blue?logo=python&logoColor=white)](https://www.python.org/) [![IDA Pro](https://img.shields.io/badge/IDA%20Pro-9.2%2B-orange)](https://hex-rays.com/ida-pro/) [![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)

NativeAOT Metadata Browser - Overview tab

这是一个由两个文件组成的 IDA Pro 插件,用于逆向分析 **.NET Native AOT** 二进制文件(.NET 7/8/9/10)。 这些文件附带了被剥离的符号,因此 IDA 会显示数千个未命名的 `sub_*` 函数。该插件 解析运行时的 **ReadyToRun** 元数据以重建 .NET 类型系统,对代码进行命名, 并在一个可导航的浏览器中呈现所有内容。 这是 Washi 优秀的 Ghidra 插件的 IDAPython 移植版 **[washi1337/ghidra-nativeaot](https://github.com/washi1337/ghidra-nativeaot)** (参阅他的文章:[Recovering NativeAOT Metadata](https://blog.washi.dev/posts/recovering-nativeaot-metadata/))。 ## 兼容性 | IDA 版本 | Qt | Python Qt 绑定 | 插件支持 | |---|---|---|---| | **8.x — 9.1** | Qt5 | PyQt5 | **❌ 不支持** | | **9.2+** | Qt6 | PySide6 | **✅ 支持**(在 **9.3** 上开发与测试) | 该插件的 UI **仅支持 PySide6**,即 IDA 在 **9.2** 版本中采用的 Qt 绑定。仅支持 x86-64 小端序目标(与上游一致)。Hex-Rays 反编译器是可选的,但推荐使用。 ## 功能说明 1. 定位 **ReadyToRun (RTR)** 元数据目录(通过符号或签名扫描)。 2. 将压缩的元数据**重组**到 `hydrated` 段(.NET 8+)中,或者在不可用时回退到指针扫描(.NET 7/10)。 3. 重建完整的 **MethodTable / EEType** 类型层次结构 —— 基类型、接口、vtable。 4. 识别 `System.Object` / `System.String` 并命名虚方法。 5. 标注**冻结对象** —— 字符串字面量、数组、装箱值。 ## 在 IDB 中的生成结果 - 先前为空的 **`hydrated` 段被填充**了解压后的元数据。 - 为每种类型生成**结构体类型**(Local Types):`_MT`、`_vtbl` 以及 `` 实例布局,并包含基类 vtable 嵌入和接口数组。 - 在每个 MethodTable 处生成 **MethodTable 标签** `_MT`,并使用其结构体指定类型。 - **命名的虚方法**:`::Method_N`(槽位 0–2 → `ToString`/`Equals`/`GetHashCode`),标记为 `__thiscall` 并为 `this` 指定类型 —— Hex-Rays 将显示例如 `void __thiscall Foo::Method_4(Foo *this)`。 - **冻结的字符串字面量**:UTF-16 字符串,标记为 `dn__`,并将确切的文本作为重复注释。 - 使用其实例/元素类型指定类型的**冻结数组 / 装箱对象**。 - 在数据库旁边生成一个文本报告(`.naot_report.txt`),以及 IDB 中的压缩元数据缓存(实现浏览器的即时重新打开)。 在实际的 .NET 8 样本上的典型结果:约 4900 个 method table,约 3000 个被命名的方法,恢复了约 2500 个字符串字面量。 ## 浏览器 标签页:**Overview**(RTR 信息、区段、统计信息) · **Type Hierarchy**(继承树 + 各类型的方法/接口) · **Methods** · **Strings** · **Frozen Data**。双击任意行即可在 IDA 中跳转;右键单击可复制或重命名;类型种类带有彩色图标。 **实时同步** —— 浏览器会跟踪 IDA 的重命名操作(手动、**FLIRT**、**Lumina**)并自动更新自身;**↻ 刷新名称** 会强制重新读取。右键单击 **Rename type (propagate)** 可重命名类*及其*方法(`Old::M` → `New::M`),而不会覆盖 FLIRT/用户指定的名称。类型和方法名称将完整显示并进行 demangled,映射出已应用于数据库的任何符号(例如来自 PDB 的符号)。 ### 截图 *示例:`FlirtCoverage.dll`(.NET 8)的 NativeAOT 构建版本及其应用的 PDB。Overview 标签页显示在本页顶部。* **Type Hierarchy** - `System.IO.FileStream` 继承链以及各类型的详细信息窗格(基类型、接口、vtable 槽位)。名称是完整的且已 demangled,直接来自应用的 PDB。 ![Type Hierarchy tab](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/893615f9da222856.png) **Methods** - 过滤 `canWrite` 会定位到 `System.IO.Stream` 槽位 4 的 `FileStream::get_CanWrite`。 ![Methods tab](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/ffa092c0bb222902.png) **Strings** - 恢复的冻结字面量(`ws://127.0.0.1:0/`),以及它如何在 Hex-Rays 伪代码中作为 `dn_…` 标签内联读取。 ![Strings tab](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/637b2b5fbe222908.png) ## 安装说明 将**这两个**文件复制到您的 IDA plugins 目录中(它们必须放在一起 —— 插件会从同一个文件夹加载引擎): **按用户(推荐 —— 在 IDA 重装后依然保留):** ``` %APPDATA%\Hex-Rays\IDA Pro\plugins\ida-nativeaot_browser.py %APPDATA%\Hex-Rays\IDA Pro\plugins\ida-nativeaot.py ``` **全系统:** ``` \plugins\ida-nativeaot_browser.py \plugins\ida-nativeaot.py ``` 重启 IDA,然后通过 **`Edit → Plugins → NativeAOT Metadata Browser`** 或 **`Ctrl-Shift-N`** 打开。 首次运行会分析元数据并将其缓存到 IDB 中;后续打开是即时的。 ### IDA Plugin Manager (HCLI) 该插件附带了一个 `ida-plugin.json`。这是一个双文件插件 - `ida-nativeaot_browser.py` 是 `entryPoint`,而 `ida-nativeaot.py` 是它导入的辅助模块 - Plugin Manager 会将**这两个**文件安装在一起(它会提取整个插件目录,而不仅仅是入口点)。一旦发布到 plugins.hex-rays.com,请使用以下命令安装: ``` hcli plugin install ida-nativeaot ``` ## 许可证 基于 **MIT License** 授权 —— 参见 [LICENSE](LICENSE)。这是从基于 MIT 许可证的 [washi1337/ghidra-nativeaot](https://github.com/washi1337/ghidra-nativeaot) 移植的衍生作品。 ## 致谢 **原始研究及 Ghidra 插件:** [Washi](https://github.com/washi1337) ([@washi1337](https://github.com/washi1337)) — [ghidra-nativeaot](https://github.com/washi1337/ghidra-nativeaot) 以及博客文章 [Recovering NativeAOT Metadata](https://blog.washi.dev/posts/recovering-nativeaot-metadata/)。 此 IDA 插件是他作品的忠实移植。 **IDA 移植及浏览器 UI:** Jiří Vinopal   X / Twitter: [@vinopaljiri](https://x.com/vinopaljiri)   GitHub: [Dump-GUY](https://github.com/Dump-GUY)
标签:IDA Pro插件, 二进制分析, 云安全运维, 云资产清单, 元数据恢复, 逆向工具, 逆向工程