2

让我从一些背景开始。

今天早上,我们的一位用户报告说,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

5 回答 5

5

请参阅最长的公共子串问题。我猜 difflib 使用了 DP 解决方案,这对于比较可执行文件来说肯定太慢了。使用后缀树/数组可以做得更好。

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

@lcs = $tree->lcs;
@lcs = $tree->lcs($min_len, $max_len);
@lcs = $tree->longest_common_substrings;
于 2008-09-23T08:00:13.137 回答
2

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

于 2008-09-23T08:30:15.063 回答
1

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

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

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

于 2008-09-23T07:51:00.257 回答
1

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

如果您对此处链接的此 .ps 文档感兴趣,您可以找到对该主题的良好介绍。

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

于 2008-09-23T07:55:47.890 回答
0

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

您可能需要与 CA 和 spybot 讨论将您的安装程序列入白名单或触发警报的原因。

于 2008-09-23T12:14:51.543 回答