UPX(英語:the Ultimate Packer for eXecutables)是一個自由開源的可執行程式檔案加殼器,支援許多不同作業系統下的可執行檔案格式。

UPX
the Ultimate Packer for eXecutables
首次發佈1998年5月26日,​26年前​(1998-05-26
目前版本3.96(2020年1月23日,​4年前​(2020-01-23
原始碼庫 編輯維基數據連結
程式語言C++組譯
作業系統WindowsLinuxDOSAtari TOSmacOS
類型可執行檔案壓縮
許可協定GPL
網站upx.github.io

壓縮

UPX使用一種叫做UCL的壓縮演算法,為NRV(Not Really Vanished)演算法的一個開源部分實做。

得益於UCL的簡單設計,其解壓縮程式碼只需要額外的數百位元組。UCL最大的好處是在解壓縮過程中不需要額外的記憶體,意味着經過UPX壓縮的可執行檔案執行時通常也不需要為了解壓縮付出額外記憶體。

UPX(從2.90 beta版本開始)可以在大多數平台上使用LZMA演算法,但因為速度慢,在16位元平台上LZMA演算法預設被停止使用。(可以使用參數--lzma強制使用)。

從版本3.91開始,UPX在Windows平台上還支援64位元(x64)可執行檔案。此功能目前宣佈為實驗性。

解壓縮

UPX支援兩種解壓方式:就地解壓或解壓至臨時資料夾。

就地解壓方法會直接把可執行檔案提取到主記憶體。但這種方式不可能支援所有系統平台,因此在必要之時UPX會使用另一種解壓方式:將壓縮檔案提取到臨時資料夾。這種方式支援封裝任何平台和格式的可執行檔案,可執行檔案往往先會被提取到一個位置,之後用open()打開。

然而提取到臨時資料夾這種方式除了造成了額外佔用之外,還有以下幾個缺點:

  • 特殊權限會被忽略,如設置用戶識別碼。
  • argv[0](即程式中取得到的可執行檔名)將會無效。
  • 多實例應用程式將無法共用共同的程式部分(如主記憶體內的相同代碼)。

未特意以防止解包為目的修改過的UPX包通常能夠被防毒軟件辨識並進行解壓操作。UPX也內建能夠解壓未修改UPX包的功能。在預設的UPX許可證中也明確禁止以防止前文所提及的解包為目的的修改。

支援的格式

UPX目前[何時?]不支援為了在.NET Framework.執行而包含了 CIL代碼的Windows/PE EXE 檔案。

註釋

  1. ^ UPX對DOS .COM風格的檔案的壓縮支援可以擴充到一些其它類似的二進制檔案中去。一些FreeDOSEDR-DOS內核檔案已經被證實可以進行UPX壓縮。
  2. ^ UPX也可以壓縮不可執行的二進制檔案,只要使用它們的程式或驅動能夠辨識它們是由UPX壓縮並且能夠執行在檔案中包含的解壓縮代碼即可。已知的例子是FreeDOS使用的.CPX檔案以及被UPX壓縮過的.CPI字型檔案。
  3. ^ 3.0 3.1 3.2 對於DOS平台,UPX支援特殊選項-8086,以強制嵌入式解壓縮器與Intel 8088/8086處理器相容,這樣做之後即使在執行DOS的最早的PC上也可以執行和解壓縮壓縮檔案。

參考資料

  1. ^ 存档副本. [2018-01-30]. (原始內容存檔於2022-01-11). 
  2. ^ 存档副本. [2018-01-30]. (原始內容存檔於2018-10-05). 

外部連結