第十四課 壓縮與脫殼

第一節 壓縮工具介紹
第二節 認識脫殼
第三節 PROCDUMP使用
第四節 手動脫殼

     

PROCDUMP 應用文章 一
PROCDUMP 應用文章 二
PROCDUMP中文說明書

提高篇 (10 )

   今天,在吳朝相的網頁上看到一篇由台灣的 Peter's 寫的關於脫殼的文章,裡面提的了 Procdump1.50 的使用,但由於所寫的內容比較地膚淺,並沒有交待到 Procdump1.50 的強大之處,同時由於最近在線上的軟體,加殼之風日盛,如果作為一個 Cracker ,不跟著時代走,可 能在不久的將來,您就沒有什麼軟體可以修改了,所以一定要在加脫方法下點苦功才行,為此, 小弟想把一月來學習到的脫殼技術 Post 出來,讓大家了解一下在 Windows 上是如何進行軟體脫 殼的,同時也想向大家介紹強大的 Procdump1.50 是如何使用的,如何用它來進行手動脫殼的, 如何擴展自已的 Procdump1.50 的脫殼種類。但由於小弟在脫殼方面還是新手,如果文章中有錯誤之處,請來信指教。

讀者要求:

您可以閱讀和傳播本文章,但不能對文章的內容作任何的修改,請尊重作者的勞動。

首先我們要先準備我們的工具:

1.Procdump1.50

2.Ultraedit6.10 (這個您也可以用別的編輯器)

3.Winsoftice4.0

4.Trw0.75

5.MakePE1.27

6.Wdasm8.93
好了 ! 工具都準備齊全了,我們就去下載一個實驗品您 ! 今次我們選的是UPX ,在Procdump1.50的脫殼文件清單中,您可以清楚地看到有 UPX 的選項,所以我們今次就選它了,目前它的最新版本 0.82 ,好了下載完畢了,我們先用它來為軟體加一個脫您 !

操作:

1. windows 上開啟一個 Dos 視窗 , 進入 UPX0.82 所在的目錄;

2. 輸入 upx  [ 要加殼的文件路徑和文件名 ]

3.OK! 加殼成功了 !

好了 ! 現在可以試一試脫殼了 !

操作:

1. 執行 Procdump1.50

2. Unpack 按鈕,這時就出現了 Choose Unpacker 視窗;

3. 在視窗中選擇 UPX ,這時就會跳出一個選擇您要脫殼文件的選擇視窗;

4. 按下開啟,哦天啊 ! 好痛苦啊 ! 程式沒有脫殼竟然執行了, Procdump1.50 提示一個錯

誤發生在script 的第一行。
以上的所有操作,是對自動脫殼來說的,基本上的自動脫殼的操作都是這樣的。好了,難道就這樣沒有戲唱了嗎 ? 作者寫文章那會就寫這幾十行廢話呢 ? 請接著看下面的您 ! 好了,看一看它沒有沒防住 winsoftice 呢 ? 重新啟動機器,換一個有安裝 winsoftice windows 平台您 ! 再次執行被加脫了的程式,還好 ! 沒有當掉 winsoftice ,這樣心中暗喜,您有難了啊 ! 看來外國人寫的東西還是比較有善,不象 Ding Boy 的幻影系列,比小燕幾還凶 ( ^o^ ,又說 Ding Boy 的坏話了,其實有時我覺得他比較象 Crack 的小燕幾,令人又愛又恨) 。好了關閉程式,用 winsoftice載入去,唉剛剛還說好呢 ! 原來它還是對 winsoftice 作了一點小動作, winsoftice 不能中斷於程式的入口的第一句處。沒有關系,現在有三種方法,第一種方法是通過對程式的 exe 文件作一點修改,使其符合標准的 PE 文件格式,因為 winsoftice 畢竟不是專為 Crack 設計的,所以它的中斷程式入口是針圖示准的 PE 文件格式來寫的,對於那些不符合的,它就沒有能力了,具體的 PE 文件格式,大家可以看一看 VC 中的 MSDN 中的幫助和 WINNT.H 中的解釋;第二種方法就是不用 winsoftice ,而用TRW ,因為劉濤濤先生的 TRW 是專為 Crack 設計的,所以幾乎所有可以在 Windows 上執行的程式,它都可以中斷得了;第三種方法,就是在原 exe 文件中加插 int 3 語句,令 winsoftice 強行中斷。  好了,方法說了一大羅,我們就用最簡單的方法您 ! 沒人會有簡單的不用,去用最繁的,如果有您 ! 大家就。。。。。。。。

執行 TRW0.75 ,選擇選單中的 TRNEWTCB 命令,然後執行加脫的程式,程式馬上中斷於第一句了。

具體如下:

0137:0043D100  PUSHAD                  程式會中斷於這裡

0137:0043D101  MOV       ESI,0042B0D9

0137:0043D106  LEA       EDI,[ESI+FFFD5F27]

0137:0043D10C  PUSH      EDI

0137:0043D10D  OR        EBP,-01

0137:0043D110  JMP       0043D122           跳到解壓程式

0137:0043D112  NOP

0137:0043D113  NOP

解壓程式的入口:

0137:0043D122  8B1E                MOV       EBX,[ESI]

0137:0043D124  83EEFC            SUB        ESI,-04

0137:0043D127  11DB                ADC        EBX,EBX

0137:0043D129  72ED                JB           0043D118

0137:0043D12B  B801000000      MOV       EAX,00000001

0137:0043D130  01DB                ADD        EBX,EBX

0137:0043D132  7507                 JNZ         0043D13B

0137:0043D134  8B1E                MOV       EBX,[ESI]
好了在解壓程式裡面,程式會做無數次的循環,我沒有必要了解它是如何進行加壓的,所以就把游標一直向下走,一直走到這裡:

0137:0043D250  EBD6                JMP       0043D228

0137:0043D252  61                    POPAD

0137:0043D253  C3                     RET

0137:0043D254  61                     POPAD

0137:0043D255  E9D6A1FDFF    JMP       00417430         這就是程式的真正入口了

0137:0043D25A  0000                 ADD       [EAX],AL

0137:0043D25C  0000                 ADD       [EAX],AL

0137:0043D25E  0000                 ADD       [EAX],AL
好開心啊 ! 終於找到了入口地址,如果您只是針對某一個特定的程式而脫殼的,那麼現在就可以 TRW pedump 命令直接脫殼了,但這不是我們所要的,我們現在是要研究UPX0.82 的殼,要寫一個通用的脫殼 ini 加入到 Procdump1.50 裡面,那麼,這樣您以後就可以很方便脫掉 UPX0.82 的脫了,同時也很方便線上傳播了,讓別人也能分享您的成果,這才是真正的 Cracker 精神。

操作:

1. Ultraedit6.10 開啟 Procdump1.50 目錄下的 Script.ini 文件;

它的格式如下:

[INDEX]

P1=Hasiuk/NeoLite

P2=PESHiELD

P3=Standard

P4=Shrinker 3.3

P5=Wwpack32 I

P6=Manolo

P7=Petite<1.3

P8=Wwpack32 II

P9=Vbox Dialog

PA=Vbox Std

PB=Petite 1.x

PC=Shrinker 3.2

PD=PEPack

PE=UPX                          修改為 PE=UPX<0.7X

PF=Aspack<108

P10=SoftSentry

P11=CodeSafe 3.X

P12=Aspack108

P13=Neolite2

P14=Aspack108.2

P15=Petite 2.0

P16=Sentinel

P17=PKLiTE

P18=Petite 2.1

P19=PCShrink

P1A=PCGUARD v2.10

P1B=Aspack108.3

P1C=Shrinker 3.4

P1D=UPX0.7X-0.8X      加入這句

然後找到:

[UPX]                        修改為 [UPX<0.7X]

然後在文件最下面加入:

[UPX0.7X-0.8X]
好了,準備功夫我們都做好了,現在可以寫 UPX0.82 的脫殼擴展了,首先我們可以見到程序有兩個跳動的地方,第一個是:

0137:0043D110  JMP       0043D122           跳到解壓程式

所以我們馬上把機器代碼抄下來:

EB,10

第二個是:

0137:0043D255  E9D6A1FDFF    JMP       00417430         這就是程式的真正入口了

機器代碼就是:

E9,D6,A1,FD,FF

好了,所有的要找到東西我們都已經找到了,我們就開始編寫 UPX0.82 的脫殼擴展了。

我編寫的具體如下:

[UPX0.7X-0.8X]

L1=OBJR                                    ; 在掃描開始處設定初始的記憶體地址

L2=LOOK EB,10            ; 尋找第一個 EB,10 程式代碼

L3=BP                                      在當前記憶體位置設定斷點

L4=WALK                                    ; 交還控制權到 Procdump 並且執行下一個指令

L5=OBJR                                    ; 在掃描開始處設定初始的記憶體地址

L6=LOOK 61,E9                       ; 尋找第一個 EB,10 程式代碼

L7=BP                                      在當前記憶體位置設定斷點

L8=STEP                                    ; 一步一步地跟蹤分析程式
好了,以上的解釋都很清楚了,沒有什麼不明白了,我們把文件保存後,再次執行Procdump1.50 Choose Unpacker 中可以見到多了一個 UPX0.7X-0.8X 項了,選擇它,進行脫我們加了脫的程式,哈哈,叫我們保存了,您可以不要高興得太早了,您試一試執行 dump 程式,哦不能執行,非法操作。不要心急,我們好象還有點東西要加上呢 ! 那就是 dump 的可選參數了, Procdump1.50 一共給我們提供了五組可選參數,如果您沒有特別指出,就用預設值。好我們加上去試一試您 !

OPTL1=00000000

OPTL2=01010001

OPTL3=01010001

OPTL4=00030000

OPTL5=00000000
  以上這五參數是最常用的,您加參數時可要先試試,或者加了之後就可以用了,好我們加上,試一試。

以下文章所述,可能在有的機器上有不同的結果,請自行修正:

作者的機器是:

賽揚 300A (超 450 )

PC100-64M 記憶體
當我再次執行 Procdump1.50 來脫殼程式時,竟然程式一下幾就執行了,根本不象上次那樣提示要我保存脫殼後的文件,所以我想,可能這些參數有些不合適我的機器,於是我認真分析了每一個參數的真正含義之後,就把參數作了如下的修改:

OPTL1=00000001         這是延遲時間,我設為 1ms 

OPTL2=01010101         採用了快速 dump 的工作方式

OPTL3=01010001

OPTL4=00030000

OPTL5=00000000
今次再執行 Procdump1.50 進行脫殼,哈哈 ! ! ! 可以脫了,然後再雙擊脫殼後的文件,咦,可以執行了,再用 Wdasm8.93 反編譯分析一下文件,發現基本和原文件相同,只是文件大小有點不同,大了一點,再用了一下軟體的各種功能,一切正常,所以應該說脫殼是成功的,到此,文章也該在此結束了,不過好象還漏了點事,就是用 MakePe1.27 幫助脫殼後的文件作進一步的最佳化,這就不一一描述了,自己看幫助進行您 ! 好了,最後總結一下您 !

完整地加入:

[UPX0.7X-0.8X]

L1=OBJR

L2=LOOK EB,10

L3=BP

L4=WALK

L5=OBJR

L6=LOOK 61,E9

L7=BP

L8=STEP

OPTL1=00000001

OPTL2=01010101

OPTL3=01010001

OPTL4=00030000

OPTL5=00000000

By The Way !

我發現對於使用 UPX0.7x UPX0.8x 加殼的軟體,用我的方法都可以成功脫殼。

作者: Ru Feng

信箱: ocq@163.net (未得作者允許,嚴禁 Email 任何軟體到此信箱)

首頁 (一) : http://ocq.163.net (楓林居)

首頁 (二) : http://ocq.yeah.net (最 Cool VB 控件天堂)

首頁 (三) : http://ocqpat.163.net (我的作品,主要介紹“電子資料庫”軟體)
 
PROCDUMP 應用文章 一
PROCDUMP 應用文章 二
PROCDUMP中文說明書

 



回教學