hacktricks/reversing/cryptographic-algorithms/unpacking-binaries.md

5.3 KiB
Raw Blame History

{% hint style="success" %} AWSハッキングを学び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践するHackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポートする
{% endhint %}

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

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

基本的な推奨事項

  • IDAでパックされたバイナリを下から上に分析し始めます。アンパッカーはアンパックされたコードが終了すると終了するため、アンパッカーが最初にアンパックされたコードに実行を渡すことは考えにくいです。
  • レジスタメモリ領域へのJMPCALLを探します。また、引数とアドレスをプッシュしてからretnを呼び出す関数を探します。なぜなら、その場合、関数の戻りはスタックにプッシュされたアドレスを呼び出す可能性があるからです。
  • VirtualAllocブレークポイントを設定します。これは、プログラムがアンパックされたコードを書き込むためのメモリ内のスペースを割り当てます。「ユーザーコードまで実行」するか、F8を使用して関数を実行した後にEAX内の値を取得し、「ダンプ内のそのアドレスを追跡」します。アンパックされたコードが保存される領域であるかどうかはわかりません。
  • **VirtualAlloc「40」**という値を引数として渡すことは、読み取り+書き込み+実行を意味します(実行が必要なコードがここにコピーされる予定です)。
  • コードをアンパックしているとき、算術演算や**memcopyVirtualAllocのような関数へのいくつかの呼び出し**を見つけるのは普通です。もし、明らかに算術演算のみを行い、場合によってはmemcopyを行う関数にいる場合、関数の終わりを見つけるおそらくレジスタへのJMPまたは呼び出しか、少なくとも最後の関数への呼び出しを見つけて実行することをお勧めします。なぜなら、そのコードは興味深くないからです。
  • コードをアンパックしている間、メモリ領域を変更するたびに注意してください。メモリ領域の変更は、アンパックコードの開始を示す可能性があります。Process Hackerを使用してメモリ領域を簡単にダンプできますプロセス --> プロパティ --> メモリ)。
  • コードをアンパックしようとしているとき、アンパックされたコードで作業しているかどうかを知る良い方法(そのため、単にダンプできます)は、バイナリの文字列を確認することです。ある時点でジャンプを行い(おそらくメモリ領域を変更)、はるかに多くの文字列が追加されたことに気付いた場合、アンパックされたコードで作業していることがわかります。
    ただし、パッカーにすでに多くの文字列が含まれている場合、「http」という単語を含む文字列の数を確認し、この数が増加するかどうかを確認できます。
  • メモリの領域から実行可能ファイルをダンプするとき、PE-bearを使用していくつかのヘッダーを修正できます。