第四節(jié) 手動脫殼
1、基本知識
手動脫殼就是不借助自動脫殼工具,而是用動態(tài)調試工具SOFTICE或TRW2000來脫殼。這課談談一些入門方面的知識,如要了解更深的脫殼知識,請參考《脫殼高級篇》這課。
工具
*調試器:SoftICE 、TRW2000
*內存抓取工具:Procdump等;
*十六進制工具:Hiew、UltraEdit、Hex Workshop等;
*PE編輯工具: Procdump、PEditor等;
名詞概念
★PE文件:Microsoft設計了一種新的文件格式Portable Executable File Format(即PE格式),該格式應用于所有基于Win32的系統(tǒng):Windows NT、Windows 2000、Win32s及Windows 95/98。
★基址(ImageBase ):是指裝入到內存中的EXE或DLL程序的開始地址,它是Win32中的一個重要概念。 在Windows NT中,缺省的值是10000h;對于DLLs,缺省值為400000h。在Windows 95中,10000h不能用來裝入32位的執(zhí)行文件,因為該地址處于所有進程共享的線性地址區(qū)域,因此Microsoft將Win32可執(zhí)行文件的缺省基地址改變?yōu)?00000h。
★RVA:相對虛擬地址(Relative Virual Address),是某個項相對于文件映象地址的偏移。例如:裝載程序將一個PE文件裝入到虛擬地址空間中,從10000h開始的內存中,如果PE中某個表在映像中的起始地址是10464h,那么該表的RVA就是464h。虛擬地址(RVA)=偏移地址+基址(ImageBase )
★Entry Point:入口點,就是程序在完成了對原程序的還原后,開始跳轉到剛還原的程序執(zhí)行,此時的地址就是入口點的值。
步驟
★確定殼的種類
一般拿到軟件后,可用工具FileInfo、gtw、TYP32等偵測文件類型的工具來看看是何種殼,然后再采取措施。
★入口點(Entry Point)確定
對初學者來說定位程序解殼后的入口點確定較難,但熟練后,入口點查找是很方便的。 決大多數(shù) PE 加殼程序在被加密的程序中加上一個或多個段。 所以看到一個跨段的 JMP 就有可能是了。如:UPX 用了一次跨段的 JMP , ASPACK 用了兩次跨段的 JMP 。 這種判斷一般是跟蹤分析程序而找到入口點,如是用TRW2000也可試試命令:PNEWSEC,它可讓TRW2000中斷到入口點上。
PNEWSEC:運行直到進入一個 PE 程序內存的新的 section時產(chǎn)生斷點。(如不懂,以后到脫殼高級篇自會明白)另外也可用D.boy的沖擊波2000,它能輕易的找到任何加密殼的入口點,
★dump取內存己還原文件
找到入口點后,在此處可以用 Procdump的FULL DUMP功能來抓取內存中整個文件,
如是用TRW2000也可用命令:
makepe命令含義:從內存中整理出一個指令名稱的PE格式的exe文件, 當前的 EIP 將成為新的程序入口,生成文件的 Import table 已經(jīng)重新生成過了。生成的PE文件可運行任何平臺和微機上。
pedump命令含義:將PE文件的內存映像直接映像到指定的文件里。生成的文件只能在本機運行,不能在其它系統(tǒng)平臺或微機運行。
★修正剛dump取的文件
如是用 Procdump的FULL DUMP功能脫殼的文件,要用 Procdump或PEditor等PE編輯工具修正入口點(Entry Point)。
2、UPX V1.01的殼
目標程序: 用 UPX V1.01壓縮過的Notepad.exe
方法一、使用TRW2000來脫殼
★使用工具
TRW2000
FileInfo
★確定殼的種類
拿到這軟件后,可用工具FileInfo、gtw、TYP32等偵測文件類型的工具來看看是何種軟件壓縮的,在這我們以FileInfo 為例,把目標文件復制到FileInfo目錄下,在資源管理器下雙擊FileInfo,再按回車,你將看到報告出來:告訴你這是UPX1.01壓縮的軟件。
★入口點(Entry Point)確定
◇利用跟蹤分析來確定入口點
決大多數(shù) PE 加殼程序在被加密的程序中加上一個或多個段。 所以看到一個跨段的 JMP 就有可能是了。 UPX 用了一次跨段的 JMP 。 就是你一步步跟蹤時會看到代碼有一突躍,一般再跟據(jù)領空文件名的變化,就能確定入口點了。運行TRW2000并裝載目標程序,然后LOAD,你將中斷在主程序入口處:此時合理按F10、F7及F12一直向前走,注意此時領空會是:NOTUPX!UPX1+2xxx.
在你跟蹤過程中會出現(xiàn)如下代碼:
該程序的具體情況如下:
XXX:XXXXXXXX 60 ;所有的寄存器進棧
.......
XXX:XXXXXXXX BE2EFD4200 MOV ESI, XXXXXXXX ;將下一條指令送入進行解壓
XXX:XXXXXXXX 8DBED21FFDFF LEA EDI, [ESI+XXXXXXXX]
....... <---- 按F10跟蹤 ;-PXXX:XXXXXXXX FF96A8C90400 CALL [ESI+XXXXXXXX]
XXX:XXXXXXXX 61 ;所有寄存器出棧
XXX:XXXXXXXX E9A44AFBFF JMP 00401000 ;跳到程序真正入口點(OEP),文件完全解壓。
因此入口點(Entry Point)找到為:401000
◇利用TRW2000特有命令PNEWSEC
TRW2000也是一款優(yōu)秀的脫殼工具,有許多特有的命令對脫殼很有幫助,在此時用PNEWSEC命令也可方便找到入口點。
運行TRW2000并裝載目標程序,然后LOAD,你將中斷在主程序入口處,下令:PNEWSEC
等上一段時間,程序將中斷在入口點處。
◇用沖擊波2000
沖擊波2000是D.boy開發(fā)的一個專門查找加殼軟件入口點的工具,先運行沖擊波2000,點擊Track按鈕:開始進行跟蹤,然后運行要跟蹤的程序, 找到入口點后,會在Enter point 顯示。可是用這個記事本程序卻無效。
★dump取內存中己脫殼的文件
不管你用何種方法找到入口點,首先要來到入口點一行:
執(zhí)行或
就這樣脫殼成功。
注:TRW2000的makepe重建的PE文件可跨平臺運行,pedump抓取的文件卻不可。
方法二、用SOFTICE來脫殼
★使用工具
TRW2000
FileInfo
ProcDump
★入口點(Entry Point)確定
◇利用跟蹤分析來確定入口點
方法同TRW2000。
★dump取內存中己脫殼的文件
現(xiàn)在這一行,鍵入以下命令:
a eip (然后按回車)
jmp eip (然后按回車)
按下F5這樣將的代碼. 你會注意到在鍵入"jmp eip"并按下回車后,的指令現(xiàn)在是一個jmp.這將有效地使程序"暫停"(有點類似TRW2000的suspend命令). 按下F5使你回到window。
運行ProcDump,在Task的列表中的第一個list上點擊鼠標右鍵,然后選擇"Refresh list". 在Task列表中找到notepad.exe,在它的上面點擊鼠標右鍵. 然后,選中"Dump (Full)",給脫殼的程序起名存盤. 再在notepad.exe上點擊鼠標右鍵,然后選中"Kill Task".
注:用此方法抓取的文件不可跨平臺運行。
★修正剛dump取的文件的入口點
脫殼的notepad.exe程序入口是00401000.
再次使用ProcDump的PE Editor功能, 打開已脫殼的notepad.exe.在"Header Infos"一項, 你會看見程序Entry Point(入口值)是0000DC70,這當然是錯誤的. 如果你試著不改動這個入口值而運行脫殼后的notepad.exe,程序將無法運行.
在 Procdump可看到ImageBase =00400000,我們上面跟蹤找到的入口值的RVA是00401000,因為:虛擬地址(RVA)=偏移地址+基址(ImageBase ),因此
Entry Poin=00401000-00400000=1000,改變入口值為1000,點擊"OK".
現(xiàn)在, 運行脫殼后的notepad.exe吧,它應該正常運行了。
共2頁: 1 [2] 下一頁


