UPX 可執行文件壓縮工具的介紹與使用

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 秒

Snipaste_2023-09-02_02-04-04.png

博客地址:www.dbkuaizi.com 參考來源: upx.github.io


作者:兩雙筷子
鏈接:https://juejin.cn/post/7273803674789593127
來源:稀土掘金
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章