UPX 是什么
UPX 全稱是 "Ultimate Packer for eXecutables",是一個(gè)免費(fèi)、開源、編寫、可擴(kuò)展、高性能的可執(zhí)行程序打包程序。換句話說一個(gè)可執(zhí)行文件的壓縮工具。主要的功能是將可執(zhí)行的二進(jìn)制程序、動(dòng)態(tài)鏈接庫和其他的二進(jìn)制文件壓縮為更小的體積,UPX 通常可以將文件大小減少 50% - 70%。從而減少磁盤空間占用、降低網(wǎng)絡(luò)傳輸所需帶寬、以及分發(fā)成本(UPX 創(chuàng)建于 1996年,那時(shí)大家都在使用軟盤,所以存儲(chǔ)空間十分寶貴,也凸顯了可執(zhí)行程序壓縮的必要性)。
同時(shí) UPX 還有以下優(yōu)勢(shì):
- 可靠性: UPX 內(nèi)部維護(hù)了一套校驗(yàn)邏輯,對(duì)壓縮前和解壓后的文件進(jìn)行校驗(yàn),以保證程序的完整性。
- 安全性: 由于UPX 多年來一直是開源項(xiàng)目,因此任何開發(fā)者、防病毒軟件廠商都能看到 UPX 壓縮程序內(nèi)部邏輯并驗(yàn)證安全性。
- 解壓速度: 在任何現(xiàn)代機(jī)器上,解壓速度都超過 500 MB/秒。
- 無內(nèi)存開銷: 解壓運(yùn)行壓縮后的程序無需額外的內(nèi)存開銷。
- 出色的壓縮比: UPX 通常比傳統(tǒng)的 Zip 壓縮算法壓縮效果更好。使用 UPX 可以減小分發(fā)文件的大小,從而在網(wǎng)絡(luò)傳輸和存儲(chǔ)方面節(jié)省資源。
- 通用性: 可以打包多種可執(zhí)行格式,包括 Windows 應(yīng)用程序和 DLL、macOS 應(yīng)用程序和 Linux 可執(zhí)行文件。
- 可擴(kuò)展: UPX 良好的代碼設(shè)計(jì),很容易添加新的可執(zhí)行文件格式支持和新的壓縮算法。
UPX 的爭(zhēng)議
UPX 除了上面提到的壓縮功能之外,還有另一個(gè)主要作用就是加殼。既字面意思,將可執(zhí)行程序的外部再包一層外殼程序,并在運(yùn)行時(shí)使用外殼程序?qū)?shí)際的程序來解壓運(yùn)行。
通過 UPX 加殼有以下優(yōu)勢(shì):
- 安全性:加殼可以提高可執(zhí)行文件的安全性,因?yàn)楣粽吆茈y直接分析或修改外殼程序中的代碼。這樣可以防止惡意修改和病毒注入。
- 反調(diào)試和反分析:一些外殼程序可以包含反調(diào)試和反分析的技術(shù),使得分析者難以逆向工程和分析程序的邏輯。
- 授權(quán)保護(hù):加殼可以用于保護(hù)軟件的授權(quán),使其只能在經(jīng)過授權(quán)的環(huán)境中運(yùn)行,從而防止盜版。
- 代碼混淆:加殼可以將原始可執(zhí)行文件的代碼混淆到外殼程序中,增加分析的復(fù)雜性,從而提高了對(duì)抗逆向工程的能力。
在過去的一段時(shí)間里,一些黑客或者惡意軟件作者使用 UPX 等加殼工具來隱藏惡意軟件和病毒,以逃避殺毒軟件和分析者的檢測(cè)。主要有以下幾個(gè)要點(diǎn):
- 病毒和惡意軟件的加殼:黑客和惡意軟件作者使用UPX等加殼工具來包裝他們的惡意代碼。這使得分析者和殺毒軟件難以識(shí)別和分析這些惡意軟件,因?yàn)樗鼈冃枰鈮嚎s才能揭示其真實(shí)的目的和功能。
- 病毒分發(fā):加殼也可用于將惡意軟件嵌入到合法的可執(zhí)行文件中,然后通過社會(huì)工程或其他手段欺騙用戶執(zhí)行。用戶可能認(rèn)為他們正在運(yùn)行一個(gè)合法的程序,但實(shí)際上卻是運(yùn)行了一個(gè)加殼的惡意軟件。
- 反病毒工具的適應(yīng)性:隨著黑客使用加殼技術(shù)來隱藏其活動(dòng),安全軟件公司也不得不不斷提高其產(chǎn)品的適應(yīng)性,以識(shí)別和處理加殼的可執(zhí)行文件。這導(dǎo)致了反病毒工具的不斷演進(jìn),以更好地應(yīng)對(duì)這種挑戰(zhàn)。
- 法律和道德問題:加殼技術(shù)的濫用引發(fā)了一系列法律和道德問題。黑客使用加殼來隱藏其犯罪活動(dòng),這導(dǎo)致了對(duì)加殼工具的合法性和使用的爭(zhēng)議。
正因?yàn)樯厦嫣岬降囊恍?zhēng)議,導(dǎo)致大部分情況下,殺毒軟件會(huì)對(duì)加殼的可執(zhí)行文件產(chǎn)生警報(bào)或誤報(bào)病毒。這是因?yàn)榧託ぜ夹g(shù)會(huì)改變可執(zhí)行文件的結(jié)構(gòu)和行為,使殺毒軟件難以確定文件的真實(shí)性質(zhì)。不過隨著殺毒軟件公司對(duì)檢測(cè)引擎的改進(jìn),這些誤報(bào)也在逐漸減少。
為什么使用 UPX
我使用 UPX 的目的是因?yàn)樽约涸诠緝?nèi)部做了一個(gè)運(yùn)維工具,這個(gè)運(yùn)維工具對(duì)部署的便捷程度要求比較高。運(yùn)維工具使用 Go 語言開發(fā),在項(xiàng)目編譯的同時(shí)將依賴的資源文件,借助 Go 語言的 embed
功能打包到二進(jìn)制文件內(nèi)部,使其運(yùn)行只依賴主程序一個(gè)文件。
編譯的 Linux 可執(zhí)行文件有 22 MB 左右,為了進(jìn)一步方便運(yùn)維同時(shí)部署此工具,決定使用 UPX 進(jìn)一步壓縮體積。
如何使用
安裝
訪問官方下載地址:https://github.com/upx/upx/releases/latest
根據(jù)開發(fā)環(huán)境選擇不同的 upx 版本,我的開發(fā)環(huán)境是 Windows,所以選擇的也是 Windows 版本,需要注意的是,upx 可以跨平臺(tái)壓縮,也就是說可以在Windows 的開發(fā)平臺(tái)上壓縮 Linux 平臺(tái)的可執(zhí)行程序。
下載完成后可以選擇直接解壓 upx 主程序使用,或者配置環(huán)境變量來使用。
使用
UPX 的基本使用格式為:upx [選項(xiàng)] 待壓縮的文件
壓縮級(jí)別參數(shù)
- 默認(rèn)級(jí)別: 通常是一個(gè)壓縮比和消耗時(shí)間的中間選項(xiàng),如果不指定壓縮級(jí)別參數(shù),UPX 會(huì)使用此級(jí)別。
- -1 ~ -9: UPX 提供了
-1
到 -9
的壓縮級(jí)別參數(shù)。其中 -1
表示最低級(jí)別的壓縮,而 -9
表示最高級(jí)別的壓縮,通常級(jí)別越高,壓縮比越高(壓縮后體積越小),但壓縮所需時(shí)間也會(huì)更長(zhǎng)。 - --brute: 高級(jí)別的壓縮選項(xiàng),類似于
-9
,但壓縮的過程中會(huì)使用更多的壓縮技巧,可能會(huì)導(dǎo)致更長(zhǎng)的壓縮時(shí)間。 - --ultra-brute: UPX 中最高級(jí)別的壓縮,使用最激進(jìn)的壓縮算法,盡可能的減小文件大小。需要更長(zhǎng)的壓縮時(shí)間,并且運(yùn)行時(shí)所需的解壓時(shí)間也會(huì)增加。
- --best: 使用最佳壓縮結(jié)果的選項(xiàng),通常效果等于
-9
或者 --ultra-brute
。 - --fast: 使用最快壓縮速度的選項(xiàng),通常效果等于
-1
或者 -2
- --lzma: 使用 LZMA 算法進(jìn)行壓縮,可以獲得比較高的壓縮比,但不會(huì)有
--ultra-brute
那么激進(jìn),且通常比 -9
更快。 - --overlay: 選項(xiàng)將壓縮文件附加到可執(zhí)行文件的末尾,而不是創(chuàng)建新文件。這可以用于一些特殊用途。
- --force: 用于強(qiáng)制壓縮,即使 UPX 認(rèn)為此文件不適合壓縮。
- --all-filters: 嘗試所有可用的壓縮算法,以嘗試找到最佳的壓縮組合(個(gè)人感覺和默認(rèn)差不多)。
其他參數(shù)
- -o: 指定壓縮后文件輸出的名稱,如果不指定則默認(rèn)覆蓋原始文件。
- --list: 列出壓縮過的文件信息,例如壓縮比例、文件大小等。
- --quiet: 或
-q
選項(xiàng),使用安靜模式,減少輸出信息,在批處理或自動(dòng)化的過程中使用。 - --verbose: 或
-v
選項(xiàng),啟用詳細(xì)輸出,有關(guān)壓縮進(jìn)程的詳細(xì)信息。 - --test: 用于測(cè)試壓縮程序是否能正常的解壓縮或運(yùn)行,不會(huì)進(jìn)行實(shí)際的壓縮操作。
- --keep: 保留原始文件,默認(rèn)情況下如果不指定輸出文件名,則會(huì)在壓縮結(jié)束后刪掉原始文件。
- --threads: 指定用于壓縮的線程數(shù),默認(rèn)情況下與 CPU 核心數(shù)量相等。
- --decompress: 用于解壓還原已經(jīng)被 UPX 壓縮的文件。
壓縮效果展示
我這里使用一個(gè)體積為 23007232 字節(jié)(21.9MB),使用 Go 語言編譯后的二進(jìn)制程序進(jìn)行壓縮測(cè)試,演示在不同壓縮級(jí)別下的壓縮比、耗時(shí)、壓縮后的體積等信息,提供壓縮算法的選擇參考。
壓縮級(jí)別/算法 | 壓縮率 | 體積(字節(jié)) | 體積(MB) | 所需耗時(shí) |
---|
-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 秒 |
默認(rèn)級(jí)別 | 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 秒 |

(高清圖片可點(diǎn)擊原文連接在我的博客查看)
參考來源: https://upx.github.io?
閱讀原文:原文鏈接
該文章在 2025/3/25 10:29:19 編輯過