下載頁面: http://bbs.pediy.com/showthread.php?s=&threadid=5850
或 點選此處本地下載。
軟體大小: 52 KB
軟體簡介: Protector for exe files with cool import protection
【作者宣告】:只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!
【除錯環境】:WinXP、Ollydbg V1.10、PEiD、LordPE、ImportREC
―――――――――――――――――――――――――――――――――
【脫殼過程】:
Alex Protector V1.0是今天在exetools論壇釋出的殼。
這個殼的花指令和輸入表跳轉地址加密有些麻煩。
今年湧現不少新殼,不知道這個Alex Protector以後會如何變態。
―――――――――――――――――――――――――――――――――
一、搞定輸入表跳轉地址加密
設定Ollydbg忽略除了“記憶體訪問異常”之外的所有其它異常選項。老規矩:用IsDebug V1.4外掛去掉Ollydbg的偵錯程式標誌。
00438000 60 pushad
//進入OD後暫停在這
00438001 E8 00000000 call alexprot.00438006
00438006 5D pop ebp
00438007 81ED 06104000 sub ebp,alexprot.00401006
0043800D E8 24000000 call alexprot.00438036
00438012 EB 01 jmp short alexprot.00438015
Shift+F9執行,暫停在記憶體訪問異常處。
003B13C2 3300 xor eax,dword ptr ds:[eax]
//記憶體訪問異常處
003B13C4 83C4 04 add esp,4
003B13C7 FFE3 jmp ebx
Shift+F9執行,會在003B13C2處中斷3次。
Alt+M 開啟記憶體察看視窗,在00401000段“設定記憶體寫入斷點”。
Shift+F9,中斷在003B0C05處。中斷後取消記憶體斷點。
看看暫存器值,你會發現這裡就是殼寫入加密跳轉地址的地方!
我在這裡Patch,使殼寫入程式中的地址作為輸入表的跳轉地址,這樣就可以Dump下來了。
003B0C04 61 popad
003B0C05 8901 mov dword ptr ds:[ecx],eax
//中斷在這裡
//修改為:JMP 003BB000 ★
003B0C07 83C7 04 add edi,4
003B0C0A FECB dec bl
003B0C0C 58 pop eax
003B0C0D 80FB 00 cmp bl,0
003B0C10 0F87 42FFFFFF ja 003B0B58
003B0C16 803F C3 cmp byte ptr ds:[edi],0C3
003B0C19 0F84 A1FDFFFF je 003B09C0
003B0C1F 833F 00 cmp dword ptr ds:[edi],0
003B0C22 0F84 DE000000 je 003B0D06
//輸入表處理完畢則跳轉
003B0C28 E9 8AFDFFFF jmp 003B09B7
003B0C2D 47 inc edi
003B0C2E 8B1F mov ebx,dword ptr ds:[edi]
003B0C30 53 push ebx
003B0C31 60 pushad
003B0C32 EB 03 jmp short 003B0C37
――――――――――――――――――――――――
在下面找點空白處(003BB000)寫入Patch程式碼:
003BB000 53 push ebx
003BB001 56 push esi
003BB002 3E:8B9C24 08FFFFFF mov ebx,dword ptr ds:[esp-F8]; USER32.77D10000
//[esp-F8]處儲存的是處理DLL的基址 ★
003BB00A 3B1D 00C03B00 cmp ebx,dword ptr ds:[3BC000]; USER32.77D10000
//提前在[3BC000]處寫入當前處理DLL的基址 ★
003BB010 74 0D je short 003BB01F
//比較處理的DLL是否相同 ★
003BB012 891D 00C03B00 mov dword ptr ds:[3BC000],ebx
//儲存新的DLL基址 ★
003BB018 8305 08C03B00 04 add dword ptr ds:[3BC008],4
//不同則跳轉地址+4,方便修復輸入表 ★
003BB01F 8B1D 08C03B00 mov ebx,dword ptr ds:[3BC008] ; alexprot.00429000
//提前在[3BC008]處寫入準備放跳轉地址的地址,呵呵,有點拗口了 ★
//我選擇的是程式的第4個區段,寫入00429000
003BB025 3E:8BB424 58FFFFFF mov esi,dword ptr ds:[esp-A8]; USER32.TranslateMessage
//[esp-A8]處儲存的是正確的函式 ★
003BB02D 8933 mov dword ptr ds:[ebx],esi
//函式寫入修改的地址
003BB02F 8919 mov dword ptr ds:[ecx],ebx
//[ecx]是程式中的呼叫地址,寫入修改後的跳轉地址 ★
003BB031 8305 08C03B00 04 add dword ptr ds:[3BC008],4
//跳轉地址+4
003BB038 5E pop esi
003BB039 5B pop ebx
//恢復堆疊
003BB03A 83C7 04 add edi,4
//003B0C07處程式碼挪到這裡執行
003BB03D E9 C85BFFFF jmp 003B0C0A
//跳回去繼續流程
――――――――――――――――――――――――
修改完以上部分後在003B0D06處下斷,Shift+F9中斷下來,輸入表處理完畢了。
003B0D06 E8 97060000 call 003B13A2
//這裡下斷
003B0D0B 8D9D 31254000 lea ebx,dword ptr ss:[ebp+40253>
003B0D11 60 pushad
003B0D12 EB 03 jmp short 003B0D17
此時[3BC008]處是004290D8,這就是結束的地址了。
Size=004290D8-00429000=D8
OK,第一部分處理完畢。
―――――――――――――――――――――――――――――――――
二、OEP、Dump
Shift+F9執行,來到最後一次記憶體異常處。當然,這步可以省略。
003B13C2 3300 xor eax,dword ptr ds:[eax]
//最後一次記憶體異常
003B13C4 83C4 04 add esp,4
003B13C7 FFE3 jmp ebx
Alt+M 開啟記憶體察看視窗,在00401000段“設定記憶體訪問斷點”。
Shift+F9 中斷在00406B07處!
00406B05 0000 add byte ptr ds:[eax],al
00406B07 E8 4E2B0000 call alexprot.0040965A ; jmp to kernel32.GetModuleHandleA
//中斷在這裡
00406B0C A3 1CC64000 mov dword ptr ds:[40C61C],eax
00406B11 E8 382B0000 call alexprot.0040964E ; jmp to kernel32.GetCommandLineA
00406B16 E8 872B0000 call alexprot.004096A2 ; jmp to comctl32.InitCommonControls
看看堆疊:
0012FFA0 00000000
根據組合語言編譯程式的特點和堆疊,補上Stolen Code:
00406B05 6A 00 push 0
//用LordPE糾正ImageSize後完全DUMP這個程式
執行ImportREC,選擇這個程式。把OEP改為00006B05,RVA=00029000、Size=000000D8,獲取輸入表。
FixDump,正常執行!
―――――――――――――――――――――――――――――――――
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 換了破解輕狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
UnPacked By : fly
2004-10-17 23:00