Unpacking binaries

HackTricksをサポートする

パックされたバイナリの識別

  • 文字列の不足:パックされたバイナリにはほとんど文字列がないことが一般的です。

  • 未使用の文字列が多い:マルウェアが商業用パッカーを使用している場合、相互参照のない多くの文字列が見つかることが一般的です。これらの文字列が存在しても、バイナリがパックされていないことを意味するわけではありません。

  • バイナリをパックするために使用されたパッカーを特定するために、いくつかのツールを使用できます:

基本的な推奨事項

  • IDAでパックされたバイナリを下から上に分析し始める。アンパッカーはアンパックされたコードが終了すると終了するため、アンパッカーが最初にアンパックされたコードに実行を渡すことは考えにくいです。

  • レジスタメモリJMPCALLを探します。また、引数とアドレスをプッシュしてからretnを呼び出す関数を探します。なぜなら、その場合の関数の戻りは、呼び出す前にスタックにプッシュされたアドレスを呼び出す可能性があるからです。

  • VirtualAllocブレークポイントを設定します。これは、プログラムがアンパックされたコードを書き込むためのメモリ内のスペースを割り当てます。「ユーザーコードまで実行」するか、F8を使用して関数を実行した後にEAX内の値を取得し、「ダンプ内のそのアドレスを追跡」します。アンパックされたコードが保存される領域であるかどうかはわかりません。

  • **VirtualAlloc「40」**という値を引数として渡すことは、読み取り+書き込み+実行を意味します(実行が必要なコードがここにコピーされる予定です)。

  • コードをアンパックしているとき、算術演算や**memcopyVirtualAllocのような関数へのいくつかの呼び出し**を見つけるのは普通です。もし、算術演算のみを行い、場合によってはmemcopyを行う関数にいる場合、関数の終わりを見つける(おそらくレジスタへのJMPまたはCALL)か、少なくとも最後の関数への呼び出しを見つけて実行することをお勧めします。なぜなら、そのコードは興味深くないからです。

  • コードをアンパックしている間、メモリ領域が変更されたときは注意してください。メモリ領域の変更は、アンパックコードの開始を示す可能性があります。Process Hackerを使用してメモリ領域を簡単にダンプできます(プロセス --> プロパティ --> メモリ)。

  • コードをアンパックしようとしているとき、アンパックされたコードで作業しているかどうかを知る良い方法(その場合は単にダンプできます)は、バイナリの文字列を確認することです。ある時点でジャンプを行い(おそらくメモリ領域を変更)、多くの文字列が追加されたことに気付いた場合アンパックされたコードで作業していることがわかります。 ただし、パッカーにすでに多くの文字列が含まれている場合、「http」という単語を含む文字列の数を確認し、この数が増加するかどうかを確認できます。

  • メモリの領域から実行可能ファイルをダンプするとき、PE-bearを使用していくつかのヘッダーを修正できます。

HackTricksをサポートする

Last updated