標 題:關於雙程式Armadillo標準殼的脫法
發信人:jwh51
時 間:2004年3月12日 07:35
詳細資訊:
昨天看了csjwoman的那個雙程式標準殼的NOTEPAD.EXE,說真的一開始還真不知如何下手,既不能用脫COPYMEMII(它沒有用記憶體寫入函式)的方法,也不能簡單套用以前脫標準殼的方法(因為它還是有子程式的),後來仔細參考了下mysqladm的文章《試玩armadillo3.50a一點心得 》有了點啟發(最近從他的這篇脫文中學到的東西可不少)。下面談談如何脫這種雙程式的標準殼。
最近很懶,不願寫東西,所以也就不講什麼原理了(可以參考mysqladm的脫文),這裡就簡單說下方法。其實很簡單就是不要讓父程式生成子程式。所以我們可以這樣做。
載入後隱藏OD,忽略所有異常,然後BP OpenMutexA,F9執行,斷下後在一塊空地輸入如下程式碼,這裡在401000輸入,程式碼如下(抄來的)
00401000 60 PUSHAD
00401001 9C PUSHFD
00401002 68 B4FB1200 PUSH 12FBB4 (這裡的12fbb4也就是MutexName,可以透過堆疊看到,也可以在某個暫存器器看到,我原來以為一直在EDX中,現更正一下。)
00401007 33C0 XOR EAX,EAX
00401009 50 PUSH EAX
0040100A 50 PUSH EAX
0040100B E8 E694A677 CALL KERNEL32.CreateMutexA
00401010 9D POPFD
00401011 61 POPAD
00401012 - E9 8F9FA777 JMP KERNEL32.OpenMutexA
在401000處新建起源。F9,程式又斷回到OpenMutexA處,清除斷點和剛才的工作程式碼。這時我們就完全可以象除錯普通標準殼那樣除錯它了,因為它已經不會生成子程式而是把自己當作子程式執行起來。
這時我們下斷bp VirtualProtect,F9執行,中斷9-10次後清除斷點,再bp GetCurrentThreadId,斷下後幾下ALT+F9返回,再F8幾下就到那個CALL EDI了,如下
00DB455C C705 DCDBDB00 E>MOV DWORD PTR [DBDBDC], 0DBE6EC ; ASCII "RB"
00DB4566 FF15 1481DB00 CALL [DB8114] ; kernel32.GetCurrentThreadId
00DB456C A3 AC56DC00 MOV [DC56AC], EAX 返回到這裡,
00DB4571 E8 1537FEFF CALL 00D97C8B
00DB4576 6A 00 PUSH 0
00DB4578 E8 648FFEFF CALL 00D9D4E1
00DB457D 6A 00 PUSH 0
00DB457F C705 DCDBDB00 E>MOV DWORD PTR [DBDBDC], 0DBE6E8 ; ASCII "RC"
00DB4589 E8 7231FEFF CALL 00D97700
00DB458E 59 POP ECX ; 0012FF2C
00DB458F 59 POP ECX ; 0012FF2C
00DB4590 E8 4A11FFFF CALL 00DA56DF
00DB4595 8BF8 MOV EDI, EAX
00DB4597 A1 9455DC00 MOV EAX, [DC5594]
00DB459C 8B48 70 MOV ECX, [EAX+70]
00DB459F 3348 40 XOR ECX, [EAX+40]
00DB45A2 3348 08 XOR ECX, [EAX+8]
00DB45A5 03F9 ADD EDI, ECX
00DB45A7 8B0E MOV ECX, [ESI]
00DB45A9 85C9 TEST ECX, ECX
00DB45AB 75 2F JNZ SHORT 00DB45DC
00DB45AD 8B78 70 MOV EDI, [EAX+70]
00DB45B0 E8 2A11FFFF CALL 00DA56DF
00DB45B5 8B0D 9455DC00 MOV ECX, [DC5594] ; NOTEPAD.0044D260
00DB45BB FF76 14 PUSH DWORD PTR [ESI+14]
00DB45BE 8B51 40 MOV EDX, [ECX+40]
00DB45C1 FF76 10 PUSH DWORD PTR [ESI+10]
00DB45C4 3351 08 XOR EDX, [ECX+8]
00DB45C7 FF76 0C PUSH DWORD PTR [ESI+C]
00DB45CA 33D7 XOR EDX, EDI
00DB45CC 03C2 ADD EAX, EDX
00DB45CE 8B51 68 MOV EDX, [ECX+68]
00DB45D1 3351 04 XOR EDX, [ECX+4]
00DB45D4 33D7 XOR EDX, EDI
00DB45D6 2BC2 SUB EAX, EDX
00DB45D8 FFD0 CALL EAX
00DB45DA EB 25 JMP SHORT 00DB4601
00DB45DC 83F9 01 CMP ECX, 1
00DB45DF 75 22 JNZ SHORT 00DB4603
00DB45E1 FF76 04 PUSH DWORD PTR [ESI+4]
00DB45E4 FF76 08 PUSH DWORD PTR [ESI+8]
00DB45E7 6A 00 PUSH 0
00DB45E9 E8 F110FFFF CALL 00DA56DF
00DB45EE 50 PUSH EAX
00DB45EF A1 9455DC00 MOV EAX, [DC5594]
00DB45F4 8B48 70 MOV ECX, [EAX+70]
00DB45F7 3348 68 XOR ECX, [EAX+68]
00DB45FA 3348 04 XOR ECX, [EAX+4]
00DB45FD 2BF9 SUB EDI, ECX
00DB45FF FFD7 CALL EDI ,這裡F7,飛向光明之顛。
00DB4601 8BD8 MOV EBX, EAX
00DB4603 5F POP EDI ; 0012FF2C
00DB4604 8BC3 MOV EAX, EBX
00DB4606 5E POP ESI ; 0012FF2C
00DB4607 5B POP EBX ; 0012FF2C
00DB4608 C3 RETN
在那個CALL EDI處F7我們就到入口了,這時可以DUMP了。
至於IAT的修復,我不想多說了。