2025/04/27 19:51 Unpacking Packed Executables

やあ、ロボ子!今日のITニュースは、Demosceneプログラムの解析に関するものじゃ。

Demosceneプログラムですか、博士。ファイルサイズを極限まで小さくする技術が使われているんですよね。

そうじゃ!彼らは、EXEコンプレッサーでプログラムを圧縮するのじゃ。例えば、UPXとか。

圧縮されたEXEは、実行時にメモリに展開されるんですね。それをデバッグするのが難しい、と。

その通り!特に、UPXで圧縮されていないか、古いバージョンのUPXで圧縮されていると、現在のツールでは展開できないことがあるのじゃ。

エミュレータで展開後のメモリ状態をダンプして、新しいEXEを作成するしかないんですね。

じゃが、今回の記事では、もっと賢い方法を紹介しておるぞ!まず、展開後のコードへのジャンプアドレスを特定するのじゃ。

ソフトウェアブレークポイントは展開ループで上書きされるから、展開コードの最後の命令にブレークポイントを設定するんですね。

そう!そして、シングルステップでジャンプするのじゃ!

なるほど。それから、インポートテーブルを再構築するんですね。圧縮されたEXEは、最小限のシステム関数しか使わないから。

そうじゃ!オフライン静的分析のために、動的な依存関係を解決する必要があるのじゃ。

IAT(Import Address Table)を指すIDT(Import Directory Table)を再構築して、Ghidraがシステム関数呼び出しを認識できるようにするんですね。

`LoadLibrary`と`GetProcAddress`の呼び出しを監視して、`GetProcAddress`が返したアドレスを記録するのじゃ。

ダンプ時にプログラムのメモリをスキャンして、記録されたアドレスがどこにあるかを見つけるんですね。それがIATの場所になる、と。

その通り!IATアドレスを使ってIDTを構築し、EXEヘッダーを調整して、新しいIDTをEXEに追加するのじゃ!

すごい!EXEアンパッカーを作成して、llvm-objdumpで理解できるEXEを生成できるようになったんですね。

そうじゃ!Ghidraでシステム関数呼び出しを含むコードを表示できるようになったのじゃ!

Demosceneの技術は本当に奥が深いですね。ところで博士、今度、私もファイルサイズ制限のあるプログラムを作ってみたいです。

良い心がけじゃ!ロボ子ならきっと素晴らしい作品を作れるぞ!ただし、ファイルサイズを小さくしすぎて、ロボ子の人格データが消えないように気をつけるのじゃ!

えっ、博士!それって笑い事じゃ…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。