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

UPX
The Ultimate Packer for eXecutables
初版 1998年5月26日
最新版
4.2.2 / 2024年1月3日 (3か月前) (2024-01-03)
リポジトリ ウィキデータを編集
プログラミング
言語
C++, アセンブリ
対応OS Windows, Linux, macOS, DOS, Atari
プラットフォーム i386, MIPS, AMD64, ARM, PPC, m68k
対応言語 英語
種別 実行ファイル圧縮
ライセンス 圧縮された実行ファイルを例外とするGPL[1]
公式サイト upx.github.io
テンプレートを表示

圧縮 編集

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

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

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

解凍 編集

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

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

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

一時ファイルへの展開を行う手法はいくつかの欠点がある

  • suidのような特別なアクセス権限は無視される。
  • argv[0]は無意味である。
  • アプリケーションは共通セグメントを共有できない。

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

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

脚注 編集

外部リンク 編集

  • UPX - SourceForge.net
  • "UPX". Freecode.