UPX
此條目需要補充更多來源。 (2020年8月18日) |
首次發佈 | 1998年5月26日 |
---|---|
目前版本 | 3.96(2020年1月23日 | )
原始碼庫 | |
程式語言 | C++、組譯 |
作業系統 | Windows、Linux、DOS、Atari TOS、macOS |
類型 | 可執行檔案壓縮 |
許可協定 | GPL |
網站 | upx.github.io |
UPX(英語:the Ultimate Packer for eXecutables)是一個自由開源的可執行程式檔案加殼器,支援許多不同作業系統下的可執行檔案格式。
壓縮
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許可證中也明確禁止以防止前文所提及的解包為目的的修改。
支援的格式
- ARM/PE
- Atari/TOS
- *BSD/i386
- DJGPP2/COFF
- DOS/COM (包括某些其它二進制映像[nb 1][nb 2])[nb 3]
- DOS/EXE[nb 3]
- DOS/SYS[nb 3]
- Linux/i386 a.out
- Linux/ELF (位於 i386, x86-64, ARM, PowerPC平台)
- Linux/kernel (位於i386, x86-64 and ARM平台)
- Mach-O/ppc32, Mach-O/i386 (自3.09版本後還支援Google Go建立的此格式程式)
- rtm32/PE (如 Borland C/Pascal compilers[1]編譯的程式)
- tmt/adam (如the TMT Pascal compiler[2]編譯的程式)
- PlayStation1/EXE
- Watcom/LE (DOS4G、PMODE/W、DOS32A 和 CauseWay)
- 包含x86 (32-Bit)代碼的Windows/PE EXE 檔案
- 包含AMD64 (64-Bit)代碼的Windows/PE EXE 檔案(實驗性的)
UPX目前[何時?]不支援為了在.NET Framework.執行而包含了 CIL代碼的Windows/PE EXE 檔案。