在两个二进制文件中查找匹配序列

时间:2008-09-23 07:46:03

标签: python binary diff antivirus

让我先介绍一下背景。

今天早上,我们的一位用户报告称,CA抗病毒软件已报告Testuff的安装文件已被病毒感染。我确信这是误报,我在网上查看并发现另一个程序(SpyBot)的用户报告了同样的问题。

现在,对于实际问题。

假设防病毒软件在文件中寻找特定的二进制签名,我想在两个文件中找到匹配的序列,并希望找到一种方法来调整安装脚本以防止出现该序列。

我在Python中尝试了以下内容,但它已经运行了很长时间,我想知道是否有更好或更快的方式。

from difflib import SequenceMatcher

spybot = open("spybotsd160.exe", "rb").read()
testuff = open("TestuffSetup.exe", "rb").read()

s = SequenceMatcher(None, spybot, testuff)
print s.find_longest_match(0, len(spybot), 0, len(testuff))

是否有更好的Python库或其他语言库可以做到这一点? 解决这个问题的方法也完全不同。

5 个答案:

答案 0 :(得分:4)

the longest common substring problem。我猜difflib使用DP解决方案,这对于比较可执行文件肯定太慢了。使用后缀树/数组可以做得更好。

使用perl Tree::Suffix可能是最简单的解决方案。显然,它给出了指定长度范围内的所有公共子串:

@lcs = $tree->lcs;
@lcs = $tree->lcs($min_len, $max_len);
@lcs = $tree->longest_common_substrings;

答案 1 :(得分:2)

请注意,即使您确实以这种方式找到它,也无法保证最长匹配实际上是正在寻找的匹配。相反,您可能会找到由同一编译器添加的常见初始化代码或字符串表。

答案 2 :(得分:1)

为什么不联系CA并要求他们告诉他们他们正在搜索的病毒?

或者,您可以复制文件并更改每个字节,直到警告消失(可能需要一段时间,具体取决于大小)。

病毒检测可能比简单地查找固定字符串要复杂得多。

答案 3 :(得分:1)

最好不要怀疑这些算法需要的复杂性和时间。

如果你对此感兴趣 - 这里.ps document linked here你可以找到对这个专题的一个很好的介绍。

如果存在这些算法的良好实现,我无法分辨。

答案 4 :(得分:0)

我怀疑寻找二进制字符串不会对你有所帮助。安装程序可能会做一些“可疑”的事情。

您可能需要与CA和spybot讨论安装程序的白名单,或者触发警报的内容。