2008-09-23 125 views
1

让我从一些背景开始。查找两个二进制文件中的匹配序列

今天早上我们的一位用户报告说,Testuff的安装文件被CA病毒感染了病毒。确信这是一个误报,我查看了网络,发现另一个程序(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库或其他语言可以做到这一点? 解决问题的方法也完全不同。

回答

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

为什么不联系CA并要求他们告诉他们他们在寻找什么病毒?

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

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

1

更好的不要想知道这些算法需要的复杂性和时间。

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

如果这些算法有一个好的实现存在,我不知道。

2

请注意,即使你没有发现它这样,也不能保证是最长匹配实际上是正在寻找的人。相反,您可能会发现例如由相同编译器添加的公共初始化代码或字符串表。

0

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

您可能需要与CA和Spybot谈谈关于将您的安装程序白名单或关于触发警报的内容。