UPX

UPX (ultimate packer for executables)は様々なOSのファイル形式に対応したFLOSSの実行ファイル圧縮ソフトウェアである。

圧縮 

UPXはUCL と呼ばれるデータ圧縮アルゴリズムを用いている。UCLはプロプライエタリなNRV (Not Really Vanished) アルゴリズムの一部をオープンソースで実装したものである。

UCLは解凍用のコードがわずか数百バイトで実装できるようなシンプルな設計となっている。UCLは解凍のための追加のメモリ割り当てを要求しない。このことはUPXで圧縮された実行ファイルが余計なメモリを要求しないことを意味し、明確な優位点となっている。

UPX（2.90 beta以上）では多くのプラットフォームでLZMAが利用可能になっている。しかし、古いコンピュータでは解凍速度が遅いので16ビット環境ではデフォルトで無効化されている(--lzmaオプションを用いると強制的に有効化できる)。

解凍 

UPXは解凍のための2つの方法を有している。イン・プレース手法と一時ファイルへの展開である。

イン・プレース手法は、メモリ上へ実行ファイルの解凍を行うが、UPXでサポートされているすべてのプラットフォームにおいて利用できるわけではない。イン・プレース手法が利用できない場合は一時ファイルへの展開が行われる。この方法には余分なオーバーヘッドと欠点がある。しかし、いかなる実行ファイル形式でも圧縮することができる。実行ファイルは一時的な場所に展開され、open()がファイルディスクリプタの生成のために用いられる。

ファイルディスクリプタの生成されると、一時ファイルはunlink()することができ、スタブはスタブ自身を一時ファイルの実行可能イメージで上書きするために(/procを経由して)ファイルハンドルにexecve()を行う。

一時ファイルへの展開を行う手法はいくつかの欠点がある
 suidのような特別なアクセス権限は無視される。
 argv[0]は無意味である。
 アプリケーションは共通セグメントを共有できない。

UPXによって圧縮された改変されていないファイルは大抵、アンチウイルスソフトウェアによって検出され、解凍される。UPXはUPX自身で圧縮された改変されていない実行ファイルを解凍する機能も有している。

サポートされているフォーマット 

 ARM/PE
 Atari/tos
 *BSD /i386
 djgpp2/COFF
 dos/com
 dos/exe
 dos/sys
 Linux/i386 a.out
 i386、x86-64、ARM、PowerPC上のLinux/ELF
 i386、x86-64、ARM上のLinux/kernel
 Mach-O/ppc32、Mach-O/i386 (Google Goを用いて生成されたものを除く)
 rtm32/PE
 tmt/adam
 PlayStation1/exe
 Watcom/le
 Win32/PE (.NET Frameworkを用いて作られたファイルを除く)

脚注

外部リンク 

 
 

データ圧縮
1998年のソフトウェア