我在本网站的其他几个问题中看到了这一点。但 IDA Pro 中的 FLIRT 签名是什么?我什么时候创建自己的供使用?
什么是 FLIRT 签名?
FLIRT 代表快速图书馆识别和识别技术。
Peter 解释了基础知识,但这里有一份关于它如何实施的白皮书:
https://www.hex-rays.com/products/ida/tech/flirt/in_depth.shtml
为了解决这些问题,我们创建了一个数据库,其中包含我们想要识别的所有库中的所有函数。IDA 现在检查被反汇编程序的每个字节,这个字节是否可以标记标准库函数的开始。
识别算法所需的信息保存在签名文件中。每个功能都由一个模式表示。模式是函数的前 32 个字节,其中标记了所有变体字节。
它有点旧(来自 IDA 3.6)但基础知识仍然适用。
要创建您自己的签名,您需要 FLAIR 工具,该工具可以单独下载。
(FLAIR 的意思是用于识别和识别的快速图书馆获取)
IDA Pro 书籍有一章关于 FLIRT 和使用 FLAIR 工具。
调情签名是一种用于匹配已知函数头的模式。例如,考虑以下内容:
push ebp
mov ebp, esp
sub esp, 4Ch
mov [ebp+var_4], eax
push ebx
push edi
...
编译器可以自由地将任何寄存器更改为另一个寄存器或移动任何内容,因此这完全取决于编译器认为最佳的内容。在其他地方编译时,编译器可能会选择使用其他寄存器,例如:
push ebp
mov ebp, esp
sub esp, 4Ch
mov [ebp+var_4], eax
push ecx
push esi
...
现在您有几个选项可以尝试匹配它。要么天真地从指令序列创建一个签名:
push X
mov X
sub X
mov X
push X
push X
...
假设堆栈帧使用 ebp 和 esp,这实际上比听起来更危险。函数使用 ebp 作为通用寄存器是很常见的:
push ebp
mov ebp, esp
sub esp, 4Ch
mov [ebp+var_4], X
push X
push X
...
IDA 调情签名试图根据函数的许多初始字节来创建这些类型的签名。他们试图解决的问题是识别常用的重用代码。这些签名是通过使用各种编译器编译各种常用库来生成的。一旦编译器生成了一个库,IDA 就会有工具从这个库中提取签名,同时将其与其源定义相匹配。一段时间后,您可以为公共库建立相当多的签名,这将为您节省相当多的时间。
有关识别程序异同的相关问题的更复杂的解决方案,请参阅BinDiff。它使用更高级的启发式方法。
我在上面用作示例的签名相当没有价值,因为它太通用了,会产生很多误报匹配。
来自 Hex-Rays 网站:
A signature file contains patterns of standard runtime functions.
With their help, IDA is able to recognize the standard functions and names them accordingly.
为了充分披露,我并没有真正从头开始创建供我自己使用的任何东西。我想创建自己的可能会有帮助的一个例子是,如果您有很多属于同一家族的恶意软件。通常,他们编写和使用自己的库函数,因此 FLIRT 签名在这里提供帮助是有意义的。
作为额外的奖励,这里是 FLIRT 签名的公共存储库。