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 進一步壓縮體積。
如何使用
安裝
訪問官方下載地址:https://github.com/upx/upx/releases/latest
根據開發環境選擇不同的 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 秒 |

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