昨天,UPX發布了3.93版本。
UPX(the Ultimate Packer for eXecutables)是一個非常全面的可執行文件壓縮軟件,支持dos/exe、dos/com、dos/sys、djgpp2/coff、 watcom/le、win32/pe、rtm32/pe、tmt/adam、atari/tos、linux/i386等幾乎所有平台上的可執行文件, 具有極佳的壓縮比,還可以對未壓縮的文件和壓縮完后進行比較。
1、准備源碼包
直接去github下載zip包或者直接克隆一下。
git clone https://github.com/upx/upx.git
cd upx
rmdir lzma-sdk
git clone https://github.com/upx/upx-lzma-sdk.git lzma-sdk
lzma庫無需編譯。
然后去下載UCL庫。
UCL是完全使用ANSI C編寫的NRV(Not Really Vanished)算法的一個開源實現。 具體的介紹請查閱http://www.oberhumer.com/opensource/ucl/
wget http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz
國外的網站下載比較慢,可以直接點擊此處下載我已經下好的。
2、編譯
UCL編譯
先生成Makefile
文件
tar -xzvf ucl-1.03.tar.gz
cd ucl-1.03
./configure --prefix=/home/o/ucl CC=clang
注意上面,指定了C編譯器為clang
。這里是因為gcc的一個bug,導致 ACC一致性測試失敗 ,所以使用clang。
gcc出現的錯誤情況在這里FTBFS with GCC 6: compiler failed the ACC conformance test有詳細描述。
編譯UPX
使用下面命令編譯upx
make all UPX_UCLDIR=/home/o/upx/ucl/ucl-1.03 UPX_LZMADIR=./src/lzma-sdk
注意,這里的UPX_UCLDIR
變量的值必須是絕對路徑。
編譯出的結果是upx.out
程序,在src
目錄下。
3、使用測試
先查看一下編譯出upx.out
的文件大小
> ls -l upx.out
-rwxr-xr-x 1 o users 2006544 2月 8 16:08 upx.out
然后用其對自身進行壓縮一下
cp upx.out upx.out2
> ./upx.out upx.out2
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2017
UPX git-fdce70 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 29th 2017
File size Ratio Format Name
-------------------- ------ ----------- -----------
2006544 -> 479576 23.90% linux/amd64 upx.out2
Packed 1 file.
WARNING: this is an unstable beta version - use for testing only! Really.
> ls -lh upx.out2
-rwxr-xr-x 1 o users 469K 2月 8 16:09 upx.out2
可以看到,壓縮的效果還是很明顯的。
為了對比,下面使用strip
刪除多余信息,並使用gzexe
壓縮(先還原upx.out2,通過命令./upx.out -d upx.out2
)
> strip upx.out2
> ll upx.out2
-rwxr-xr-x 1 o users 1.7M 2月 8 16:13 upx.out2
> gzexe upx.out2
upx.out2: 72.7%
> ll upx.out2
-rwxr-xr-x 1 o users 455K 2月 8 16:14 upx.out2
UPX相對gzexe不一定有壓縮上的優勢,但是其具有跨平台的優勢。且UPX壓縮之后的程序依然是一個ELF
文件,但gzexe壓縮之后的程序是一個posix shell腳本(后部分是壓縮后的程序二進制文件)。