Unpacking binaries
パッキングされたバイナリの特定
文字列の不足: パッキングされたバイナリにはほとんど文字列が含まれていないことが一般的です
未使用の文字列が多い: また、マルウェアが商用パッカーを使用している場合、相互参照がない多くの文字列が見つかることが一般的です。これらの文字列が存在しても、バイナリがパッキングされていないとは限りません。
バイナリがどのパッカーを使用してパッキングされたかを特定しようとするために、いくつかのツールを使用することもできます:
基本的な推奨事項
IDAでパックされたバイナリを下から上に分析することを開始します。アンパッカーは、アンパックされたコードが終了すると終了するため、アンパックされたコードに実行を渡す可能性は低いです。
JMPやCALL、レジスタやメモリ領域への関数の引数とアドレス方向をプッシュし、
retn
を呼び出す関数を検索します。なぜなら、その場合、関数の戻り値は、呼び出される前にスタックにプッシュされたアドレスを呼び出す可能性があるからです。VirtualAlloc
にブレークポイントを設定します。これは、プログラムがアンパックされたコードを書き込むことができるメモリ領域を割り当てるためです。関数を実行した後にEAX内の値に到達するために「ユーザーコードに実行」を実行するか、F8を使用してそのアドレスをダンプで追跡します。アンパックされたコードが保存される領域であるかどうかはわかりません。引数として値「40」を持つ**
VirtualAlloc
**は、Read+Write+Execute(実行が必要なコードがここにコピーされる)を意味します。コードをアンパックする間に、算術演算や**
memcopy
またはVirtual
Alloc
のような関数への複数の呼び出しを見つけることが一般的です。関数が明らかに算術演算のみを実行し、おそらくいくつかのmemcopy
を実行している場合、関数の終わりを見つけてみることをお勧めします(おそらくJMPやレジスタへの呼び出し)または少なくとも最後の関数への呼び出し**を見つけ、その後に実行してコードが興味深くないことを確認します。コードをアンパックする際に、メモリ領域が変更されるたびにメモリ領域の変更がアンパックコードの開始を示す可能性があることに注意してください。Process Hackerを使用して簡単にメモリ領域をダンプできます(process --> properties --> memory)。
コードをアンパックしようとする際に、バイナリの文字列をチェックすることで、すでにアンパックされたコードで作業しているかどうかを知る良い方法です(そのため、単にダンプできます)。ある時点でジャンプを実行し(おそらくメモリ領域を変更)、追加された文字列がかなり増えたことに気付いた場合、アンパックされたコードで作業していることがわかります。 ただし、パッカーにすでに多くの文字列が含まれている場合は、単語「http」を含む文字列の数を確認して、この数が増加するかどうかを確認できます。
メモリ領域から実行可能ファイルをダンプする際に、PE-bearを使用して一部のヘッダーを修正できます。
Last updated