2008-09-23 6 views
1

Lassen Sie mich mit ein wenig Hintergrund beginnen.Finden Sie passende Sequenzen in zwei Binärdateien

Heute morgen berichtete einer unserer Benutzer, dass die Setup-Datei von Testuff vom CA Antivirus als mit einem Virus infiziert gemeldet wurde. In der Gewissheit, dass dies eine falsche positive war, habe ich im Internet gesucht und festgestellt, dass Benutzer eines anderen Programms (SpyBot) das gleiche Problem gemeldet haben.

A jetzt, für die eigentliche Frage.

Vorausgesetzt, das Antivirenprogramm sucht nach einer bestimmten Binärsignatur in der Datei, würde ich gerne die passenden Sequenzen in beiden Dateien finden und hoffentlich eine Möglichkeit finden, das Setup-Skript zu optimieren, um zu verhindern, dass diese Sequenz erscheint.

Ich habe das folgende in Python versucht, aber es läuft seit einer langen Zeit jetzt und ich fragte mich, ob es einen besseren oder schnelleren Weg gab.

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)) 

Gibt es eine bessere Bibliothek für Python oder für eine andere Sprache, die das tun kann? Eine andere Möglichkeit, das Problem anzugehen, ist ebenfalls willkommen.

Antwort

4

Siehe the longest common substring problem. Ich nehme an, dass difflib die DP-Lösung verwendet, die sicherlich zu langsam ist, um ausführbare Dateien zu vergleichen. Mit Suffixbäumen/Arrays können Sie viel besser machen.

Perl Tree::Suffix könnte einfachste Lösung sein. Offenbar gibt es alle gängigen Substrings in einem bestimmten Längenbereich:

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

Warum kontaktieren Sie nicht CA und bitten Sie sie, ihnen zu sagen, wonach sie suchen, für diesen Virus?

Oder Sie könnten die Datei kopieren und jedes einzelne Byte ändern, bis die Warnung verschwindet (je nach Größe kann es eine Weile dauern).

Es ist möglich, dass die Virenerkennung viel komplizierter ist, als einfach nach einer festen Zeichenfolge zu suchen.

1

Besser nicht wundern über die Komplexität und Zeit, die diese Art von Algorithmen benötigen.

Wenn Sie Interesse daran haben - hier .ps document linked here finden Sie eine gute Einführung in dieses Thema.

Wenn eine gute Implementierung für diese Algorithmen existiert, kann ich nicht sagen.

2

Beachten Sie, dass, auch wenn Sie es auf diese Weise gefunden haben, gibt es keine Garantie, dass die längste Match tatsächlich derjenige ist, für zu werden gesucht. Stattdessen finden Sie möglicherweise einen gemeinsamen Initialisierungscode oder String-Tabellen, die zum Beispiel vom selben Compiler hinzugefügt wurden.

0

Ich vermute, dass die Suche nach Binärzeichenfolgen Ihnen nicht helfen wird. Ein Installationsprogramm wird wahrscheinlich einige "verdächtige" Dinge tun.

Sie müssen wahrscheinlich mit CA und Spybot über die White-Listing Ihres Installers oder darüber, was die Warnung auslöst sprechen.