【 標(biāo)題 】 PECompact2.70脫殼
【 作者 】 linxer
【破解平臺(tái)】 Win2k3 English Version
【脫殼工具】 OllyDbg v1.10 + OllyDump插件
【待脫軟件】 Win2k3自帶NOTEPAD(用PECompact2.70加殼)
【 聲明 】 初學(xué)脫殼,只是感興趣,沒(méi)有其他目的。失誤之處敬請(qǐng)諸位大俠賜教!
OD異常設(shè)置忽略所有異常
01001000 N> B8 64BA0101 mov eax,NOTEPAD.0101BA64 //OD載入后停于此處
01001005 50 push eax //向堆棧中壓入一個(gè)異常處理回調(diào)函數(shù)地址(底下發(fā)生內(nèi)存訪問(wèn)異常,將會(huì)調(diào)用這個(gè)函數(shù))
01001006 64:FF35 00000000 push dword ptr fs:[0]
0100100D 64:8925 00000000 mov dword ptr fs:[0],esp //向SEH鏈中插入一個(gè)異常處理項(xiàng)
01001014 33C0 xor eax,eax
01001016 8908 mov dword ptr ds:[eax],ecx //內(nèi)存訪問(wèn)異常
由上面的代碼知,bp 0x0101BA64,F(xiàn)9運(yùn)行到該斷點(diǎn)
底下就是異常處理回調(diào)函數(shù)的代碼了
0101BA64 B8 2EA801F1 mov eax,F101A82E
0101BA69 8D88 59120010 lea ecx,dword ptr ds:[eax+10001259] //此指令執(zhí)行后ecx為0x0101ba87,注意這是retn指令后的第一條指令地址
0101BA6F 8941 01 mov dword ptr ds:[ecx+1],eax //修改0x0101ba87處mov指令的操作數(shù)
0101BA72 8B5424 04 mov edx,dword ptr ss:[esp+4] //取EXCEPTION_RECORD結(jié)構(gòu)地址
0101BA76 8B52 0C mov edx,dword ptr ds:[edx+C] //取發(fā)生異常指令的地址(就是上面的0x01001016)
0101BA79 C602 E9 mov byte ptr ds:[edx],0E9 //修改引發(fā)異常處指令的opcode為jmp(0xe9,它的操作數(shù)是四字節(jié)的)
0101BA7C 83C2 05 add edx,5 //edx是引發(fā)異常處的下條指令地址
0101BA7F 2BCA sub ecx,edx //計(jì)算相對(duì)偏移
0101BA81 894A FC mov dword ptr ds:[edx-4],ecx //修改引發(fā)異常處指令的操作數(shù)(它將使程序跳到0x0101ba87處)
0101BA84 33C0 xor eax,eax
0101BA86 C3 retn
0101BA87 B8 78563412 mov eax,12345678
通過(guò)對(duì)異常處理回調(diào)函數(shù)的分析,知道程序流程在異常處理結(jié)束后會(huì)來(lái)到0x0101ba87處,bp 0x0101ba87,F9到該斷點(diǎn)處
0101BA87 B8 2EA801F1 mov eax,F101A82E
0101BA8C 64:8F05 00000000 pop dword ptr fs:[0]
0101BA93 83C4 04 add esp,4 //刪除剛才插入的異常處理項(xiàng)
0101BA96 55 push ebp
0101BA97 53 push ebx
0101BA98 51 push ecx
0101BA99 57 push edi
0101BA9A 56 push esi
0101BA9B 52 push edx //這片是真正的解壓代碼了,往下找對(duì)應(yīng)的pop系列指令
0101BA9C 8D98 12120010 lea ebx,dword ptr ds:[eax+10001212]
0101BAA2 8B53 18 mov edx,dword ptr ds:[ebx+18]
0101BAA5 52 push edx
0101BAA6 8BE8 mov ebp,eax
0101BAA8 6A 40 push 40
0101BAAA 68 00100000 push 1000
0101BAAF FF73 04 push dword ptr ds:[ebx+4]
0101BAB2 6A 00 push 0
0101BAB4 8B4B 10 mov ecx,dword ptr ds:[ebx+10]
0101BAB7 03CA add ecx,edx
0101BAB9 8B01 mov eax,dword ptr ds:[ecx]
0101BABB FFD0 call eax
0101BABD 5A pop edx
0101BABE 8BF8 mov edi,eax
0101BAC0 50 push eax
0101BAC1 52 push edx
0101BAC2 8B33 mov esi,dword ptr ds:[ebx]
0101BAC4 8B43 20 mov eax,dword ptr ds:[ebx+20]
0101BAC7 03C2 add eax,edx
0101BAC9 8B08 mov ecx,dword ptr ds:[eax]
0101BACB 894B 20 mov dword ptr ds:[ebx+20],ecx
0101BACE 8B43 1C mov eax,dword ptr ds:[ebx+1C]
0101BAD1 03C2 add eax,edx
0101BAD3 8B08 mov ecx,dword ptr ds:[eax]
0101BAD5 894B 1C mov dword ptr ds:[ebx+1C],ecx
0101BAD8 03F2 add esi,edx
0101BADA 8B4B 0C mov ecx,dword ptr ds:[ebx+C]
0101BADD 03CA add ecx,edx
0101BADF 8D43 1C lea eax,dword ptr ds:[ebx+1C]
0101BAE2 50 push eax
0101BAE3 57 push edi
0101BAE4 56 push esi
0101BAE5 FFD1 call ecx
0101BAE7 5A pop edx
0101BAE8 58 pop eax
0101BAE9 0343 08 add eax,dword ptr ds:[ebx+8]
0101BAEC 8BF8 mov edi,eax
0101BAEE 52 push edx
0101BAEF 8BF0 mov esi,eax
0101BAF1 8B46 FC mov eax,dword ptr ds:[esi-4]
0101BAF4 83C0 04 add eax,4
0101BAF7 2BF0 sub esi,eax
0101BAF9 8956 08 mov dword ptr ds:[esi+8],edx
0101BAFC 8B4B 0C mov ecx,dword ptr ds:[ebx+C]
0101BAFF 894E 14 mov dword ptr ds:[esi+14],ecx
0101BB02 FFD7 call edi
0101BB04 8985 FA120010 mov dword ptr ss:[ebp+100012FA],eax
0101BB0A 8BF0 mov esi,eax
0101BB0C 8B4B 14 mov ecx,dword ptr ds:[ebx+14]
0101BB0F 5A pop edx
0101BB10 EB 0C jmp short NOTEPAD.0101BB1E
0101BB12 03CA add ecx,edx
0101BB14 68 00800000 push 8000
0101BB19 6A 00 push 0
0101BB1B 57 push edi
0101BB1C FF11 call dword ptr ds:[ecx]
0101BB1E 8BC6 mov eax,esi
0101BB20 5A pop edx
0101BB21 5E pop esi
0101BB22 5F pop edi
0101BB23 59 pop ecx
0101BB24 5B pop ebx
0101BB25 5D pop ebp //到這里真實(shí)的NOTEPAD代碼被釋放出來(lái)
0101BB26 FFE0 jmp eax //F4運(yùn)行到該處
到這里只要在F7一下就到了真正的NOTEPAD程序了,dump下來(lái),就OK了。
【 總結(jié) 】PECompact2.70脫殼步驟:
1.OD加載程序,記下OD停處指令的第二個(gè)操作數(shù)xxxxxxxx,Ctrl + G到xxxxxxxx處
2.從xxxxxxxx處Ctrl + F查找jmp eax指令
3.F4運(yùn)行到j(luò)mp eax處
4.F7步過(guò)一條指令
5.Dump內(nèi)存鏡像
6.完事收工