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 中使用

Apache-2.0

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