|
|
|
|
|
|
|
|
|
這節以一實例介紹一下手動脫殼最簡單的情況,我們平時碰到最多的EXE壓縮工具是UPX、ASPACK等,在這裡我們用UPX來壓縮windows自帶的記事本程式,然後手動將其脫殼。
UPX版本: UPX V1.01
原文件: Notepad
34K
用UPX壓縮後: Notepad-upx
16K
由於現在PROCDUMP暫停升級,因此您用PROCDUMP是不能自動脫這些新版UPX壓縮軟體的殼,但我們手動脫殼後,可自己寫PROCDUMP腳本命令,使它升級。
我來分析一下用UPX壓縮後的記事本程式執行情況,UPX壓縮時在記事本程式前加了一段自解壓代碼,記事本程式執行時,首先就執行這自解壓代碼,這段代碼按一定算法,將壓縮過的記事本程式在記憶體解壓,直到將記事本程式完全解壓,跳到記事本程式代碼處 (這個地方就是入口
因此手動脫殼 關鍵是找到入口點,不然就不能得到完整的解壓程式代碼。找入口點可依據如下原則: 決大多數 PE 加殼程式在被加密的程式中加上 1 個或多個段。 所以看到一個跨段的 JMP 就有可能是了。 UPX 用了一次跨段的 JMP , ASPACK 用了兩次跨段的 JMP 。 就是您一步步跟蹤時會看到代碼有一突躍,一般再跟據領空文件名的變化,就能確定入口點了。
好說了這麼多了,我們開始工作:
一、分析是用何軟體壓縮 (假設開始我們不知是用什麼軟體壓縮的)
一般拿到這軟體後,可用工具gtw、TYP32、FileInfo 等偵測文件類型的工具來看看是何種軟體壓縮的,在這我們以FileInfo 為例,把Notepad-upx 複製到工具軟體目錄下,在資源管理器下雙擊FileInfo,再按Enter,您將看到報告出來: 告訴您這是UPX1.01壓縮的軟體。
或您用Procdump工具,執行 Procdump後,點擊PE Editor按鈕,選上Notepad-upx文件,再點擊Sections按鈕,您會看到Sections informations對話視窗裡,Name那項有UPX0、UPX1,這表明是用UPX壓縮的。 (這裡的一些具體參數含義參考脫殼高級篇一課,這裡暫時可不理它)
二、用TRW2000來脫殼
?手動找入口點
執行TRW2000裝載Notepad-upx,然後LOAD,您將中斷在主程式入口處: 此時按F10、F7 (程式執行到游標行,用來走出循環) 一直向前走,注意此時領空會是: NOTUPX!UPX1+2xxx.直到您來到:
0137:40ddbe popa
0137:40ddf jmp 00401000 <-此行己完全解壓結束,將要跳到記事本程式入口點執行程式。 ........................ 0137:401000 push ebp <-完全解壓後的記事本程式第一行 |
好了,基本大功告成,在0137:401000一行,執行命令makepe 文件名或pedump 文件名。就這樣脫殼成功。
makepe命令含義: 從記憶體中整理出一個指令名稱的PE格式的exe文件, 當前的 EIP 將成為新的程式入口,生成文件的 Import table 已經重新生成過了。生成的PE文件可執行任何平台和微處理器上。
pedump命令含義: 將PE文件的記憶體映像直接映像到指定的文件裡。生成的文件只能在本機執行,不能在其它系統平台或微處理器執行。
您也可用Procdump來配合脫殼,在137:401000一行,執行suspend命令挂起程式。然後就回到windows下,執行
Procdump文件,在 Procdump的左上視窗中,在Task一列找到Notepad-upx.exe,然後在此行點擊右鍵,選擇
DUMP (FULL) ,將記憶體中的記事本程式以另一文件名儲存。然後點擊PE
Editor按鈕,選上您剛脫殼的文件,會出現一視窗,在Entry Point (入口點) 一項填上程式入口點,這裡是00401000,然後點擊OK儲存,即可。注: 在此例DUMP (FULL) 的入口點剛好是00401000,在大多數情況下,均要手動修正。這樣處理後,程式脫殼成功。此時您可在
Procdump選上剛才的記事本程式,點擊右鍵,用Kill Task命令關閉記事本程式。
?用PNEWSEC命令找入口點
執行TRW2000裝載Notepad-upx,然後LOAD,您將中斷在主程式入口處: 執行命令PNEWSEC,稍等就會停在入口點,剩下的和上面一樣,但有時用這命令對一些程式無效,就不得不用手動來找入口點了。
PNEWSEC: 執行直到進入一個 PE 程式記憶體的新的 section時產生斷點。 (如不懂,以後到脫殼高級篇自會明白)
三、用SOFTICE來脫殼
?用SOFTICE找入口點,只有靠手動來找了,方法同TRW2000一樣,來到:
0137:40ddf jmp 00401000
現在這一行,輸入以下命令:
a eip (然後按Enter)
jmp eip (然後按Enter)
按下F5
這樣將改變0137:40ddf行的代碼. 您會注意到在輸入"jmp eip"並按下Enter後,40ddf的指令現在是一個jmp.這將有效地使程式"暫停" (有點類似TRW2000的suspend命令) . 按下F5使您回到window,您就可以dump已經脫殼的程式到您的硬碟了。剩下的就和上面TRW2000操作一樣了。
?用Icedump來配合SOFTICE和Procdump
裝載SOFTICE後,在Icedump的目錄裡執行您相應版本的Icedump (這裡我的SOFTICE是4.05版,我選上win9x目錄下405目錄,執行icedump.exe) 。
再執行Procdump32,從主選單中選擇"Option",選中"Rebuild new import table"重建import表,這樣生成的PE文件就會重建,類似於TRW2000的makepe命令。在上一節用 Procdump自動脫殼時,也要選上這一項。
再點擊 Procdump其中的 ?Bhrama Server ?,OK,就別管它了。 (注意: AutoFixPE要選上)
再用SOFTICE的Symbol Loader裝載Notepad-upx來到:
0137:401000 push ebp <-您停在這,下命令“PAGEIN B PROCDUMP32 - DUMPER SERVER”脫殼。
下命令後, 來到windows環境下在Procdump裡會跳出一對話框,以另一文件儲存,至此脫殼成功。
您每次下“PAGEIN B PROCDUMP32 - DUMPER SERVER”這命令也麻煩了,您可在SOFTICE目錄下的winice.dat裡加上一行: F3="PAGEIN B ProcDump32 - Dumper Server;"以後按F3就可執行這命令。
(注: 這是icedump 6.015的命令,在6.16版本後命令完全不同,而是 F3="/BHRAMA ProcDump32 - Dumper Server;")
四、小結
?您會發現脫殼後的軟體比壓縮前的大了,這沒關系只要程式能正常執行即可。那判斷脫殼成功的依據是什麼呢 ? 我個人觀點是: 您在調試工具下 (SOFTICE或TRW2000) 看到程式任何一處的機器碼同用W32DASM反編譯出來看到的機器碼一樣,那麼脫殼成功。
?問: 有些程式脫殼後用W32DASM不能反編譯 ?
您可用ProcDump的PE Editor把脫殼後的文件的text或code
section的Characteristics改為E0000020. 再反編譯就可以了. (冰毒)
?問: 部分脫殼後的exe文件如何再壓縮,用UPX,PELITE,PECOMPACT等都說錯。
不能被壓縮多是無效的Relocations, Relocations存放程式重定位訊息。 win9x下一般不需要用到重定位,但NT下就一定要用到,這是令到脫殼的程式在NT下不能執行的原因。
用Procdump修改脫殼程式Relocations rav/size為0就可壓縮。 需要在NT下執行就把對應的.reloc段的
rav/size填上即可。 (D.Boy)
?問: 我在TRW2000裡下命令makepe、suspend、A等,怎麼無效 ?
您用的是DEMO版,您趕快去向劉濤濤和朱南 ?注冊。什麼 ? 您己吃了一個星期的方便面了,那您就用TRW20001.03版您。