UPX
初始版本 | 1998年5月26日 |
---|---|
穩定版本 | 3.96 (2020年1月23日 ) |
源代码库 | |
编程语言 | C++、汇编 |
操作系统 | Windows、Linux、DOS、Atari TOS、macOS |
类型 | 可执行文件压缩 |
许可协议 | GPL |
网站 | upx.github.io |
压缩
UPX使用一种叫做UCL的压缩演算法,為NRV()演算法的一个开源部分實做。
得益于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 文件。
注释
- UPX对DOS .COM风格的文件的压缩支持可以扩展到一些其它类似的二进制文件中去。一些FreeDOS 和 EDR-DOS内核文件已经被证实可以进行UPX压缩。
- UPX也可以压缩不可执行的二进制文件,只要使用它们的程序或驱动能够识别它们是由UPX压缩并且能够执行在文件中包含的解压缩代码即可。已知的例子是FreeDOS使用的.CPX文件以及被UPX压缩过的.CPI字体文件。
- 对于DOS平台,UPX支持特殊选项-8086,以强制嵌入式解压缩器与Intel 8088/8086处理器兼容,这样做之后即使在运行DOS的最早的PC上也可以执行和解压缩压缩文件。
外部链接
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.