Bindiff匹配算法

逆向工程 工具 工具bindiff
2021-07-05 18:02:55

我最近开始使用 bindiff 并努力理解匹配算法。我已经阅读了几篇文章,例如:

T. Dullien 和 R. Rolles。基于图形的可执行对象比较、BinSlayer、二进制可执行文件的准确比较,以及 bindiff 手册https://www.zynamics.com/bindiff/manual/#chapUnderstanding question about bindiff

并且所有文章在解释匹配算法方面都不同。

我无法理解的是函数签名和函数属性之间的区别。

从手册:

签名包括:

  • 码块数
  • 代码块之间的边数
  • 调用子函数的次数

一旦生成了两组签名(用于两个可执行文件),就会创建初始匹配。如果签名在两个检查的签名子集中出现一次(并且仅出现一次),则创建匹配。

所以使用函数的签名来构造初始匹配。但是在那篇文章之后告诉我们函数属性。

属性:

BinDiff 有一个适合生成匹配的函数属性列表(哈希匹配、名称匹配等)。它从全局级别开始,考虑二进制的所有函数并计算每个函数的第一个属性。在初始全局匹配步骤之后,每个新匹配的父母(调用者)和孩子(被调用者)被考虑

那么签名与属性有何不同?它们都用于构建初始匹配。首先应用什么策略来构造初始匹配:签名匹配还是函数字节哈希匹配?

2个回答

我最近开始使用 bindiff 并努力理解匹配算法。

(...)

那么签名与属性有何不同?

我认为您至少混淆了三件事:

  • 没有单一的匹配算法,而是一组匹配算法。或者启发式,如果你愿意。
  • 没有一个函数的签名,有多个不同的签名。
  • 函数签名(最有可能)被认为是一组函数的属性以及使用其各种属性计算的值。

通常,函数属性是给定函数的边数、节点数、入度、出度、循环数等。函数签名可以是一组这样的属性,例如一个属性元组,例如[节点、边、入度、出度]。它也可以是各种属性的计算,例如 MD-Index(根据图的拓扑结构和每个基本块的度数计算)或您提到的“函数字节哈希”,这是另一种类型的函数签名.

首先应用什么策略来构造初始匹配:签名匹配还是函数字节哈希匹配?

首先,请记住“函数字节哈希”实际上是一个函数签名。然后,在不知道 BinDiff 的确切工作原理的情况下回答您的问题,我相信他们将首先使用导致误报数量较少的启发式方法。像用于非平凡函数的“函数字节哈希”这样的签名可能会产生接近零的误报,因此,与其尝试最初匹配某些属性或使用任何容易误报的签名,他们很可能首先尝试提到的签名。

免责声明:我不是 BinDiff 的任何作者,也没有对其进行逆向工程以了解它的实际工作原理。但是,我是一个名为Diaphora 的开源替代方案的作者,我对这种工具的工作原理有所了解。

BinDiff 算法是一种可用于对恶意软件进行分类的匹配算法。它使用调用图或流控制图进行结构匹配。默认情况下,匹配函数使用三个属性(函数中块之间的边数、函数中的返回数和构成函数的基本块数)。换句话说,签名是每个函数的特征(计算​​出的属性)

指向第二个问题,适用于构建初始匹配的策略基本上是寻找唯一块(由唯一属性创建的签名)。