2

少し背景から始めましょう。

今朝、私たちのユーザーの 1 人が、Testuff のセットアップ ファイルが CA アンチウイルスによってウイルスに感染していると報告されたと報告しました。これは誤検知だと確信して Web を調べたところ、別のプログラム (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 とスパイボットに相談する必要があるでしょう。

于 2008-09-23T12:14:51.543 に答える