34个版本
0.8.10 | 2024年3月10日 |
---|---|
0.8.8 | 2023年6月27日 |
0.8.6 | 2022年12月13日 |
0.7.0 | 2021年11月15日 |
0.4.4 | 2020年9月8日 |
#798 in 解析器实现
在 2 crates 中使用
1MB
2K SLoC
lancelot-flirt
一个用于解析、编译和匹配 快速库识别和识别技术 (FLIRT) 签名的Rust库。这些签名通常由Hex-Rays IDA Pro工具使用;这个库是通过逆向工程匹配引擎并重新实现解析器和匹配器得到的。您可以使用这个库匹配FLIRT签名与字节序列,以识别静态链接代码而无需使用IDA Pro。
Python绑定 通过 PyO3 为Python 3.x生成,可在PyPI上作为 python-flirt 使用。
用法
将此添加到您的 Cargo.toml
[dependencies]
lancelot-flirt = "0.6"
以下是一个示例,它从一个字符串中解析FLIRT签名并将其与字节序列进行匹配
use lancelot_flirt;
// signature in .pat file format.
// note: .sig file format also supported, see `lancelot_flirt::sig::*`.
const PAT: &'static str = "\
518B4C240C895C240C8D5C240C508D442408F7D923C18D60F88B43F08904248B 21 B4FE 006E :0000 __EH_prolog3_GS_align ^0041 ___security_cookie ........33C5508941FC8B4DF0895DF08B4304894504FF75F464A1000000008945F48D45F464A300000000F2C3
518B4C240C895C240C8D5C240C508D442408F7D923C18D60F88B43F08904248B 1F E4CF 0063 :0000 __EH_prolog3_align ^003F ___security_cookie ........33C5508B4304894504FF75F464A1000000008945F48D45F464A300000000F2C3
518B4C240C895C240C8D5C240C508D442408F7D923C18D60F88B43F08904248B 22 E4CE 006F :0000 __EH_prolog3_catch_GS_align ^0042 ___security_cookie ........33C5508941FC8B4DF08965F08B4304894504FF75F464A1000000008945F48D45F464A300000000F2C3
518B4C240C895C240C8D5C240C508D442408F7D923C18D60F88B43F08904248B 20 6562 0067 :0000 __EH_prolog3_catch_align ^0040 ___security_cookie ........33C5508965F08B4304894504FF75F464A1000000008945F48D45F464A300000000F2C3
---";
// utcutil.dll
// MD5 abc9ea116498feb8f1de45f60d595af6
// SHA-1 2f1ba350237b74c454caf816b7410490f5994c59
// SHA-256 7607897638e9dae406f0840dbae68e879c3bb2f08da350c6734e4e2ef8d61ac2
// __EH_prolog3_catch_align
const BUF: [u8; 103] = [
0x51, 0x8b, 0x4c, 0x24, 0x0c, 0x89, 0x5c, 0x24,
0x0c, 0x8d, 0x5c, 0x24, 0x0c, 0x50, 0x8d, 0x44,
0x24, 0x08, 0xf7, 0xd9, 0x23, 0xc1, 0x8d, 0x60,
0xf8, 0x8b, 0x43, 0xf0, 0x89, 0x04, 0x24, 0x8b,
0x43, 0xf8, 0x50, 0x8b, 0x43, 0xfc, 0x8b, 0x4b,
0xf4, 0x89, 0x6c, 0x24, 0x0c, 0x8d, 0x6c, 0x24,
0x0c, 0xc7, 0x44, 0x24, 0x08, 0xff, 0xff, 0xff,
0xff, 0x51, 0x53, 0x2b, 0xe0, 0x56, 0x57, 0xa1,
0x70, 0x14, 0x01, 0x10, 0x33, 0xc5, 0x50, 0x89,
0x65, 0xf0, 0x8b, 0x43, 0x04, 0x89, 0x45, 0x04,
0xff, 0x75, 0xf4, 0x64, 0xa1, 0x00, 0x00, 0x00,
0x00, 0x89, 0x45, 0xf4, 0x8d, 0x45, 0xf4, 0x64,
0xa3, 0x00, 0x00, 0x00, 0x00, 0xf2, 0xc3,
];
// parse signature file content into a list of signatures.
let sigs = lancelot_flirt::pat::parse(PAT).expect("failed to parse signatures");
// compile signatures into a matching engine instance.
// separate from above so that you can load multiple files.
let matcher = lancelot_flirt::FlirtSignatureSet::with_signatures(sigs);
// match the signatures against the given buffer, starting at offset 0.
// results in a list of matches (that are just signature instances).
for m in matcher.r#match(&BUF).iter() {
println!("match: {}", m.get_name().expect("failed to extract name"));
}
预期输出
match: __EH_prolog3_catch_align
注意,上述逻辑不处理以下描述的“引用”;然而,它确实给出了解析和编译规则所需设置的感观。
用法:签名文件格式
此库支持从 .sig 和 .pat 文件格式加载签名
-
.sig 文件是通常用于与 IDA Pro 进行匹配的编译签名。它们结构上压缩(不常用 zlib 类似算法压缩,此处不支持)并具有原始二进制表示。
-
.pat 文件是由
sigmake.exe
生成的ASCII编码文本文件。这些通常编译为 .sig 文件以用于 IDA Pro;然而,由于lancelot-flirt
将规则编译为其自己的中间表示形式,因此您可以直接使用它们。值得注意的是,此库支持一个轻微的扩展,以启用带有以#
开头的行的文件头,这使得您能够嵌入致谢/版权/许可。
了解上述内容后,您还可能考虑在您的客户端应用程序中支持 .pat.gz
签名文件,因为这样可以实现很高的压缩比,同时保留文件许可头和可人工检查性。
用法:匹配引用
为了区分具有共享字节表示的函数,例如调度其他地址的包装函数,FLIRT 引擎使用“引用”进行递归匹配。这个特性被广泛用于匹配现代 C/C++ 运行时库提供的常用例程。
不幸的是,客户端代码必须协调 FLIRT 匹配的递归调用。
因此,当将此库集成到客户端应用程序中时,您应该审查 lancelot::core::analysis::flirt
的匹配逻辑 这里。基本上,您需要检查函数中找到的“引用”,并递归地 FLIRT 匹配这些例程以解决最佳的匹配签名。还有一个用于 vivisect 的 Python 匹配实现 这里,它依赖于更彻底的代码流恢复。
用法:示例工具
来自 lancelot::bin::match_flirt
的工具 match_flirt
这里 使用 lancelot-flirt
识别 PE 文件中的静态链接函数。您可以将此代码用作将此库与您的客户端代码集成的模板。
许可证
本项目根据 Apache 许可证 2.0 版本(https://www.apache.org/licenses/LICENSE-2.0)授权。您不应重新分发由 Hex-Rays 分发的 FLIRT 签名;然而,这里有开源签名可供使用
依赖关系
~10–21MB
~280K SLoC