質問:
逆コンパイルされたソースからウイルス署名を作成する方法
MysteryMan
2014-05-21 11:21:27 UTC
view on stackexchange narkive permalink

Stoned Virusのウイルス署名を作成する必要があるという問題があります(これはどのウイルス/ファイルにも当てはまります)。

コンパイルおよび逆コンパイルされたプログラムのコピーがあると仮定しましょう。 。次に、コード内で常に存在するウイルスの最も重要な部分を特定します。私が理解しているように、ウイルスの重要な部分のバイト署名を作成するには、コンパイルされたウイルスで対応するバイトを見つける必要があります。

コンパイルされたウイルスで対応するバイトを見つけるにはどうすればよいですか。逆コンパイルされたバージョンで識別したコードからのソース?

追加:

  • コードはアセンブリ内にあります
  • 単にハッシュ署名を使用しますファイル全体はオプションではありません
  • 現在、アセンブリコードしかありませんが、いつでもコンパイルできます
  • Stonedは通常、ブートセクターにあり、ではないことを認識しています。ファイル。これは学術的な演習にすぎず、あらゆるウイルスに関連します。

編集:

これの目的は、使用できるウイルス署名を作成できるようにすることです。ファイルシステムをスキャンして、感染したファイルだけでなく、感染した可能性のあるファイルやウイルスコードのバリエーションを見つけます。このため、ファイル全体のハッシュを単純に使用することはできず、ウイルスの特定の部分を使用する必要があります。これらのパーツは識別できますが、識別したウイルスパーツのマシンコードで一致するバイトを見つける方法がわかりません。

どの逆アセンブラを使用していますか?逆アセンブルと一緒に元のオペコードを出力するオプションがないものは1つも見たことがありません。
@VitalyOsipov少なくとも[NDISASM](http://www.nasm.us/doc/nasmdoca.html)は、逆アセンブリとともに、各命令の元のバイナリコード(オペコードを含む)を出力します。
1 回答:
Stolas
2014-05-21 12:17:11 UTC
view on stackexchange narkive permalink

これを行うにはいくつかの方法があります。署名スキャンに不慣れな人の中には、ファイル全体のMD5ハッシュを使用する人もいます。これは非常に欠陥があります。レジスタの切り替えや、ファイルのタイムスタンプだけでも署名全体が変更されるためです。

よく使用される別の方法はYARA( http ://plusvic.github.io/yara/)。彼らのウェブページからの良い例:

  rulesilent_banker:banker {meta:description = "これは単なる例です" thread_level = 3 in_the_wild = true文字列:$ a = {6A 40 68 00 30 00 00 6A 14 8D 91} $ b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9} $ c = "UVODFRYSIHLNWPEJXQZAKCBGMT"条件:$ aまたは$ bまたは$ c}  

ここでは、A、B、またはCバイトのいずれかがファイル内にある必要があると言われています。

使用される別の方法(ただし、これはよりヒューリスティックな方法です)非表示にしようとする方法を検出することです。たとえば、難読化、暗号化の奇数ジャンプ(pop、retでアドレスにジャンプするなど)。

よく使用される別の方法(これは署名ベースではありませんが)はIOCです。これについては、 http:/を参照してください。 /www.openioc.org/

あなたはYARAを探していると思います。YARA署名を書くための注意、優れたマルウェア/エクスプロイトの作者は可能な限りすべてをランダム化します。したがって、「変更できない」パーツを見つけてください。

さて、YARAを見てみましょう。次のようなコマンドがある場合、$ aのような16進行に到達するにはどうすればよいですか:MOV ax、bx XOR ax、ax?これらのコマンドを16進エディターに入れて、対応する値を取得するだけですか?
答えはオペコードです。 (http://www.mathemainzel.info/files/x86asmref.html)これには、立派な逆アセンブラを使用できます。
検索にx86アセンブリのバイナリエンコーディング(通常は16進バイトとして表される)が必要な場合は、多くのx86命令に2つ以上の可能なエンコーディングがあることを考慮に入れる必要があります。たとえば、32ビットx86では、 `mov ax、bx`は次の方法でエンコードできます:` 66 89 d8`( `mov r / m16、r16`)または` 66 8b c3`( `mov r16、r / m16 `)。


このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
Loading...