では、第一の着眼点である、VirtualAllocで確保された領域に展開された情報について調べてみましょう。【表1】では、VirtualAllocの後にRtlDecompressBufferが実行されています。しかも、展開先は第2引数で設定されますが、このアドレスは直前にVirtualAllocで確保された領域を用いています。このことから、VirtualAllocで確保された領域に、RtlDecompressBufferで0x007216C0以降の情報を解凍することが予想されます。
では、実際に見て見ましょう。[025BD]で解凍処理を呼ぶことがわかっているので、ここにブレークポイントを設定し、パラメータを確認した後、Step overをしてみます(【図48】、【図49】参照)。
【図49】のメモリに展開された情報を見ると、MZのマジックナンバーやDOSスタブにあるお決まりの「This program …」の文言、[000B8]からのPEヘッダなど、一見してWindows用の実行プログラムであることがわかります。今まで様々な方法で難読化が行われてきましたが、まさにこの情報を取り出すことが目的であった、と言えるわけです。
念のため、このデータ部分を抽出してファイルに保存しておきましょう。Hex Viewで、保存したい範囲を選択し、右クリックでポップアップウィンドウを表示し、「Save to file」をクリックします。表示されたダイアログで保存先へ移動し、ファイル名を入力することで保存が完了します。なお、メインメニューの「Edit」→「Export data」でも同様の保存が可能です。この場合、ダイアログで「raw bytes」を選択してください(【図50】~【図52】参照)。
【図50】Hex Viewからの保存(ポップアップメニュー)
【図51】Hex Viewからの保存(「Save to file」からの保存先ダイアログ表示)
【図52】「Export data」からの保存
< 仮想メモリ内のWindows API使用フロー | 目 次 | 展開されたプログラムの行き先 > |