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] 重构引擎 ## 截图 自动进行冻结对象(例如字符串字面量)标注。 ![](https://static.pigsec.cn/wp-content/uploads/repos/cas/61/615d8efec6b74beae4735c70076185aa8bc5f92765709c8dbb3570e416739bbd.png) 自动进行 VTable 重定向检测。 ![](https://static.pigsec.cn/wp-content/uploads/repos/cas/fa/fab92fdf123d2bc80fdfc66b08ee710494a23a331375c20f7260acf8dd9cfbba.png) 重构虚方法及相关符号。 ![](https://static.pigsec.cn/wp-content/uploads/repos/cas/7e/7e18b448f6eb27944e8022fd567e45dd2f49be51c43dbb0f1b7424ef6871f62d.png) ## 构建 在根目录下运行 `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/)): ![](https://static.pigsec.cn/wp-content/uploads/repos/cas/f1/f13e2d1642e01284e528a096014cfbb88e7e9b8166fe786ec776f80245c2da55.png) `InitializeModules` 调用的第二个参数(截图中的 `PTR_1401927b0`)是一个指针数组: ![](https://static.pigsec.cn/wp-content/uploads/repos/cas/9d/9dc37f387f2a314ee4da8a956dfac41a6116d5cb6cfe52829a0983d9da9db756.png) 当指针指向以 `RTR\0` 开头的数据时,你就可以确认该指针引用的是 ReadyToRun 目录: ![](https://static.pigsec.cn/wp-content/uploads/repos/cas/c3/c3ade2374ffadd3a780881c1475dc8d261d7c68c683c7237aa53f24c0f70f1ba.png) 一旦你为带有标签 `__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, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 后台面板检测, 域名枚举, 逆向工程, 静态分析