decoderloop/rust_metadata_carver

GitHub: decoderloop/rust_metadata_carver

一款 Binary Ninja 插件,用于从 Rust 二进制文件中提取并标注 panic 位置元数据,帮助逆向分析人员恢复源文件路径、行号和列号信息。

Stars: 4 | Forks: 0

# Rust Metadata Carver Binary Ninja 插件,用于从 Rust 二进制文件中查找 metadata,包括: - 来自 panic unwind metadata 的源文件位置(即嵌入在二进制文件中的 `core::panic::Location` 结构体) ![几个 Rust "core::panic::Location" 结构体的截图,它们的源文件路径均为 "library\std\src\sys\windows\stdio.rs",并且每个都包含行号和列号。](https://static.pigsec.cn/wp-content/uploads/repos/cas/86/86eb1b4d931112bfb0dc418424fa21c32caf0cae28fa5a711e6983a0a5c9c3a4.png) ![Binary Ninja 中 Tags 界面的截图,显示了大量带有源文件路径、源文件行号和源文件列号标签的标签,这些都是嵌入在 Rust 二进制文件中的 panic 位置 metadata。例如,其中一个标签的内容为 "library\std\src\sys\windows\c.rs: line 1362, col 9"。所有标签都使用 😱 表情符号作为图标。](https://static.pigsec.cn/wp-content/uploads/repos/cas/54/54a34e704a992d702e7e3816acd0f570828ba5bf14e6d691ad4e591d52f76185.png) ## 用法 该插件提供以下命令: 1. _Plugins_ > _Rust Metadata Carver_ > _Find Panic Location Paths_ 2. _Plugins_ > _Rust Metadata Carver_ > _Recover Panic Location Metadata Structures_ 首先运行 _Find Panic Location Paths_ 命令,然后再运行 _Recover Panic Location Metadata Structures_ 命令。 ### _Plugins_ > _Rust Metadata Carver_ > _查找 Panic Location Paths_ 此命令会查找二进制文件中所有同时也是可能 Rust 源文件路径的 Rust `&str` 字符串切片。 该命令将在 _Types_ 面板中创建一个新的 `&str` 类型。 ![替代文本](https://static.pigsec.cn/wp-content/uploads/repos/cas/66/66194a3a09c7c40dba14d1e27dc1101a715b943957d1d2ebd8173322b53b83c3.png) ### _Plugins_ > _Rust Metadata Carver_ > _恢复 Panic Location Metadata Structures_ **注意:这只有在您先运行了 _Find Panic Location Paths_ 命令后才能生效!** 此命令会从二进制文件中恢复所有的 `core::panic::Location` metadata 结构体。 此命令还会查找代码内部对每个 `core::panic::Location` 结构体的所有交叉引用。它会在每个引用了 `core::panic::Location` 结构体的代码位置创建一个新标签(使用 😱 表情符号标记)。 ![Binary Ninja 中反编译函数的截图,显示了带有几个函数调用的伪 C 反编译器输出。其中一个反编译代码为 `sub_47eed0("called `Option::unwrap()` on a `None` value", 0x2b, &panic_location_str_"src\main.rs")` 的函数调用在其地址上标记了 😱 表情符号。另一个 😱 的悬停文本显示为 "Tags at address 0x40a0d3: src\main.rs - Rust Panic Location Source File Path: src\main.rs: line 30, col 26"](https://static.pigsec.cn/wp-content/uploads/repos/cas/50/50f1cda09c00d8c1f093ca36353d5481693819c14a0b9168e61756cf684a21ee.png) 所有找到的 `core::panic::Location` metadata 结构体的完整列表可以在 Binary Ninja 的 _Tags_ 面板中找到。每个共享相同原始 Rust 源文件路径的 `core::panic::Location` 都会被分组在一起。 ![Binary Ninja 中 Tags 界面的截图,显示了大量带有源文件路径、源文件行号和源文件列号标签的标签,这些都是嵌入在 Rust 二进制文件中的 panic 位置 metadata。所有标签都使用 😱 表情符号作为图标。其中 `src\main.rs: line 120, col 40` 这一行被高亮显示。](https://static.pigsec.cn/wp-content/uploads/repos/cas/34/343117a837038c6ce3b581723b3e587e985971ad231395701c629ca764cb22f0.png) ## 最低版本 4689 ## 许可证 此插件采用 [MIT 许可证](./LICENSE) 发布。 ## Metadata 版本 2 ## 开发 ### 设置开发环境 要设置开发环境,包括设置 Python 虚拟环境: ``` python -m venv .venv && . .venv/bin/activate python $PATH_TO_BINARY_NINJA_INSTALLATION/scripts/install_api.py ``` ### 测试插件的本地版本 要在开发过程中在您自己的 Binary Ninja 安装中本地测试插件,请在您的开发文件夹和 [Binary Ninja 用户插件文件夹](https://docs.binary.ninja/guide/index.html#user-folder) 之间创建一个符号链接,以便您的开发文件夹能在启动时作为插件被 Binary Ninja 加载。 - MacOS: ln -s `pwd` ~/Library/Application\ Support/Binary\ Ninja/plugins/rust_metadata_carver - Linux: ln -s --relative . ~/.binaryninja/plugins/rust_metadata_carver - Windows (Powershell): New-Item -ItemType Junction -Value $(Get-Location) -Path "$env:APPDATA\Binary Ninja\plugins\rust_metadata_carver" 然后,您应该将 Binary Ninja 中以下 Python 设置的值更改为指向您开发文件夹内的虚拟环境: - `python.binaryOverride`:将其设置为您的开发虚拟环境中 Python 解释器的路径,例如 `$DEVELOPMENT_FOLDER/rust_metadata_carver/.venv/bin/python/` - `python.virtualenv`:将其设置为您的开发虚拟环境中 `site-packages` 目录的路径,例如 `$DEVELOPMENT_FOLDER/rust_metadata_carver/.venv/lib/python3.11/site-packages`
标签:Binary Ninja插件, Rust, 二进制分析, 云安全运维, 云资产清单, 元数据分析, 网络流量审计, 逆向工具, 逆向工程