BreakPoint 2009 (3)

以前に紹介した Elevated (d:id:Rubeus:20090707) など実行ファイルのサイズに制限があるデモシーンでは、パッカーというソフトウェアを使って実行ファイルの圧縮が行われている。

wikipedia:実行ファイル圧縮

実行ファイル圧縮(英: Executable compression)とは、実行ファイルを何らかの手段で圧縮し、それをデータとして伸張(解凍)用コードと共に1つの実行ファイルとすること。

圧縮された実行ファイルを実行する場合には、まず伸張(解凍)して本来の実行コードを取り出し、それを自動的に実行する。圧縮していないオリジナルの実行ファイルを実行したのと同じ効果が得られるので、一般ユーザーには区別がつかない。

このようにパッカーは実行ファイルを小さくしてディスクスペースを節約することが目的になるけど、現在の一般的な PC の環境においては実行ファイルのサイズ自体が問題になることはないし、自分が知るかぎりではデモシーンくらいしか使われていないと思う。

ちなみに Elevated は Crinkler というパッカーで圧縮されている。Crinkler で圧縮された実行ファイルを PEiD でチェックしてみると、圧縮されたプログラムの伸張には lz32.dll が使われていることが分かる。lz32.dll を使用している理由を見つけることは出来なかったけど、古くからサポートされていることから考えて互換性のためだと推測される。


伸張された本来のプログラムはメモリ上に配置されて実行されるわけだけど、メモリ上にプログラムを書き込んで実行するという行為は一般的にセキュリティリスクとも考えられるため、Windows XP SP2 以降の OS では DEP によって保護される。(ただし、ハードウェアのサポートが必要)

これに対して Crinkler ではいろいろと改良を重ねていて、現在は Windows Vista までは対応がされているけど、Windows 7 ではさらなる対策が施されたのか、不正終了 (バッファオーバーフロー) により動作しなかった。

ほかにもアンチウィルスソフトウェアによっては、ウィルスとして検出されてしまう可能性があることが挙げられる。仮にパッカーが識別されて (または解析を潜り抜けて) アンチウィルスソフトウェアに検出されなかったとしても、展開されたコード自体に悪意があるかどうかを判断することは難しいため、むしろ検出されたほうが好ましいとも言える。


これらの問題点についてはいわゆる「いたちごっこ」の関係にあることや、パッカーの本質的な役割が現在においてはほとんど役に立たないことを考えると、枯れていく技術であることは否定できないと思う。

だけど Elevated を観ていると、そんなことはどうだっていいと思えるくらいに、ソフトウェアひいては物作りに対する無限の可能性を感じることができる。