4 个稳定版本
1.0.4 | 2023 年 9 月 16 日 |
---|---|
1.0.1 | 2023 年 9 月 10 日 |
#1343 在 解析实现
140KB
1K SLoC
阿里安是一个工具,旨在在没有调试信息的情况下识别 Rust PE 可执行文件中的函数。它注重最小化对其他工具的依赖。
符号恢复前后
警告
该工具目前处于实验阶段,不应被视为完整且准确。
它受到 Cerberus 的启发,并实现了类似的原则,但针对 PE 文件。
仅限 Windows 系统。
安装
git clone https://github.com/N0fix/Ariane
cd Ariane
cargo install --path .
外部依赖
请确保您已安装以下依赖项
用法
提供多个命令
Usage: ariane.exe <COMMAND>
Commands:
info Print recognized dependencies
download Download and extract recognized dependencies to target directory
recover Try to recover symbols
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
符号恢复
首先,您需要提供目标函数列表。可以从 IDA 提取它们并转换为正确格式的脚本位于 tools/IDA_extract_functions
目录下。
该函数列表应采用 JSON 格式,并具有以下结构
{
"functions": [
{
"name": "sub_140001000",
"start": 4096,
"end": 4230
},
[... more entries ...]
]
}
然后,将此 JSON 文件作为参数传递,并指定目标文件和输出文件。
$env:RUST_LOG = "info" ; ariane.exe -i functions_list.json no_symbols_target.exe resolved_symbols.json
输出文件将采用 JSON 格式,并将包含已解析的符号、它们的物理地址(PA)和相对虚拟地址(RVA)。在 tools/output_to_idc.py 脚本中可以找到一个脚本,可以生成 IDA IDC 脚本。此 IDC 脚本将重命名所有已解析的符号,以帮助您进行分析。
限制
- 所有通用函数一旦编译,就会产生一个自定义输出,该工具无法猜测,因此无法识别。这些函数有很多,这可能是某些情况下该方法结果不佳的原因。
- 可能无法检测到所有依赖项。目前,重点是寻找基本工件,旨在捕获低垂的果实。
- 已努力识别、编译和哈希可能用作目标的非默认功能。有可能某些功能无法检测、编译和哈希,从而导致无法识别某些函数。
- 小型函数可能会被识别为多个不同的函数,您需要从 JSON 输出中选择最合适的函数。
常见问题解答
它能在 Linux 上运行吗?
不能。
它是如何工作的?
该工具通过查找特定字符串来搜索目标依赖项。它识别编译目标使用的 rustc 版本,并使用它编译所有依赖项,包括符号。这些符号用于识别函数并模糊哈希。然后将此哈希与目标中的哈希函数进行比较。
为什么不能生成带有符号的 pdb 文件?
生成PDB文件不是一个容易的任务,据我所知,它需要大量的依赖(LLVM)。
这与Cerberus有什么不同?
本项目专注于从PE文件中恢复符号,特别是针对Rust可执行文件。Cerberus旨在从Golang和Rust的ELF文件中恢复符号。Cerberus计划在不久的将来支持PE文件。如果这个工具对你不起作用,请测试Cerberus!
为什么我必须将函数作为参数传递?这个工具不能检测它们吗?
如果没有将函数作为参数传递,默认行为是从异常数据目录中读取定义的函数,因为主Rust函数在这里被引用。这将捕获许多函数,但也会错过很多。
识别函数的开始和结束可能看起来像是一项简单的任务,但实际上相当具有挑战性。很少有工具能够以合理的信心识别它们,而且我没有找到处理函数识别的可靠Rust crate。虽然smda-ra(smda的移植版)显示出希望,但其开发似乎已经停止。我更倾向于依赖在这个任务上表现卓越的工具(如IDA、Binary Ninja或radare2),而不是自己实现。
谢谢
依赖项
~34–49MB
~883K SLoC