Washi1337/ghidra-nativeaot
GitHub: Washi1337/ghidra-nativeaot
一款 Ghidra 插件,用于辅助逆向分析 .NET Native AOT 编译的无符号二进制文件,重建类型结构和元数据信息。
Stars: 272 | Forks: 28
# Ghidra + .NET Native AOT
这是一个 Ghidra 分析器和 UI 插件,可用于辅助逆向分析使用 .NET 8.0 及以上版本引入的 .NET Native AOT 技术编译的二进制文件。此类文件通常无法获取符号,因此也难以轻松制作 FunctionID (FID) 数据库。
另请参阅随附的[博客文章](https://blog.washi.dev/posts/recovering-nativeaot-metadata/),了解其工作原理。
## 功能
- [x] 完整的类型层次结构 (Method Table) 重建
- [x] 冻结对象 (Frozen Object) 标注(例如字符串)
- [x] 交互式元数据浏览器
- [x] 重构引擎
## 截图
自动进行冻结对象(例如字符串字面量)标注。

自动进行 VTable 重定向检测。

重构虚方法及相关符号。

## 构建
在根目录下运行 `gradle`:
```
$ gradle
```
这将在 `dist/` 文件夹中生成一个插件 ZIP 文件。
运行上述命令的前提是 Ghidra 已安装在 `/opt/ghidra` 目录下。
如果你的机器上 Ghidra 安装在其他位置,可能需要指定 Ghidra 的安装目录,以便其能够找到相应的依赖项:
```
$ gradle -PGHIDRA_INSTALL_DIR=/path/to/ghidra
```
## 安装
在主项目窗口中,通过 `File > Install Extensions` 菜单安装该插件。
## 快速入门指南
步骤:
- 确保你已安装该插件(参见[构建](#building)和[安装](#installing))。
- 在代码浏览器中打开一个 .NET NativeAOT 二进制文件。
- 可选步骤:如果符号已被剥离,请找到并标记名为 `__ReadyToRunHeader` 的 ReadyToRun 头部(详见下文)。
- 运行 Native AOT Analyzer(作为单次分析或自动分析的一部分均可)。
- 从 Windows 菜单中打开 Native AOT Metadata Browser。
## 定位 ReadyToRun 目录
ReadyToRun 数据目录是所有 .NET Native AOT 元数据的根节点。
由于该目录并非 PE 头部中指定的常规 PE 数据目录,插件会尝试通过以下启发式方法进行查找:
- 首先,它会优先使用符号 `__ReadyToRunHeader`,或标记目录列表的符号对 `__modules_a` 和 `__modules_z`。
- 如果在这些符号名下未找到有效的头部,它将启发式地扫描所有非可执行内存块,以查找已知模式(即 `RTR\0` 签名及其头部中的一些预期字段)。
如果你发现此过程不起作用(例如没有匹配项或匹配项过多),RTR 目录列表(即 `__modules_a`)也会在任何 NativeAOT 二进制文件的启动代码中被引用。
具体而言,它作为 `wmain` 中调用 `S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules` 时的**第二个参数**被引用。
你可以通过以下方式找到此调用:例如,使用 Native AOT 编译一个带符号的简单 Hello World 应用程序,并使用 Ghidra 的 Version Tracking Tool 来对比函数。
左:Hello World 应用程序,右:未知的 Native AOT 二进制文件([Flare-On 11 的 Challenge fullspeed.exe](https://washi1337.github.io/ctf-writeups/writeups/flare-on/2024/7/)):

`InitializeModules` 调用的第二个参数(截图中的 `PTR_1401927b0`)是一个指针数组:

当指针指向以 `RTR\0` 开头的数据时,你就可以确认该指针引用的是 ReadyToRun 目录:

一旦你为带有标签 `__ReadyToRunHeader` 的数据做好了标记,就可以使用该分析器了。
## 开发
任何支持 Gradle 的编辑器都应该适用,包括 Eclipse、IntelliJ 和 Visual Studio Code。
为了快速重新安装插件并启动 ghidra,可以使用类似以下的命令(请相应地修改文件路径):
Linux (Bash):
```
$ gradle && unzip -o dist/*.zip -d ~/.config/ghidra/ghidra_X.X_PUBLIC/Extensions/ && ghidra
```
Windows (Powershell):
```
gradle; Expand-Archive .\dist\*.zip -DestinationPath $env:APPDATA\ghidra\ghidra_X.X_PUBLIC\Extensions -Force; Z:\Path\To\Ghidra\ghidraRun.bat
```
## 许可证
MIT
## 鸣谢
浏览器图标来自 https://intellij-icons.jetbrains.design/(基于 Apache 2.0 许可证)
标签:Ghidra插件, JS文件枚举, Native AOT, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 后台面板检测, 域名枚举, 逆向工程, 静态分析