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 文件。