我最近开始使用 bindiff 并努力理解匹配算法。我已经阅读了几篇文章,例如:
T. Dullien 和 R. Rolles。基于图形的可执行对象比较、BinSlayer、二进制可执行文件的准确比较,以及 bindiff 手册https://www.zynamics.com/bindiff/manual/#chapUnderstanding question about bindiff
并且所有文章在解释匹配算法方面都不同。
我无法理解的是函数签名和函数属性之间的区别。
从手册:
签名包括:
- 码块数
- 代码块之间的边数
- 调用子函数的次数
一旦生成了两组签名(用于两个可执行文件),就会创建初始匹配。如果签名在两个检查的签名子集中出现一次(并且仅出现一次),则创建匹配。
所以使用函数的签名来构造初始匹配。但是在那篇文章之后告诉我们函数属性。
属性:
BinDiff 有一个适合生成匹配的函数属性列表(哈希匹配、名称匹配等)。它从全局级别开始,考虑二进制的所有函数并计算每个函数的第一个属性。在初始全局匹配步骤之后,每个新匹配的父母(调用者)和孩子(被调用者)被考虑
那么签名与属性有何不同?它们都用于构建初始匹配。首先应用什么策略来构造初始匹配:签名匹配还是函数字节哈希匹配?