【作者宣告】:只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!
【除錯環境】:WinXP、Ollydbg V1.10、LordPE、ImportREC、ReloX
【例項下載】:點選下載
―――――――――――――――――――――――――――――――――
【脫殼過程】:
Petite也加密了重定位表,寫這篇簡單的筆記只是再次推薦一下用ReloX來修復重定位表。
―――――――――――――――――――――――――――――――――
一、EP和OEP
設定Ollydbg忽略所有的異常選項,載入Petite加殼的EdrLib.dll。
003D7042 B8 00703D00 mov eax,EdrLib.003D7000
//進入Ollydbg後暫停在這
003D7047 68 0E493D00 push EdrLib.003D490E
003D704C 64:FF35 00000000 push dword ptr fs:[0]
003D7053 64:8925 00000000 mov dword ptr fs:[0],esp
Petite加殼程式的OEP非常好找,在EP處下斷:HE EIP
如果不想脫殼後修改基址,可以在適當的時機Dump。
下斷:BP GetProcAddress
中斷後取消斷點,Alt+F9返回
003D4AC4 FF95 94070000 call dword ptr ss:[ebp+794]; kernel32.GetProcAddress
003D4ACA 85C0 test eax,eax ; kernel32.lstrlenW
//返回這裡
003D4ACC 74 7F je short EdrLib.003D4B4D
//下面的迴圈是處理輸入表的
Ctrl+S 在當前位置下搜尋命令序列:
mov edi,ecx
mov edx,ebp
mov eax,dword ptr ds:[ecx]
test eax,eax
找到在003D4C60處,直接F4至003D4C5A
003D4C54 8DB5 0000C0FF lea esi,dword ptr ss:[ebp+FFC00000]
003D4C5A 8D8D 00600000 lea ecx,dword ptr ss:[ebp+6000]
//這裡[ebp+6000]的6000是原來重定位表的RVA
003D4C60 8BF9 mov edi,ecx
003D4C62 8BD5 mov edx,ebp
003D4C64 8B01 mov eax,dword ptr ds:[ecx]
003D4C66 85C0 test eax,eax
003D4C68 74 1B je short EdrLib.003D4C85
003D4C6A 3C FF cmp al,0FF
003D4C6C 75 0B jnz short EdrLib.003D4C79
此時輸入表已經處理完畢,程式還沒有進行重定位,執行LordPE完全Dump出這個dll。
F9執行,中斷在剛開始下的硬體斷點處:
003D7042 E9 82A1FFFF jmp EdrLib.003D11C9
//飛向光明之點巔!
003D11C9 55 push ebp
//OEP ^O^
003D11CA 8BEC mov ebp,esp
003D11CC 53 push ebx
003D11CD 8B5D 08 mov ebx,dword ptr ss:[ebp+8]
―――――――――――――――――――――――――――――――――
二、輸入表
隨便從程式找一個API呼叫,如:
003D10FD FF15 20403D00 call dword ptr ds:[3D4020]; kernel32.GetVersion
在轉存中跟隨3D4020,上下看到許多函式地址,很明顯的可以找到IAT開始和結束的地址:
003D3FF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
003D4000 74 81 EF 77 E8 7C EF 77 49 C4 EF 77 3B D7 EF 77 tw|wI娘w;罪w
…… ……
003D40C0 79 70 3D 00 40 7A 95 7C 00 00 00 00 00 00 00 00 yp=.@z|........
開始地址=003D4000
結束地址=003D40C8
執行ImportREC。注意:去掉“使用來自磁碟的PE部首”的選項,選擇“重建原始FT”選項!
選中Ollydbg的loaddll.exe的程式,然後點“選取DLL”,選擇EdrLib.dll,填入RVA=00004000、大小=000000C8 ,點“Get Import”,得到輸入表,用追蹤層次1修復無效函式。改OEP=000011C9,FixDump!
―――――――――――――――――――――――――――――――――
三、ReloX:修復重定位表的“通用”簡便方法
把EdrLib.dll複製一份,然後用DLL_LoadEX載入EdrLib.dll和複製EdrLib.dll,注意兩個DLL程式的基址。
用LordPE直接把這2個DLL程式Dump出來,另存為1.dll(ImageBase=01060000)和2.dll(ImageBase=01080000)
執行ReloX,選擇1.dll和2.dll,分別填入其相應的基址,點ComPare,稍等,分析完畢。
Fix PE Module,提示dumped_.dll儲存成功。ReloX已經自動修正了Relocation RVA和Size!
如果想刪除殼區段,則需要挪移輸出表資料,具體操作看《用Ollydbg手脫Neolite加殼的DLL》教程。
可以用LordPE或者FileScanner最佳化一下脫殼後的檔案。
測試一下,正常執行,脫殼完成了。
―――――――――――――――――――――――――――――――――
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 換了破解輕狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
UnPacked By : fly
2004-12-27 20:00