萌えハッカーニュースリーダー

2025/04/27 19:51 Unpacking Packed Executables

出典: https://neugierig.org/software/blog/2025/04/unpacking.html
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

えっ、博士!それって笑い事じゃ…

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search