1、基本知識(shí)
手動(dòng)脫殼就是不借助自動(dòng)脫殼工具,而是用動(dòng)態(tài)調(diào)試工具SOFTICE或TRW2000來(lái)脫殼。這課談?wù)勔恍┤腴T方面的知識(shí),如要了解更深的脫殼知識(shí),請(qǐng)參考《脫殼高級(jí)篇》這課。
*調(diào)試器:SoftICE 、TRW2000
*內(nèi)存抓取工具:Procdump等;
*十六進(jìn)制工具:Hiew、UltraEdit、Hex Workshop等;
*PE編輯工具: Procdump、PEditor等;
名詞概念
★PE文件:Microsoft設(shè)計(jì)了一種新的文件格式Portable Executable File Format(即PE格式),該格式應(yīng)用于所有基于Win32的系統(tǒng):Windows NT、Windows 2000、Win32s及Windows 95/98。
★基址(ImageBase ):是指裝入到內(nèi)存中的EXE或DLL程序的開始地址,它是Win32中的一個(gè)重要概念。 在Windows NT中,缺省的值是10000h;對(duì)于DLLs,缺省值為400000h。在Windows 95中,10000h不能用來(lái)裝入32位的執(zhí)行文件,因?yàn)樵摰刂诽幱谒羞M(jìn)程共享的線性地址區(qū)域,因此Microsoft將Win32可執(zhí)行文件的缺省基地址改變?yōu)?00000h。
★RVA:相對(duì)虛擬地址(Relative Virual Address),是某個(gè)項(xiàng)相對(duì)于文件映象地址的偏移。例如:裝載程序?qū)⒁粋€(gè)PE文件裝入到虛擬地址空間中,從10000h開始的內(nèi)存中,如果PE中某個(gè)表在映像中的起始地址是10464h那么該表的RVA就是464h。虛擬地址(RVA)=偏移地址+基址(ImageBase )
★Entry Point:入口點(diǎn),就是程序在完成了對(duì)原程序的還原后,開始跳轉(zhuǎn)到剛還原的程序執(zhí)行,此時(shí)的地址就是入口點(diǎn)的值。
步驟
★確定殼的種類
一般拿到軟件后,可用工具FileInfo、gtw、TYP32等偵測(cè)文件類型的工具來(lái)看看是何種殼,然后再采取措施。
★入口點(diǎn)(Entry Point)確定
對(duì)初學(xué)者來(lái)說(shuō)定位程序解殼后的入口點(diǎn)確定較難,但熟練后,入口點(diǎn)查找是很方便的。 決大多數(shù) PE 加殼程序在被加密的程序中加上一個(gè)或多個(gè)段。 所以看到一個(gè)跨段的 JMP 就有可能是了。如:UPX 用了一次跨段的 JMP , ASPACK 用了兩次跨段的 JMP 。 這種判斷一般是跟蹤分析程序而找到入口點(diǎn),如是用TRW2000也可試試命令:PNEWSEC,它可讓TRW2000中斷到入口點(diǎn)上。
PNEWSEC:運(yùn)行直到進(jìn)入一個(gè) PE 程序內(nèi)存的新的 section時(shí)產(chǎn)生斷點(diǎn)。(如不懂,以后到脫殼高級(jí)篇自會(huì)明白)
另外也可用D.boy的沖擊波2000它能輕易的找到任何加密殼的入口點(diǎn),
★dump取內(nèi)存己還原文件
找到入口點(diǎn)后,在此處可以用 Procdump的FULL DUMP功能來(lái)抓取內(nèi)存中整個(gè)文件,
如是用TRW2000也可用命令:
makepe命令含義:從內(nèi)存中整理出一個(gè)指令名稱的PE格式的exe文件, 當(dāng)前的 EIP 將成為新的程序入口,生成文件的 Import table 已經(jīng)重新生成過(guò)了。生成的PE文件可運(yùn)行任何平臺(tái)和微機(jī)上。
pedump命令含義:將PE文件的內(nèi)存映像直接映像到指定的文件里。生成的文件只能在本機(jī)運(yùn)行,不能在其它系統(tǒng)平臺(tái)或微機(jī)運(yùn)行。
★修正剛dump取的文件
如是用 Procdump的FULL DUMP功能脫殼的文件,要用 Procdump或PEditor等PE編輯工具修正入口點(diǎn)(Entry Point)。
2、UPX V1.01的殼
目標(biāo)程序: 用 UPX V1.01壓縮過(guò)的Notepad.exe
方法一、使用TRW2000來(lái)脫殼
★使用工具
TRW2000
FileInfo
★確定殼的種類
拿到這軟件后,可用工具FileInfo、gtw、TYP32等偵測(cè)文件類型的工具來(lái)看看是何種軟件壓縮的,在這我們以FileInfo 為例,把目標(biāo)文件復(fù)制到FileInfo目錄下,在資源管理器下雙擊FileInfo,再按回車,你將看到報(bào)告出來(lái):告訴你這是UPX1.01壓縮的軟件。
★入口點(diǎn)(Entry Point)確定
◇利用跟蹤分析來(lái)確定入口點(diǎn)
決大多數(shù) PE 加殼程序在被加密的程序中加上一個(gè)或多個(gè)段。 所以看到一個(gè)跨段的 JMP 就有可能是了。 UPX 用了一次跨段的 JMP 。 就是你一步步跟蹤時(shí)會(huì)看到代碼有一突躍,一般再跟據(jù)領(lǐng)空文件名的變化,就能確定入口點(diǎn)了。運(yùn)行TRW2000并裝載目標(biāo)程序,然后LOAD你將中斷在主程序入口處:此時(shí)合理按F10、F7及F12一直向前走,注意此時(shí)領(lǐng)空會(huì)是:NOTUPX!UPX1+2xxx.
在你跟蹤過(guò)程中會(huì)出現(xiàn)如下代碼:
該程序的具體情況如下:
XXX:XXXXXXXX 60 PUSHAD ;所有的寄存器進(jìn)棧
XXX:XXXXXXXX BE2EFD4200 MOV ESI XXXXXXXX ;將下一條指令送入進(jìn)行解壓
XXX:XXXXXXXX 8DBED21FFDFF LEA EDI [ESI+XXXXXXXX]
.......
....... <---- 按F10跟蹤 ;-P
XXX:XXXXXXXX FF96A8C90400 CALL [ESI+XXXXXXXX]
XXX:XXXXXXXX 61 POPAD ;所有寄存器出棧
XXX:XXXXXXXX E9A44AFBFF JMP 00401000 ;跳到程序真正入口點(diǎn)(OEP),文件完全解壓。
0137:40ddbe popa
0137:40ddf jmp 00401000 <-此行己完全解壓結(jié)束,將要跳到記事本程序入口點(diǎn)執(zhí)行程序(注意此處的一個(gè)大的突躍)。
........................
0137:401000 push ebp <-完全解壓后的記事本程序第一行
因此入口點(diǎn)(Entry Point)找到為:401000
◇利用TRW2000特有命令PNEWSEC
TRW2000也是一款優(yōu)秀的脫殼工具,有許多特有的命令對(duì)脫殼很有幫助,在此時(shí)用PNEWSEC命令也可方便找到入口點(diǎn)。
運(yùn)行TRW2000并裝載目標(biāo)程序,然后LOAD你將中斷在主程序入口處,下令:PNEWSEC
等上一段時(shí)間,程序?qū)⒅袛嘣谌肟邳c(diǎn)處。
◇用沖擊波2000
沖擊波2000是D.boy開發(fā)的一個(gè)專門查找加殼軟件入口點(diǎn)的工具,先運(yùn)行沖擊波2000,點(diǎn)擊Track按鈕:開始進(jìn)行跟蹤,然后運(yùn)行要跟蹤的程序, 找到入口點(diǎn)后,會(huì)在Enter point 顯示。可是用這個(gè)記事本程序卻無(wú)效。
★dump取內(nèi)存中己脫殼的文件
不管你用何種方法找到入口點(diǎn),首先要來(lái)到入口點(diǎn)一行:
0137:401000 push ebp
執(zhí)行命令makepe 路徑/文件名或pedump 路徑/文件名
就這樣脫殼成功。
注:TRW2000的makepe重建的PE文件可跨平臺(tái)運(yùn)行,pedump抓取的文件卻不可。
方法二、用SOFTICE來(lái)脫殼
★使用工具
TRW2000
FileInfo
ProcDump
★入口點(diǎn)(Entry Point)確定
◇利用跟蹤分析來(lái)確定入口點(diǎn)
方法同TRW2000。
★dump取內(nèi)存中己脫殼的文件
0137:40ddf jmp 00401000
現(xiàn)在這一行鍵入以下命令:
a eip (然后按回車)
jmp eip (然后按回車)
按下F5
這樣將改變0137:40ddf行的代碼. 你會(huì)注意到在鍵入"jmp eip"并按下回車后40ddf的指令現(xiàn)在是一個(gè)jmp.這將有效地使程序"暫停"(有點(diǎn)類似TRW2000的suspend命令). 按下F5使你回到window。
運(yùn)行ProcDump,在Task的列表中的第一個(gè)list上點(diǎn)擊鼠標(biāo)右鍵然后選擇"Refresh list". 在Task列表中找到notepad.exe在它的上面點(diǎn)擊鼠標(biāo)右鍵. 然后選中"Dump (Full)"給脫殼的程序起名存盤. 再在notepad.exe上點(diǎn)擊鼠標(biāo)右鍵然后選中"Kill Task".
注:用此方法抓取的文件不可跨平臺(tái)運(yùn)行。
★修正剛dump取的文件的入口點(diǎn)
脫殼的notepad.exe程序入口是00401000.
再次使用ProcDump的PE Editor功能 打開已脫殼的notepad.exe.
在"Header Infos"一項(xiàng) 你會(huì)看見程序Entry Point(入口值)是0000DC70這當(dāng)然是錯(cuò)誤的. 如果你試著不改動(dòng)這個(gè)入口值而運(yùn)行脫殼后的notepad.exe程序?qū)o(wú)法運(yùn)行.
在 Procdump可看到ImageBase =00400000我們上面跟蹤找到的入口值的RVA是00401000,因?yàn)椋禾摂M地址(RVA)=偏移地址+基址(ImageBase ),因此
Entry Poin=00401000-00400000=1000改變?nèi)肟谥禐?000點(diǎn)擊"OK".
現(xiàn)在 運(yùn)行脫殼后的notepad.exe吧它應(yīng)該正常運(yùn)行了。
3、Shrinker v3.4 的殼
英文原作: Etenal Bliss
電子郵件: Eternal_Bliss@hotmail.com
作者網(wǎng)址:http://crackmes.cjb.net
http://surf.to/crackmes
寫作日期: 2000年2月25日
中文翻譯: ****
翻譯日期: 2000年3月14日
目標(biāo)程序: 用Shrinker v3.4壓縮過(guò)的Notepad.exe
******************************************************************
****注:
1. Notepad.exe就是Windows自帶的寫字板程序相信大家的機(jī)器中都會(huì)有.
2. Shrinker v3.4可以http://w3.to/protools下載這里你可以找到你
想要的幾乎所有的工具.
******************************************************************
使用工具:
ProcDump
Softice
Symbol Loader (****注:這個(gè)是Softice自帶的用過(guò)Softice的應(yīng)該知道)
教學(xué)目的:
教你手動(dòng)脫殼的基本技術(shù)
__________________________________________________________________________
關(guān)于這個(gè)教程
這是我打算寫的*簡(jiǎn)單*的脫殼系列教程的第一篇. 目標(biāo)程序是notepad.exe在大多數(shù)
的電腦中都有它. 因?yàn)槲疫€不能很好地解釋脫殼中的一些問(wèn)題我只能盡我所能向你們
展示簡(jiǎn)單的方法. 至于高級(jí)的方法你們必須去讀別的教程.
_________________________________________________________________________
使Softice中斷于程序入口處
用Symbol Loader打開已壓縮的notepad.exe.
點(diǎn)擊Symbol loader任務(wù)條上的第二個(gè)圖標(biāo)當(dāng)你把鼠標(biāo)移到圖標(biāo)上時(shí)在Symbol Loader
窗口底部提示行你會(huì)見到"Load the currently open module"的字樣
你將得到一條出錯(cuò)信息并問(wèn)你是否盡管出錯(cuò)還是要裝入這個(gè)exe文件. 點(diǎn)擊"Yes".
假如Softice已經(jīng)運(yùn)行的話 它應(yīng)該在程序的入口處中斷.可是它并沒有中斷壓縮過(guò)的
notepad.exe直接就運(yùn)行了.
該到改變characteristics of the sections的時(shí)間了...
通過(guò)改變characteristics 你可以使Softice中斷于程序入口.
用ProcDump裝入壓縮過(guò)的notepad.exe (使用PE Editor)
你會(huì)看到這個(gè)以"PE Structure Editor"作為標(biāo)題的窗口.
點(diǎn)擊稱作"Sections"的按鈕.
你將得到另一個(gè)以"Sections Editor"做標(biāo)題的窗口.
你會(huì)見到壓縮過(guò)的notepad.exe的不同sections.
第一個(gè)是 .shrink0 它的characteristics是C0000082.
改變characteristics: 鼠標(biāo)左鍵點(diǎn)擊.shrink0再點(diǎn)擊右鍵并選擇edit section.
你將得到另一個(gè)窗口它用'Modify section value" 作標(biāo)題.
把Section Characteristics由C0000082改為E0000020.
一路按OK直到你回到ProcDump的主窗口.
你現(xiàn)在可以把ProcDump放在一邊了.
**我愿意多作解釋為什么必須這樣做但我沒這個(gè)能力. 8P
你也許要讀些PE結(jié)構(gòu)的資料來(lái)找到原因.
別人教我說(shuō) E0000020將使section成為可執(zhí)行的因此Softice將會(huì)中斷于入口處
找到程序真正入口并進(jìn)行脫殼
現(xiàn)在 希望你沒有關(guān)閉symbol loader. 假如你關(guān)掉的話重新運(yùn)行它打開并裝入已
壓縮的notepad.exe
當(dāng)你這次點(diǎn)擊"Yes"時(shí) 你會(huì)發(fā)現(xiàn)你已在進(jìn)入Softice中了...
我把下面的代碼貼出來(lái)并加上注解.
************************* 你在SICE中所見到的 *************************
**Softice中斷時(shí)你會(huì)在這兒. 一直按F10走過(guò)這部分代碼
0041454F FFFF INVALID
00414556 55 PUSH EBP
00414557 8BEC MOV EBPESP
00414559 56 PUSH ESI
0041455A 57 PUSH EDI
0041455B 756B JNZ 004145C8 (NO JUMP)
0041455D 6800010000 PUSH 00000100
00414562 E8D60B0000 CALL 0041513D
00414567 83C404 ADD ESP04
0041456A 8B7508 MOV ESI[EBP+08]
0041456D A3B4F14000 MOV [0040F1B4]EAX
00414572 85F6 TEST ESIESI
00414574 7423 JZ 00414599 (JUMP)
00414599 33FF XOR EDIEDI
0041459B 57 PUSH EDI
0041459C 893D8C184100 MOV [0041188C]EDI
004145A2 FF1510224100 CALL [KERNEL32!GetModuleHandleA]
004145A8 8BF0 MOV ESIEAX
004145AA 68FF000000 PUSH 000000FF
004145AF A1B4F14000 MOV EAX[0040F1B4]
004145B4 897D10 MOV [EBP+10]EDI
004145B7 C7450C01000000 MOV DWORD PTR [EBP+0C]00000001
004145BE 50 PUSH EAX
004145BF 56 PUSH ESI
004145C0 FF15F4214100 CALL [KERNEL32!GetModuleFileNameA]
004145C6 EB03 JMP 004145CB (JUMP)
004145CB E830EAFFFF CALL 00413000
004145D0 FF7510 PUSH DWORD PTR [EBP+10]
004145D3 FF750C PUSH DWORD PTR [EBP+0C]
004145D6 56 PUSH ESI
004145D7 E806000000 CALL 004145E2
**當(dāng)你走過(guò)這個(gè)位于004145D7的CALL 壓縮過(guò)的notepad.exe就自由運(yùn)行了. 再次用
symbol loader裝入. 再次來(lái)到這個(gè)CALL時(shí) 按F8追進(jìn)去. 你將看到以下代碼. 不
過(guò)記著先BPX 004145D7.
004145E2 64A100000000 MOV EAXFS:[00000000]
004145E8 55 PUSH EBP
004145E9 8BEC MOV EBPESP
004145EB 6AFF PUSH FF
004145ED 6810E04000 PUSH 0040E010
004145F2 68EC5D4100 PUSH 00415DEC
004145F7 50 PUSH EAX
004145F8 64892500000000 MOV FS:[00000000]ESP
004145FF 83EC14 SUB ESP14
00414602 C745E401000000 MOV DWORD PTR [EBP-1C]00000001
00414609 53 PUSH EBX
0041460A 56 PUSH ESI
0041460B 57 PUSH EDI
0041460C 8965E8 MOV [EBP-18]ESP
0041460F C745FC00000000 MOV DWORD PTR [EBP-04]00000000
00414616 8B450C MOV EAX[EBP+0C]
00414619 83F801 CMP EAX01
0041461C 7510 JNZ 0041462E (NO JUMP)
0041461E E886030000 CALL 004149A9
00414623 FF05C0F14000 INC DWORD PTR [0040F1C0]
00414629 E882F6FFFF CALL 00413CB0
0041462E 8B35C0F14000 MOV ESI[0040F1C0]
00414634 85F6 TEST ESIESI
00414636 0F848D000000 JZ 004146C9 (NO JUMP)
0041463C 833DC4F1400000 CMP DWORD PTR [0040F1C4]00
00414643 7526 JNZ 0041466B (NO JUMP)
00414645 833D6417410000 CMP DWORD PTR [00411764]00
0041464C 741D JZ 0041466B (NO JUMP)
0041464E A164174100 MOV EAX[00411764]
**EAX現(xiàn)在的值是000010CC
00414653 030588184100 ADD EAX[00411888]
**EAX現(xiàn)在的值是004010CC
00414659 8945DC MOV [EBP-24]EAX
**[EBP-24]現(xiàn)在含的是004010CC
0041465C FF7510 PUSH DWORD PTR [EBP+10]
0041465F FF750C PUSH DWORD PTR [EBP+0C]
00414662 FF7508 PUSH DWORD PTR [EBP+08]
00414665 FF55DC CALL [EBP-24]
**假如你追過(guò)最后這個(gè)CALLnotepad.exe將再次自由運(yùn)行.
由上得知 既然[EBP-24] = 004010CC 最后這句代碼就意味著壓縮過(guò)的程序在
CALL 004010CC. 如果你追進(jìn)這個(gè)CALL 你會(huì)發(fā)現(xiàn)notepad.exe很快就會(huì)運(yùn)行了.
假如你曾經(jīng)追過(guò)更多shrinker v3.4壓縮的程序 你總會(huì)見到這個(gè)"CALL [EBP-24]".
所以 程序?qū)嶋H上正在進(jìn)入已脫殼的程序的真正入口.
再次裝入壓縮過(guò)的notepad.exe中斷之后按F5你將中斷于004145D7行(這里你原來(lái)
設(shè)過(guò)斷點(diǎn)). 追進(jìn)去直到你到達(dá)00414665行這里程序正要進(jìn)入已脫殼程序的真正入口.
現(xiàn)在鍵入以下命令:
a eip (然后按回車)
jmp eip (然后按回車)
按下F5
這樣將改變00414665行的代碼. 你會(huì)注意到在鍵入"jmp eip"并按下回車后00414665的
指令現(xiàn)在是一個(gè)jmp.這將有效地使程序"暫停". 按下F5使你回到window你就可以dump
已經(jīng)脫殼的程序到你的硬盤了.
現(xiàn)在又要用ProcDump了在Task的列表中的第一個(gè)list上點(diǎn)擊鼠標(biāo)右鍵然后選擇"Refresh
list". 在Task列表中找到notepad.exe在它的上面點(diǎn)擊鼠標(biāo)右鍵.
然后選中"Dump (Full)"給脫殼的程序起名存盤.
再在notepad.exe上點(diǎn)擊鼠標(biāo)右鍵然后選中"Kill Task".
_________________________________________________________________________
改動(dòng)程序入口值
如果你記得的話 脫殼的notepad.exe程序入口是004010CC.
再次使用ProcDump的PE Editor功能 打開已脫殼的notepad.exe.
在"Header Infos"一項(xiàng) 你會(huì)看見程序入口值是0001454F這當(dāng)然是錯(cuò)誤的. 如果你試著
不改動(dòng)這個(gè)入口值而運(yùn)行脫殼后的notepad.exe程序?qū)o(wú)法運(yùn)行.
改變?nèi)肟谥禐镋ntry Poin=004010CC-基址(ImageBase )點(diǎn)擊"OK".
現(xiàn)在 運(yùn)行脫殼后的notepad.exe吧它應(yīng)該正常運(yùn)行了. 8)
__________________________________________________________________________
最后的說(shuō)明
這篇教程是為所有和我一樣的newbies而作.
我感謝和感激:
MiZ. 從他那里我學(xué)會(huì)了脫殼的基本技巧.
所有破解教程和CrackMe的作者以及所有一直支持我的網(wǎng)站和論壇的Cracker們.
4、ASPack v1.083
壓縮文件:下載。
如用TRW2000調(diào)試,裝載后,下命令:pnewsec就可中斷到入口點(diǎn)。為了提高跟蹤水平,下面以SOFTICE為例,講述跟蹤過(guò)程。
_________________________________________________________________________
尋找程序的入口點(diǎn)( Entry Point)
用Symbol Loader打開Notepad-ASPACK.exe,點(diǎn)擊Symbol loader的第二個(gè)圖標(biāo)("Load the currently open module")
如SOFTICE 裝載成功,它應(yīng)中斷在起始程序入口處。
當(dāng)跟蹤時(shí),你會(huì)經(jīng)過(guò)許多條件跳轉(zhuǎn)指令及循環(huán)指令,要用點(diǎn)技巧跳出這些圈子,其形式一般這樣:
*************************************
aaaaaaaa
...
wwwwwwww
xxxxxxxx JNZ zzzzzzzz <-- 循環(huán)返回到aaaaaaaa
yyyyyyyy JMP aaaaaaaa
zzzzzzzz 新的指令
如果你跟蹤時(shí),你將跳轉(zhuǎn)到 aaaaaaa處多次,你可將光標(biāo)移到 zzzzzzzz一行,按F7讓指令直接跳到此處,可省不少時(shí)間。
*************************************
在跟蹤過(guò)程會(huì)來(lái)到:
167:0040D558 POPAD
0167:0040D559 JNZ 0040D563 (JUMP)
0167:0040D55B MOV EAX00000001
0167:0040D560 RET 000C
0167:0040D563 PUSH EAX<--EAX的值就是入口點(diǎn)的值=4010CC
0167:0040D564 RET <--返回到記事本的真正的入口點(diǎn)
*************************************
0167:004010CC PUSH EBP <--真正的入口點(diǎn)
0167:004010CD MOV EBPESP
0167:004010CF SUB ESP00000044
0167:004010D2 PUSH ESI
經(jīng)過(guò)0167:0040D564 RET 一行,程序?qū)?lái)到0167:004010CC剛完全解壓的真正程序第一條指令處。
*************************************
當(dāng)我們跟蹤時(shí)發(fā)現(xiàn)POPAD或POPFD,就要提高警惕,一般入口點(diǎn)就在附近了,在此程序的原始入口點(diǎn)是004010CC
在0167:0040D564 RET一行鍵入:
a eip (然后按回車)
jmp eip (然后按回車)
F5
這個(gè)方法是讓程序掛起,按F5回到windows下。
運(yùn)行 Procdump,在Task的列表中的第一個(gè)list上點(diǎn)擊鼠標(biāo)右鍵然后選擇"Refresh
list". 在Task列表中找到notepad.exe在它的上面點(diǎn)擊鼠標(biāo)右鍵.
然后選中"Dump (Full)"給脫殼的程序起名存盤.
再在notepad.exe上點(diǎn)擊鼠標(biāo)右鍵然后選中"Kill Task".
_________________________________________________________________________
修正入口點(diǎn)
脫殼的notepad.exe程序入口是004010CC.
再次使用ProcDump的PE Editor功能 打開已脫殼的notepad.exe.
修正入口點(diǎn)值=4010CC-00400000(基址)=10CC
點(diǎn)擊"OK".
現(xiàn)在 運(yùn)行脫殼后的notepad.exe吧它應(yīng)該正常運(yùn)行了。
(編輯:天命孤獨(dú))
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注