upx加殼軟件

今天我們來學習一款給應用加殼的軟件,叫做upx(the Ultimate Packer for eXecutables)

首先我們先看下它**百科的釋義:

UPX (the Ultimate Packer for eXecutables)是一款先進的可執行程序文件壓縮器,壓縮過的可執行文件體積縮小50%-70% ,這樣減少了磁盤占用空間、網絡上傳下載的時間和其它分布以及存儲費用。 通過 UPX 壓縮過的程序和程序庫完全沒有功能損失和壓縮之前一樣可正常地運行,對于支持的大多數格式沒有運行時間或內存的不利后果。 UPX 支持許多不同的可執行文件格式 包含 Windows 95/98/ME/NT/2000/XP/CE 程序和動態鏈接庫、DOS 程序、 Linux 可執行文件和核心。

那么百科的釋義呢很簡單,主要有兩點,一個是加殼,一個是壓縮。

小試牛刀

先準備好材料

//hello.cpp
#include <iostream>

using namespace std;
int main() {
    int i = 10;
    for(;i > 0;i--) {
        cout<<"hello,i = "<<(10 - i)<<endl;
    }
    return 0;
}

還是熟悉的配方。好,那么我們upx一下

 $ g++ hello.cpp -o hello.out
 $ upx hello.out -o hello.upx.out
 Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2017
UPX 3.94        Markus Oberhumer, Laszlo Molnar & John Reiser   May 12th 2017

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
upx: hello.strip.out: NotCompressibleException

Packed 1 file: 0 ok, 1 error.
 $ 

那么是什么問題呢,我上網找了一下。原來是upx不支持太小的文件。小于40kb的文件就不支持了。
好,那么本文就到此結束啦,謝謝大家的觀看。

再次嘗試

等等,我輩豈是如此輕言放棄之人。

//hello.go
package main

import "fmt"
func main() {
    i := 10
    for ; i > 0; i-- {
        fmt.Printf("hello,i = %d\n",(10 - i))
    }
}

然后編譯

 $ go build hello.go
 $ ls -l
total 2040
-rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
-rw-r--r-- 1 root root     141 Jul 13 03:00 hello.go
 $ 

那么我們得到了一個20M的可執行文件,讓我們來upx一下它

$ upx hello -o hello.upx.out
 $ ls -l
total 4592
-rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
-rw-r--r-- 1 root root     141 Jul 13 03:00 hello.go
-rwxr-xr-x 1 root root 1143336 Jul 13 03:23 hello.upx.out
 $ 

嗯,確實小了不少,upx處理后,變成了11M;看小減少了百分之多少。
(2080925-1143336)/2080925≈45.07%
嗯,比strip多一點。
那么看看,能不能再strip

$ strip hello.upx.out -o hello.upxs.out
strip: error: the input file 'hello.upx.out' has no sections
 $ 

那么我們分析一下應該不難得知,upx把殼給加上了,導致strip找不到那些標記

反向操作

那么呢,我們是不能把這個過程給反一下。是不是就可以了呢
好,那么說干就干

 $ strip hello -p -o hello.s.out
 $ ls -l
total 4592
-rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
-rw-r--r-- 1 root root     141 Jul 13 03:00 hello.go
-rwxr-xr-x 1 root root 1463768 Jul 13 03:23 hello.s.out
-rwxr-xr-x 1 root root 1143336 Jul 13 03:23 hello.upx.out
 $ upx hello.s.out -o hello.su.out
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2017
UPX 3.94        Markus Oberhumer, Laszlo Molnar & John Reiser   May 12th 2017

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   1463768 ->    574340   39.24%   linux/amd64   hello.su.out

Packed 1 file.
 $ ls -l
total 5156
-rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
-rw-r--r-- 1 root root     141 Jul 13 03:00 hello.go
-rwxr-xr-x 1 root root 1463768 Jul 13 03:23 hello.s.out
-rwxr-xr-x 1 root root  574340 Jul 13 03:23 hello.su.out
-rwxr-xr-x 1 root root 1143336 Jul 13 03:23 hello.upx.out
 $ 

嗯,很好。套娃成功
看下減少了多少,1-574340/2080925≈72.40%
那么這個減少的量是比較多的,讓我們來看看可以運行嗎

 $ ./hello.su.out
hello,i = 0
hello,i = 1
hello,i = 2
hello,i = 3
hello,i = 4
hello,i = 5
hello,i = 6
hello,i = 7
hello,i = 8
hello,i = 9
 $ 

那么我們可以看到,這個是可以正常運行的。

繼續研究

那么我們來看看upx可以帶哪些選項吧,

 $ upx
                        Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2017
UPX 3.94        Markus Oberhumer, Laszlo Molnar & John Reiser   May 12th 2017

Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..

Commands:
  -1     compress faster                   -9    compress better
  -d     decompress                        -l    list compressed file
  -t     test compressed file              -V    display version number
  -h     give more help                    -L    display software license
  Options:
  -q     be quiet                          -v    be verbose
  -oFILE write output to 'FILE'
    -f     force compression of suspicious files
  -k     keep backup files
file..   executables to (de)compress

Type 'upx --help' for more detailed help.

UPX comes with ABSOLUTELY NO WARRANTY; for details visit https://upx.github.io
 $ 

命令:

有1到9的壓縮等級;
-d 不壓縮;
-l 列出壓縮的文件;
-t 測試壓縮文件;
-h 顯示幫助文檔
-V 顯示版本號
-L 顯示軟件許可證

選項:

-q 安靜模式
-v 詳細模式
-o 大家都懂,輸出到文件
-f 強制壓縮可以的文件
-k 保持備份文件

嗯, 好像沒有什么值得深究的功能, 這個壓縮等級大家可以按照自己的需要去調整。
好,就這樣。

總結

最后我們來總結一下
首先這個upx之后的東西,嗯,它的時間戳還是保留之前的
然后呢,upx操作之后呢,這個sections會變得面目全非。所以再去strip呢,就不行了
所以我們需要采取反向操作先strip然后再upx
然后呢就是壓縮的等級,-1是優先速度,-9是優先質量。那么中間的按照這個去推斷。
好了,本文到這里就結束啦,如果喜歡這篇文章,記得點贊。謝謝

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容