UPX 是什么
UPX 全称是 "Ultimate Packer for eXecutables",是一个免费、开源、编写、可扩展、高性能的可执行程序打包程序。换句话说一个可执行文件的压缩工具。主要的功能是将可执行的二进制程序、动态链接库和其他的二进制文件压缩为更小的体积,UPX 通常可以将文件大小减少 50% - 70%。从而减少磁盘空间占用、降低网络传输所需带宽、以及分发成本(UPX 创建于 1996年,那时大家都在使用软盘,所以存储空间十分宝贵,也凸显了可执行程序压缩的必要性)。
同时 UPX 还有以下优势:
- 可靠性: UPX 内部维护了一套校验逻辑,对压缩前和解压后的文件进行校验,以保证程序的完整性。
- 安全性: 由于UPX 多年来一直是开源项目,因此任何开发者、防病毒软件厂商都能看到 UPX 压缩程序内部逻辑并验证安全性。
- 解压速度: 在任何现代机器上,解压速度都超过 500 MB/秒。
- 无内存开销: 解压运行压缩后的程序无需额外的内存开销。
- 出色的压缩比: UPX 通常比传统的 Zip 压缩算法压缩效果更好。使用 UPX 可以减小分发文件的大小,从而在网络传输和存储方面节省资源。
- 通用性: 可以打包多种可执行格式,包括 Windows 应用程序和 DLL、macOS 应用程序和 Linux 可执行文件。
- 可扩展: UPX 良好的代码设计,很容易添加新的可执行文件格式支持和新的压缩算法。
UPX 的争议
UPX 除了上面提到的压缩功能之外,还有另一个主要作用就是加壳。既字面意思,将可执行程序的外部再包一层外壳程序,并在运行时使用外壳程序将实际的程序来解压运行。
通过 UPX 加壳有以下优势:
- 安全性:加壳可以提高可执行文件的安全性,因为攻击者很难直接分析或修改外壳程序中的代码。这样可以防止恶意修改和病毒注入。
- 反调试和反分析:一些外壳程序可以包含反调试和反分析的技术,使得分析者难以逆向工程和分析程序的逻辑。
- 授权保护:加壳可以用于保护软件的授权,使其只能在经过授权的环境中运行,从而防止盗版。
- 代码混淆:加壳可以将原始可执行文件的代码混淆到外壳程序中,增加分析的复杂性,从而提高了对抗逆向工程的能力。
在过去的一段时间里,一些黑客或者恶意软件作者使用 UPX 等加壳工具来隐藏恶意软件和病毒,以逃避杀毒软件和分析者的检测。主要有以下几个要点:
- 病毒和恶意软件的加壳:黑客和恶意软件作者使用UPX等加壳工具来包装他们的恶意代码。这使得分析者和杀毒软件难以识别和分析这些恶意软件,因为它们需要解压缩才能揭示其真实的目的和功能。
- 病毒分发:加壳也可用于将恶意软件嵌入到合法的可执行文件中,然后通过社会工程或其他手段欺骗用户执行。用户可能认为他们正在运行一个合法的程序,但实际上却是运行了一个加壳的恶意软件。
- 反病毒工具的适应性:随着黑客使用加壳技术来隐藏其活动,安全软件公司也不得不不断提高其产品的适应性,以识别和处理加壳的可执行文件。这导致了反病毒工具的不断演进,以更好地应对这种挑战。
- 法律和道德问题:加壳技术的滥用引发了一系列法律和道德问题。黑客使用加壳来隐藏其犯罪活动,这导致了对加壳工具的合法性和使用的争议。
正因为上面提到的一些争议,导致大部分情况下,杀毒软件会对加壳的可执行文件产生警报或误报病毒。这是因为加壳技术会改变可执行文件的结构和行为,使杀毒软件难以确定文件的真实性质。不过随着杀毒软件公司对检测引擎的改进,这些误报也在逐渐减少。
为什么使用 UPX
我使用 UPX 的目的是因为自己在公司内部做了一个运维工具,这个运维工具对部署的便捷程度要求比较高。运维工具使用 Go 语言开发,在项目编译的同时将依赖的资源文件,借助 Go 语言的 embed
功能打包到二进制文件内部,使其运行只依赖主程序一个文件。
编译的 Linux 可执行文件有 22 MB 左右,为了进一步方便运维同时部署此工具,决定使用 UPX 进一步压缩体积。
下载安装
访问官方下载地址:github.com/upx/upx/rel…
根据开发环境选择不同的 upx 版本,我的开发环境是 Windows,所以选择的也是 Windows 版本,需要注意的是,upx 可以跨平台压缩,也就是说可以在Windows 的开发平台上压缩 Linux 平台的可执行程序。
下载完成后可以选择直接解压 upx 主程序使用,或者配置环境变量来使用。
使用说明
UPX 的基本使用格式为:upx [选项] 待压缩的文件
压缩级别参数
- 默认级别: 通常是一个压缩比和消耗时间的中间选项,如果不指定压缩级别参数,UPX 会使用此级别。
- -1 ~ -9: UPX 提供了
-1
到-9
的压缩级别参数。其中-1
表示最低级别的压缩,而-9
表示最高级别的压缩,通常级别越高,压缩比越高(压缩后体积越小),但压缩所需时间也会更长。 - --brute: 高级别的压缩选项,类似于
-9
,但压缩的过程中会使用更多的压缩技巧,可能会导致更长的压缩时间。 - --ultra-brute: UPX 中最高级别的压缩,使用最激进的压缩算法,尽可能的减小文件大小。需要更长的压缩时间,并且运行时所需的解压时间也会增加。
- --best: 使用最佳压缩结果的选项,通常效果等于
-9
或者--ultra-brute
。 - --fast: 使用最快压缩速度的选项,通常效果等于
-1
或者-2
- --lzma: 使用 LZMA 算法进行压缩,可以获得比较高的压缩比,但不会有
--ultra-brute
那么激进,且通常比-9
更快。 - --overlay: 选项将压缩文件附加到可执行文件的末尾,而不是创建新文件。这可以用于一些特殊用途。
- --force: 用于强制压缩,即使 UPX 认为此文件不适合压缩。
- --all-filters: 尝试所有可用的压缩算法,以尝试找到最佳的压缩组合(个人感觉和默认差不多)。
其他参数
- -o: 指定压缩后文件输出的名称,如果不指定则默认覆盖原始文件。
- --list: 列出压缩过的文件信息,例如压缩比例、文件大小等。
- --quiet: 或
-q
选项,使用安静模式,减少输出信息,在批处理或自动化的过程中使用。 - --verbose: 或
-v
选项,启用详细输出,嫌疑有关压缩进程的详细信息。 - --test: 用于测试压缩程序是否能正常的解压缩或运行,不会进行实际的压缩操作。
- --keep: 保留原始文件,默认情况下如果不指定输出文件名,则会在压缩结束后删掉原始文件。
- --threads: 指定用于压缩的线程数,默认情况下与 CPU 核心数量相等。
- --decompress: 用于解压还原已经被 UPX 压缩的文件。
压缩效果展示
我这里使用一个体积为 23007232 字节(21.9MB),使用 Go 语言编译后的二进制程序进行压缩测试,演示在不同压缩机别下的压缩比、耗时、压缩后的体积等信息,提供压缩算法的选择参考。
压缩级别/算法 | 压缩率 | 体积(字节) | 体积(MB) | 所需耗时 |
---|---|---|---|---|
-1 |
49.43 % | 11372704 | 10.8 | 1 秒 |
-3 |
46.84 % | 10776640 | 10.2 | 2 秒 |
-5 |
38.34 % | 8820112 | 8.41 | 5 秒 |
-7 |
36.13 % | 8312776 | 7.92 | 11 秒 |
-9 |
35.23 % | 8104520 | 7.72 | 18 秒 |
默认级别 | 36.13 % | 8312776 | 7.92 | 10 秒 |
--brute |
29.87 % | 6871344 | 6.55 | 107 秒 |
--ultra-brute |
29.74 % | 6843300 | 6.52 | 128 秒 |
--lzma |
29.97 % | 6896080 | 6.57 | 11 秒 |
--best |
35.21 % | 8100232 | 7.72 | 10 秒 |
--fast |
49.43 % | 11372704 | 10.8 | 1 秒 |
博客地址:www.dbkuaizi.com 参考来源: upx.github.io
作者:两双筷子
链接:https://juejin.cn/post/7273803674789593127
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 标签:可执行文件,压缩工具,--,压缩,加壳,UPX,使用 From: https://www.cnblogs.com/jiftle/p/17932723.html