UPX 是非常优秀的可执行程序压缩的工具,适用于多种不同的可执行格式。UPX 使用 UCL 的压缩算法。UPX 本质是压缩程序代码,减少程序体积,属于压缩壳。

UCL : 是一个用 ANSI C 编写的便携式无损数据压缩库,实现了一系列压缩算法,这些算法在实现优秀的压缩比/值的同时,允许非常快速的解压缩,并且解压缩时不需要额外的内存。

安装

# Debian 
$ sudo apt install upx-ucl 

GitHub 也提供了编译好的各平台的二进制文件

使用

压缩

$ upx [options] input_file

UPX 对文件的默认操作即为压缩,使用上述命令会使用默认参数压缩并替换文件 input_file 。

常用选项

  • -1[23456789] : 指定压缩级别,数值越高压缩率越高,耗时越长。对于小于 512 KiB 的文件默认使用 -8,其他的默认为 -7
  • --best : 最高压缩级别
  • --brute : 尝试使用各种压缩方式来获取最高压缩比
  • -o [file] : 将压缩文件另存为 [file]

解压

$ upx -d input_file

UPX 的优点

  • UPX 可以压缩各种类型的可执行文件
  • 压缩后的文件可以直接由操作系统执行
  • 压缩过程不会修改源文件,也就意味着解压后直接可以得到原始文件
  • 不会产生额外的动态库调用

UPX 的缺点

  • 运行的程序不会共享数据段(汇编),所以多实例运行的程序不适合压缩
  • 使用 lddsize 命令无法获取到程序的有效信息

原理

UPX 将程序压缩并在头部加入解压的程序,具体的原理可以参考 Packers, How They Work, Featuring UPX