0%

upx 教程

前言

upx 是一款压缩可执行文件的软件,压缩率在 20% 到 %70 之间。在可执行文件运行的时候并不需要解压软件,程序在内存中自动展开。

本教程在 linux 下进行,理论上支持所有 linux 发型版。

安装 upx

upx 请从 upx 官网下载,不要用包管理器进下载。一般来说发行版默认源的软件比较老可能不支持比较新的语言生成的二进制文件,有压坏二进制的风险。

本教程的下载地址可能不是最新版请访问 https://upx.github.io 下载最新版

下载 upx

wget https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz

解压二进制

tar -Jxf upx*.tar.xz

为了方便使用移动 upx 到系统变量目录,如果不愿意使用 root 的话可以将 upx 目录添加到环境变量

sudo cp upx*/upx /usr/bin

然后就可以使用了

upx 基本使用

upx 的参数可以通过 upx -h 进行查看,打印的信息太多了这里我就不一一列出了。

如果直接执行 upx 文件名 的话,压缩过的二进制会覆盖当前的文件可通过 -o 参数指定输出的文件名。

不多废话了,接下来就开始了,我会使用 go 语言进行演示。

创建 hello.go 然后写入一个非常经典的 Hello World!

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello World!")
}

然后执行 go build生成可执行文件,注意哦是 go,不要使用 gccgo ,gccgo 生成的代码亲测会压坏。

go build hello.go

然后发现生成的可执行文件比较大,静态链的当然大啦就算是 c 静态生成也比较大

elissa@Tokyo:~/code$ du -h *
1.9M    hello
4.0K    hello.go
elissa@Tokyo:~/code$

然后我们去除 go 的调试信息和符号,这样的话二进制还能再小一点

go build -o hello2 -ldflags "-s -w" hello.go

然后小了 300kb

elissa@Tokyo:~/code$ du -h *
1.9M    hello
1.3M    hello2
4.0K    hello.go
elissa@Tokyo:~/code$

接下来就该 upx 上场了,为了方便区分我们将压缩过的二进制进行重命名,并且是在开始的位置重命名

upx -o upx_hello hello

然后对去除了调试信息的 二进制也压缩一下

upx -o upx_hello2 hello2

原版二进制减少了近 50%,去除了调试信息的减少 35%

elissa@Tokyo:~/code$ du -h *
1.9M    hello
1.3M    hello2
4.0K    hello.go
928K    upx_hello
468K    upx_hello2
elissa@Tokyo:~/code$

然后都运行一下防止压坏了

elissa@Tokyo:~/code$ ./hello
Hello World!
elissa@Tokyo:~/code$ ./hello2
Hello World!
elissa@Tokyo:~/code$ ./upx_hello
Hello World!
elissa@Tokyo:~/code$ ./upx_hello2
Hello World!
elissa@Tokyo:~/code$

OK 测试通过了

注意事项

如果你使用 go build --compiler gccgo 文件 ,失败了的话可能是 go 与 gccgo 自荐的版本相差太大了

参考

https://upx.github.io

https://blog.golang.org/go1.7-binary-size