UPX (ultimate packer for executables)は様々なOSのファイル形式に対応したFLOSSの実行ファイル圧縮ソフトウェアである。
圧縮
UPXはUCL[2] と呼ばれるデータ圧縮アルゴリズムを用いている。UCLはプロプライエタリなNRV (Not Really Vanished[3]) アルゴリズムの一部をオープンソースで実装したものである[4]。
UCLは解凍用のコードがわずか数百バイトで実装できるようなシンプルな設計となっている。UCLは解凍のための追加のメモリ割り当てを要求しない。このことはUPXで圧縮された実行ファイルが余計なメモリを要求しないことを意味し、明確な優位点となっている。
UPX(2.90 beta以上)では多くのプラットフォームでLZMAが利用可能になっている。しかし、古いコンピュータでは解凍速度が遅いので16ビット環境ではデフォルトで無効化されている(--lzma
オプションを用いると強制的に有効化できる)。
解凍
この節は(検証可能)な(参考文献や出典)が全く示されていないか、不十分です。(2020年12月) |
UPXは解凍のための2つの方法を有している。イン・プレース手法と一時ファイルへの展開である。
イン・プレース手法は、メモリ上へ実行ファイルの解凍を行うが、UPXでサポートされているすべてのプラットフォームにおいて利用できるわけではない。イン・プレース手法が利用できない場合は一時ファイルへの展開が行われる。この方法には余分なオーバーヘッドと欠点がある。しかし、いかなる実行ファイル形式でも圧縮することができる。実行ファイルは一時的な場所に展開され、open()
がファイルディスクリプタの生成のために用いられる。
ファイルディスクリプタの生成されると、一時ファイルはunlink()
することができ、スタブはスタブ自身を一時ファイルの実行可能イメージで上書きするために(/proc
を経由して)ファイルハンドルにexecve()
を行う。
一時ファイルへの展開を行う手法はいくつかの欠点がある
- suidのような特別なアクセス権限は無視される。
argv[0]
は無意味である。- アプリケーションは共通セグメントを共有できない。
UPXによって圧縮された改変されていないファイルは大抵、アンチウイルスソフトウェアによって検出され、解凍される。UPXはUPX自身で圧縮された改変されていない実行ファイルを解凍する機能も有している。
サポートされているフォーマット
脚注
外部リンク
- UPX - SourceForge.net
- "UPX". Freecode.