UPX
2020-02-06 11:19:32 阿炯

UPX(the Ultimate Packer for eXecutables)是一个免费且开源的可执行程序文件加壳器,支持许多不同操作系统下的可执行文件格式,采用C++、汇编语言写成在GPLv2协议下授权。是一个非常全面的可执行文件压缩软件,支持 dos/exe、dos/com、dos/sys、djgpp2/coff、watcom/le、win32/pe、rtm32/pe、tmt/adam、atari/tos、linux/i386 等几乎所有平台上的可执行文件,具有极佳的压缩比,还可以对未压缩的文件和压缩完后进行比较。


UPX is a free, portable, extendable, high-performance executable packer for several executable formats.


UPX使用一种叫做UCL的压缩算法,这是一个对专有算法NRV(Not Really Vanished)算法的一个开源部分实现。受益于UCL的简单设计,其解压缩代码只需要额外的数百字节。UCL最大的好处是在解压缩过程中不需要额外的内存,意味着经过UPX压缩的可执行文件执行时通常也不需要为了解压缩付出额外内存。它从2.90 beta版本开始可在大多数平台上使用LZMA算法,但因为速度慢,在16位平台上LZMA算法默认被禁止使用(可以使用参数--lzma来强制使用) 。

UPX支持两种解压方式:就地解压或解压至临时文件夹

就地解压方法会直接把可执行文件提取到内存。但这种方式不可能支持所有系统平台,因此在必要之时UPX会使用另一种解压方式:将压缩文件提取到临时文件夹,这种方式支持封装任何平台和格式的可执行文件,可执行文件往往先会被提取到一个位置,之后用open()打开。然而提取到临时文件夹这种方式除了造成了额外占用之外,还有以下几个缺点:
特殊权限会被忽略,如设置用户标识符。
argv[0](即程序中获取到的可执行文件名)将会无效。
多实例应用程序将无法共享共同的程序部分(如内存内的相同代码)。


未特意以防止解包为目的修改过的UPX包通常能够被杀毒软件识别并进行解压操作,UPX也内置能够解压未修改UPX包的功能。在默认的UPX许可证中也明确禁止以防止上文所提及的解包为目的的修改。


最新版本:4.0
2022年10月下旬发布,具体更新内容包括:
切换到语义版本控制
SECURITY NOTES:强调文档中的 security context
支持使用 CMake 从源代码轻松构建
支持使用 Podman/Docker 从源代码轻松重建 stubs
添加集成的 doctest C++ 测试框架
添加对 EFI 文件的支持(PE x86;Kornel Pal)

详情可查看发行记录


项目主页:http://upx.sourceforge.net/