3

わかりましたので、C# で基本的なマルウェア スキャナーを作成しようとしています。私の質問は、特定のコードのビットに対して 16 進数の署名があると言うことです。

例えば

        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\test.txt");
        }

        //Which will have a hex of 53797374656d2e494f2e46696c652e44656c657465284022433a5c55736572735c5075626c69635c44656c657465546573745c746573742e74787422293b

- に変更されます

        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\notatest.txt");
        }
//Which will have a hex of 53797374656d2e494f2e46696c652e44656c657465284022433a5c55736572735c5075626c69635c44656c657465546573745c6e6f7461746573742e74787422293b

これらのビットは、プログラムの 16 進数全体に含まれることに注意してください。ベース シグネチャを取得して、90% 一致するとフラグが立てられるという部分一致を探すにはどうすればよいでしょうか。

私はワイルドカードを使用しますが、コーディングがわずかに異なる可能性がありますが、大部分は同じである、もう少し複雑なものでは機能しません。部分文字列のパーセント一致を行う方法はありますか? レーベンシュタイン距離を調べていましたが、この特定のシナリオにどのように適用するかわかりません。

ご意見をお寄せいただきありがとうございます

4

3 に答える 3

1

編集距離を使用しても問題ありません。2 つの文字列を取得して編集距離を計算できます。これは、1 つの文字列を別の文字列に取得するために必要な操作の数を示す整数値になります。その数に基づいて独自のしきい値を設定します。

たとえば、距離が 5 編集未満の場合、変更が関連するように静的に設定できます。

比較している文字列の長さを取得し、そのパーセンテージを取得することもできます。あなたの例は 36 文字の長さなので(int)(input.Length * 0.88m)、有効なしきい値になります。

于 2012-08-20T20:57:29.743 に答える
1

まず、プログラムのビットが正確に一致する必要があります。そうでない場合は、変更されているか破損しています。通常、元のバイナリに MD5 ハッシュを保存し、MD5 を新しいバージョンと照合して「十分に同じ」かどうかを確認します (MD5 は 100% の一致を保証できません)。

さらに、ランダムなバイナリでマルウェアを検出するには、どのようなパターンを探す必要があるかを知る必要があります。たとえば、マルウェアの一部がバイナリ XYZ を含むコードを挿入することがわかっている場合、実行可能ファイルのビットで XYZ を探します。もちろん、マルウェアのビットがチャンクに分散する可能性があるため、パターンはそれよりもはるかに複雑になります。さらに興味深いのは、一部のウイルスは自己変形するということです。これは、実行するたびに自分自身を変更することを意味します。つまり、スキャナーは正確なパターンを見つけられません。このような場合、スキャナーは生成できる派生物のタイプを認識し、それらすべてを探す必要があります。

一致率を見つけるという点では、制約がない限り、この操作は非常に時間がかかります。2 つの文字列を比較しても、どの部分が削除、追加、または置換されたかはわかりません。たとえば、開始文字列が「ABCD」の場合、コンテンツが追加されてから「AABCDD」は 100% 一致以下ですか? 「ABCDABCD」はどうでしょう。ここでは 2 回一致します。「AXBXCXD」はいかがですか?「CDAB」はどうですか?

ファイルのどの部分が変更されたかを示すことができる多くの DIFF ツールが存在します (% につながる可能性があります)。残念ながら、上で説明した問題のため、どれも完璧ではありません。偽陰性、偽陽性などがあることに気付くでしょう。これはあなたにとって「十分」かもしれません。

自分に適した特定のアルゴリズムを特定する前に、検索の制限を決定する必要があります。そうしないと、スキャンが NP 困難になり、実行時間が不合理になります (1 つのファイルをチェックするためだけに、スキャナーが 1 日中実行される可能性があります)。

于 2012-08-20T21:17:04.830 に答える
0

レーベンシュタイン距離ダメラウ・レーベンシュタイン距離を調べることをお勧めします。

前者は、ある文字列を別の文字列に変換するために必要な追加/削除操作の数を示します。後者は、ある文字列を別の文字列に変換するために必要な追加/削除/置換操作の回数を示します。

ユーザーが何かを検索できるプログラムを作成するときに、私はこれらをかなり頻繁に使用しますが、正確なスペルを知らない可能性があります。

両方の記事にコード例があります。

于 2012-08-21T05:02:51.783 に答える