実行ファイル圧縮

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

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

圧縮された実行ファイルは、自己展開（自己解凍）型アーカイブの一種である。圧縮された実行ファイルを伸張だけ行って、実行しないということも可能であることが多い（CUP386、UNP など）。

圧縮された実行ファイルは、直接メモリ上で伸張されるため、実行するのにファイルシステムの領域を必要としないことが多い。ただし、一部の伸張機能は伸張した実行ファイルを実行する前にファイルシステムに書き込むようになっている。

 利点と欠点 

ソフトウェアの配布にあたって実行ファイル圧縮を行う理由は、第一に二次記憶装置で占める容量をなるべく削減するためである。実行ファイル圧縮ソフトウェアは、実行ファイル専用に設計されている。圧縮することでソフトウェアが配布媒体（CD-ROM、DVD、フロッピーディスク）に収まるということもあるし、インターネット上でダウンロードするのにかかる時間も節約できる。

実行ファイル圧縮は、圧縮と同時に暗号化することでリバースエンジニアリングを阻止するために使われることもある。また、マルウェアの存在をアンチウイルスソフトウェアから隠す目的で使われることもある。実行ファイル圧縮をしておくと、直接的な逆アセンブルが不可能となり、ファイル内容を見ても通常の実行ファイルに見られるような文字列リテラルが見つからない。もっとも、これでリバースエンジニアリングが完全に不可能というわけではなく、単に手間がかかるようになるというだけである。

補助記憶装置上の容量や転送時間の削減が可能になる反面、実際の実行を開始する前に伸張（解凍）する時間がかかる。ただし、一般に補助記憶装置のアクセスにかかる時間はCPUの速度に比較して非常に大きいため、圧縮されて小さくなった実行ファイルをロードすることで時間が短縮されており、伸張にかかる時間をほぼ相殺すると言える。

実行ファイルの一部をオンデマンドで読み込むオペレーティングシステム（OS）では（仮想記憶参照）、実行ファイル圧縮はその効率を悪化させる。伸張機能部分は伸張したデータをメモリ上に展開し、その実行ファイルを実行中はそれを保持する。これは、各ページを実際に使用するか否かに関わらない。そのOSがスワップファイルを使っていて空きメモリを作ろうとした場合、通常の実行ファイルならコード部分は単に捨てられるだけだが、伸張されたコード部分はスワップファイルに退避されなければならない。これは通常あまり問題とはならないが、圧縮された実行ファイルをいくつも起動した場合、通常の実行ファイルならコード部分のメモリは共有され再利用されるのに対して、圧縮されている場合は共有できないため、メモリ使用量が起動回数に応じて増えていく。従って、圧縮するかどうかを検討する場合には、それが同時に複数起動される可能性があるかを考慮する必要がある。

別の欠点として、ランタイムライブラリの依存関係を識別できない場合がある点が上げられる。その場合、静的リンクしかできない。

また、一部の古いアンチウイルスソフトウェアは、圧縮された実行ファイルの解凍機能部分のパターンがコンピュータウイルスと似ているため、全ての圧縮された実行ファイルをウイルスと判断する。最近のアンチウイルスソフトウェアは、圧縮された中身を（一部の圧縮形式について）解析できるようになっていて、中身を見てウイルスかどうかを判断している。

実行ファイル圧縮の技法は、ハードディスクドライブの容量が少なく、フロッピーディスクでのソフトウェア配布が一般的だった時代によく使われた。それによって、同じ容量でより多くのソフトウェアをインストールでき、使うたびに伸張する手間が省かれるという利点があった。ただし、ディスク容量の増大とともに実行ファイル圧縮の技法は廃れていった。

実行ファイル圧縮はデモシーンでよく使われた。

 実行ファイル圧縮ソフト一覧 
 UPX –自由ソフトウェア
 .netshrink
 PELock
 dotBundle
 .NETZ – .NET
 Crinkler
 gzexe - gzipとシェルスクリプトを用いていたUnix向け実行ファイル圧縮
 bzexe - 同じくbzip2とシェルスクリプトを用いる
 LZEXE FFmpeg や QEMU の作者 Fabrice Bellard（w:Fabrice Bellard）の作。圧縮エンジンは奥村晴彦の実装したLZSS法にインスパイヤされているhttps://bellard.org/lzexe/ 。
 Teddy Matsumoto作。
 LHEXE LHAファイル内にパックされている実行ファイルをメモリ上に解凍後、子プロセスとして起動するhttps://www.vector.co.jp/soft/dos/util/se002357.html 。
 DIET 実行ファイル圧縮の他、TSRとして常駐することでデータファイルを圧縮したまま読み込み時に伸長する機能も持つhttps://www.vector.co.jp/soft/dos/util/se000305.html 。
 Linux(カーネル)の圧縮とブート時の伸長。vmlinux#圧縮 と vmlinux#bzImage を参照。

 注 

 関連項目 
 データ圧縮
 ディスク圧縮
 実行ファイル
 コルモゴロフ複雑性

Category:データ圧縮