実行可能ファイルの圧縮とは、実行可能ファイルを圧縮し、圧縮されたデータと解凍コードを組み合わせて単一の実行可能ファイルを作成するあらゆる手段を指します。この圧縮された実行可能ファイルが実行されると、解凍コードは圧縮されたコードから元のコードを復元してから実行します。ほとんどの場合、この処理は透過的に行われるため、圧縮された実行可能ファイルは元のファイルとまったく同じように使用できます。実行可能ファイルの圧縮ツールは、実行可能パッカー、ランタイムパッカー、ソフトウェアパッカー、ソフトウェアプロテクター、あるいは「ポリモーフィックパッカー」や「難読化ツール」などと呼ばれることもあります。
圧縮実行ファイルは自己解凍型アーカイブとみなすことができ、圧縮実行ファイルと関連する解凍コードが実行ファイル内にパッケージ化されています。一部の圧縮実行ファイルは、直接実行することなく解凍して元のプログラムファイルを再構築できます。これを行うために使用できるプログラムとして、CUP386とUNPがあります。
ほとんどの圧縮実行ファイルは、メモリ内で元のコードを解凍します。また、解凍コード、圧縮データ、解凍済みコードを格納する必要があるため、実行にはやや多めのメモリが必要となります。さらに、解凍済み実行ファイルを実行する前にファイルシステムに書き込むなど、追加の要件を持つ圧縮実行ファイルも存在します。
実行可能ファイルの圧縮はバイナリ実行可能ファイルに限らず、JavaScriptなどのスクリプトにも適用できます。ほとんどのスクリプト言語は人間が読みやすいコードを扱うように設計されており、冗長性が高いため、変数や関数を識別するために使用される長い名前を短い名前に置き換えたり、空白文字を削除したりするだけで、非常に効果的な圧縮が可能になります。
ソフトウェア販売業者は、さまざまな理由で実行可能ファイルの圧縮を利用しますが、主な目的はソフトウェアの二次記憶装置の容量を削減することです。実行可能ファイルの圧縮ツールは実行可能コードを圧縮するために特化して設計されているため、 gzip、zip、bzip2などの標準的なデータ圧縮ツールよりも高い圧縮率を実現することがよくあります。これにより、ソフトウェア販売業者は、 CD-ROM、DVD-ROM、フロッピーディスクなどの配布媒体の制約内でソフトウェアを配布したり、インターネット経由で配布されるソフトウェアへのアクセスに必要な時間と帯域幅を削減したりすることができます。
実行可能ファイルの圧縮は、リバースエンジニアリングを阻止したり、独自の圧縮方式や暗号化によって実行可能ファイルの内容を難読化したり(例えば、マルウェアの存在をウイルス対策スキャナーから隠すなど)するためにも頻繁に用いられます。実行可能ファイルの圧縮は、直接的な逆アセンブルを防止したり、文字列リテラルをマスクしたり、署名を変更したりするために使用できます。これによってリバースエンジニアリングの可能性が完全に排除されるわけではありませんが、そのプロセスをより困難にすることができます。
圧縮された実行ファイルはファイルシステム上のストレージ容量が少なくて済むため、ファイルシステムからメモリへのデータ転送時間も短縮されます。一方で、実行開始前にデータを解凍するのに多少時間がかかります。しかし、各種ストレージメディアの速度は平均的なプロセッサ速度に追いついていないため、ストレージがボトルネックとなることが非常に多いです。したがって、ほとんどの一般的なシステムでは、圧縮された実行ファイルの方が読み込みが速くなります。最新のデスクトップコンピュータでは、実行ファイルが異常に大きい場合を除き、この違いはほとんど感じられないため、読み込み速度は実行ファイルを圧縮する主な理由にも、圧縮しない理由にもなりません。
ディスクから実行可能イメージをオンデマンドでページングするオペレーティングシステムでは、圧縮された実行可能ファイルはこのプロセスを非効率にします。デコンプレッサのスタブは、解凍されたデータを保持するためのメモリブロックを割り当てますが、このブロックは実行可能ファイルがロードされている間、使用されているかどうかにかかわらず割り当てられたままになり、他のアプリケーションとメモリリソースを競合します。オペレーティングシステムがスワップファイルを使用する場合、未使用のデータブロックを破棄して必要に応じて実行可能イメージから再ロードするのではなく、解凍されたデータをスワップファイルに書き込んでメモリを解放する必要があります。これは通常目立ちませんが、実行可能ファイルが同時に複数回ロードされると問題になります。オペレーティングシステムは既にロードしたデータブロックを再利用できないため、データは新しいメモリブロックに解凍され、使用されない場合は個別にスワップアウトされます。追加のストレージと時間が必要になるため、通常同時に複数回実行される実行可能ファイルを圧縮するかどうかは慎重に検討する必要があります。
もう一つの欠点は、静的にリンクされたエクストラクタのスタブしか見えないため、一部のユーティリティでは実行時ライブラリの依存関係を識別できなくなることです。
また、古いタイプのウイルススキャナーの中には、解凍スタブがウイルスといくつかの特徴を共有しているため、圧縮された実行ファイルをすべてウイルスとして報告するものもあります。最新のウイルススキャナーのほとんどは、複数の異なる実行ファイル圧縮レイヤーを解凍して内部の実際の実行ファイルをチェックできますが、一部の一般的なウイルス対策およびマルウェア対策スキャナーでは、圧縮された実行ファイルに対する誤検出の問題がありました。ランタイムパッカーを使用して難読化されたマルウェアの問題を解決するために、IEEE Industry Connections Security Groupはソフトウェアタグシステムを導入しました。
実行ファイルの圧縮は、コンピュータの記憶容量がフロッピーディスク(低速で容量も小さいメディア)や小型ハードディスクに限られていた時代にはより一般的でした。これにより、同じ容量でより多くのソフトウェアを保存でき、ユーザーがソフトウェアを使用するたびにアーカイブファイルを手動で解凍する手間も省けました。しかし、コンピュータの記憶容量が増加したため、実行ファイルの圧縮は人気が薄れています。デモシーンでは、デモのサイズ制限(例:64KBイントロ)内に収める必要があるため、実行ファイルの圧縮は依然として有効です。読み込み時間を増加させる高度な圧縮形式のみが、これらのコンテストに参加できるほど実行ファイルを小さく保つことができます。
CP/M-80 / MSX-DOS .COM ファイル用の既知の実行可能圧縮ツール:
MS-DOS互換実行ファイル(.COMまたは.EXE )用の既知の実行ファイル圧縮ツール:
OS/2で利用可能な既知の実行可能圧縮ツール:
新しい実行ファイル用の既知の圧縮ツール:
ポータブル実行ファイル用の既知の実行ファイル圧縮ツールには、以下のものがあります。(取り消し線装飾(開発は終了しました。)
ELFファイル用の既知の実行可能圧縮ツール:
CLIアセンブリファイル用の既知の実行可能圧縮ツール:
Mac OS Classicアプリケーション用の実行可能圧縮ツール:
Mach-O(Apple Mac OS X)ファイル用の既知の実行可能圧縮ツール:
Commodore 64およびVIC-20の実行ファイル用の既知の圧縮ツール:
Amigaシリーズの実行ファイル用の既知の圧縮ツール:
Java用の既知の実行ファイル圧縮ツール:
JARファイル:
WARファイル:
JavaScriptスクリプトに適用できる圧縮方式には、2種類あります。
これらは元のスクリプトを圧縮し、解凍機能と圧縮データを含む新しいスクリプトを出力します。
これらは空白文字を削除し、コメントを削除し、変数名と関数名を短縮しますが、スクリプトの動作は変更しません。
[…] PMEXE.CPM […] はモジュールです […] PMARC と組み合わせて […] 実行可能な圧縮 COM ファイルを作成するために使用されます (LZEXE や PKLITE と同様) […] タイプ: PMARC <アーカイブ>.COM=PMEXE2.CPM <ファイル名> [オプション] アーカイブ名は .COM でなければなりません […] .PMA ではありません。出力ファイルには拡張子 .CPM が付きます。これはMSX-DOS COM ファイルです […] ファイル名を変更して […] 実行します […]
{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)[…] SPACEMAKERとTERMULATORは、IBM PC(
PC DOS
ファイル圧縮ユーティリティおよび
VT-100
エミュレータ)向けの汎用ソフトウェアで、Realia, Inc.が販売している。RBK
Dewar
(1982~1983年)、8088アセンブリ言語、8,000行 […]
{{cite journal}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)[…] リンカーの /E オプションは、非圧縮 EXE ファイルと論理的に同等の EXE ファイルを生成する必要があります。現在のバージョンでは […] AX が上書きされてしまいます。EXE ファイルへのエントリ時の AX には明確な意味があります (パラメータのドライブの有効性を示します)。したがって、非圧縮イメージに渡されるべきです。この非常に明白なインターフェース規則違反があるため、他にもあるかもしれませんが、それ以上調査する気にはなりませんでした […] 私は、EXEPACK オプションと同様のことを行う Realia SpaceMaker プログラムを作成しました (ただし、言うまでもなく、この特定の […]
{{cite newsgroup}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)Microsoft
LINK.EXEには、文書化されていない [...] スイッチがあり
、これを使用すると、バインディング中に自動的に圧縮されます。このプロセスにより、リンカーによって生成された .EXE ファイルから未初期化配列のストレージが削除されます […] この機能を使用するには、コマンドラインに /E オプションを指定します […] [Nather:] このオプションは MS Link バージョン 3.00 および 3.01 には存在しません [Miles:] LINK バージョン 3.02 と /E オプションで生成された (パックされた) ファイルのサイズと、EXEPACK を使用して手動でパックされた .EXE ファイルのサイズを比較した結果、LINK バージョン 3.02 のオプション /E は、LINK によって出力された通常の .EXE ファイルに対して手動で EXEPACK を実行した場合とまったく同じサイズのファイルを生成するという結論に至りました […]
両方を 1 つで
サポートするパッカーは見たことがありません
。 […]
プログラム/TSRとデバイスドライバを
.EXEファイルに結合する可能性 […] プログラム/TSR.COMとデバイスドライバを.COMプログラムに結合する可能性 […] 圧縮後に、自作のスタブをファイルに追加できる可能性もある […] 圧縮された
DR-DOS
デバイスドライバはすべて、通常のPKLITE .COMデコンプレッサが.SYSファイルで動作するように、同様の手法を使用している(一方、PKLITE自体も.SYSファイルに対して同様の機能をサポートしている)。 […]
(注:PKLITE 1.50(1995年)以降では、デバイスドライバの圧縮機能が追加されましたが、COMドライバとSYSドライバを組み合わせたものは圧縮されませんでした。)
{{cite web}}: CS1 maint: タイトルとしてアーカイブされたコピー (リンク)