Armadillo V3.6雙程式標準殼 ------神速脫殼大法

看雪資料發表於2015-11-15

標 題:Armadillo V3.6雙程式標準殼 ------神速脫殼大法

發信人:crackjack

時 間:2004年4月18日 04:54 

詳細資訊: 


下載頁面: http://www.superrsoft.com/cn/srcom.htm 
軟體大小:  5794 KB 
軟體語言:  中文 
軟體類別:  國產軟體 / 共享版 / 網路輔助 
應用平臺:  Win9x/NT/2000/XP 

【說明】:此破文結合了Fly、mysqladm、pyzpyz、jwh51、骨灰C( MM)大蝦們所寫的破文,在此謝謝他們了,這是我第一次學OLLYDBG和脫Armadillo的殼,請各位大俠多多指教!

【作者宣告】:只作為學習技術用,沒有其他任何商業目的,失誤之處敬請諸位大俠賜教! 

【除錯環境】:Win2000、Ollydbg、PEiD、LordPE、ImportREC 

―――――――――――――――――――――――――――――――――  
【脫殼過程】:

設定Ollydbg忽略所有的異常選項。用IsDebug 1.4外掛去掉Ollydbg的偵錯程式標誌。 

―――――――――――――――――――――――― 
一、使程式把自己當成子程式執行
00567000 > $ 60             PUSHAD  //進入OD後停在這!
00567001   . E8 00000000    CALL iepro.00567006
00567006   $ 5D             POP EBP
00567007   . 50             PUSH EAX
00567008   . 51             PUSH ECX
00567009   . EB 0F          JMP SHORT iepro.0056701A

下斷:BP OpenMutexA 

77E89CE9 > 55               PUSH EBP //斷在這,看看堆疊
77E89CEA   8BEC             MOV EBP,ESP
77E89CEC   51               PUSH ECX
77E89CED   51               PUSH ECX
77E89CEE   837D 10 00       CMP DWORD PTR SS:[EBP+10],0
77E89CF2   56               PUSH ESI
77E89CF3   74 50            JE SHORT KERNEL32.77E89D45

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 
BP OpenMutexA 時的堆疊: 

0012F574   0053E141  /CALL 到 OpenMutexA
0012F578   001F0001  |Access = 1F0001
0012F57C   00000000  |Inheritable = FALSE
0012F580   0012FBB4  MutexName = "20C::DA3A38CB6B"
0012F584   0012FF04
0012F588   00000000
0012F58C   0055C5D9  iepro.0055C5D9
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

Ctrl+G:401000  鍵入以下程式碼 

00401000     60                  pushad 
00401001     9C                  pushfd 
00401002     68 B4FB1200         push 12FBB4 ★ 堆疊裡看到的值 
00401007     33C0                xor eax,eax 
00401009     50                  push eax 
0040100A     50                  push eax 
0040100B     E8 B4B2A577         call kernel32.CreateMutexA 
00401010     9D                  popfd 
00401011     61                  popad 
00401012     E9 33F7A577         jmp kernel32.OpenMutexA

在401000處新建起源,F9執行,再次中斷在OpenMutexA處。

――――――――――――――――――――――――――――――――― 
二、Magic Jump,避開IAT加密 

取消以前斷點,下斷:BP GetModuleHandleA(為什麼不下BP GetModuleHandleA+5呢?因為我試了很多次,用這個斷點斷不下來,所以改用BP GetModuleHandleA)

77E80978 > 55               PUSH EBP //斷在這裡
77E80979   8BEC             MOV EBP,ESP
77E8097B   837D 08 00       CMP DWORD PTR SS:[EBP+8],0
77E8097F   75 0E            JNZ SHORT KERNEL32.77E8098F  //重新設定斷點在這裡
77E80981   64:A1 18000000   MOV EAX,DWORD PTR FS:[18]
77E80987   8B40 30          MOV EAX,DWORD PTR DS:[EAX+30]
77E8098A   8B40 08          MOV EAX,DWORD PTR DS:[EAX+8]
77E8098D   EB 14            JMP SHORT KERNEL32.77E809A3
77E8098F   FF75 08          PUSH DWORD PTR SS:[EBP+8]
77E80992   E8 2E890000      CALL KERNEL32.77E892C5
77E80997   85C0             TEST EAX,EAX
77E80999   74 08            JE SHORT KERNEL32.77E809A3
77E8099B   FF70 04          PUSH DWORD PTR DS:[EAX+4]
77E8099E   E8 E2000000      CALL KERNEL32.GetModuleHandleW
77E809A3   5D               POP EBP
77E809A4   C2 0400          RETN 4

取消斷點,在77E8097F處重新下斷點,在這裡中斷十幾次,中間會出現無法處理異常的對話方塊,用SHIFT+F9跳過就行了;Alt+F9返回程式。判斷返回程式的時機:
☆  ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 
注意看BP GetModuleHandleA 時的堆疊變化:

0012BEF8   00BCE3B7  /CALL 到 GetModuleHandleA 來自 00BCE3B1
0012BEFC   00BDF700  pModule = "kernel32.dll"
0012BF00   00BE0710  ASCII "VirtualAlloc"

0012BEF8   00BCE3D4  /CALL 到 GetModuleHandleA 來自 00BCE3CE
0012BEFC   00BDF700  pModule = "kernel32.dll"
0012BF00   00BE0704  ASCII "VirtualFree"

//再F9下去就會出現無法處理異常的對話方塊

0012BC70  |00BB912E  返回到 00BB912E 來自 KERNEL32.GetModuleHandleA
0012BC74  |0012BDAC  ASCII "kernel32.dll"

到這裡時就用CTRL+F9返回主程式:

00BB912E   8B0D 0838BE00    MOV ECX,DWORD PTR DS:[BE3808]
00BB9134   89040E           MOV DWORD PTR DS:[ESI+ECX],EAX
00BB9137   A1 0838BE00      MOV EAX,DWORD PTR DS:[BE3808]
00BB913C   393C06           CMP DWORD PTR DS:[ESI+EAX],EDI
00BB913F   75 16            JNZ SHORT 00BB9157
00BB9141   8D85 B4FEFFFF    LEA EAX,DWORD PTR SS:[EBP-14C]
00BB9147   50               PUSH EAX
00BB9148   FF15 CCA0BD00    CALL DWORD PTR DS:[BDA0CC]   KERNEL32.LoadLibraryA
00BB914E   8B0D 0838BE00    MOV ECX,DWORD PTR DS:[BE3808]
00BB9154   89040E           MOV DWORD PTR DS:[ESI+ECX],EAX
00BB9157   A1 0838BE00      MOV EAX,DWORD PTR DS:[BE3808]
00BB915C   393C06           CMP DWORD PTR DS:[ESI+EAX],EDI
00BB915F   0F84 AD000000    JE 00BB9212    //這裡就是我們常說的Magic Jump,把它改為JMP
00BB9165   33C9             XOR ECX,ECX
00BB9167   8B03             MOV EAX,DWORD PTR DS:[EBX]
00BB9169   3938             CMP DWORD PTR DS:[EAX],EDI
00BB916B   74 06            JE SHORT 00BB9173

這裡所作的修改,可以不需要在IAT處理結束後再還原始碼了。

―――――――――――――――――――――――――――――――――  
三、查詢入口點

清除上面所有的斷點,然後下bp GetCurrentThreadId,繼續按F9,中斷後注意堆疊的變化:

0012B830   6A281E36  /CALL 到 GetCurrentThreadId 來自 6A281E30   //注意這一行
0012B834   00000001
0012B838   6A281C1A  返回到 6A281C1A 來自 6A281DE2
0012B83C   6A281B60  返回到 6A281B60 來自 6A281B8C

0012B810   6A28353F  /CALL 到 GetCurrentThreadId 來自 6A283539
0012B814   00000000
0012B818   6A390470
0012B81C   6A3904D8
0012B820  /0012B838

0012F56C   00BD61D4  /CALL 到 GetCurrentThreadId 來自 00BD61CE //關鍵
0012F570   0012FF04
0012F574   00000000
0012F578   0055C5D9  iepro.0055C5D9
0012F57C   0053E8C4  iepro.0053E8C4
0012F580   0057D100  iepro.0057D100

當堆疊的地址出現的是主程式的地址時,這時要用CTRL+F9返回主程式:

00BD61D4   A3 D47CBE00      MOV DWORD PTR DS:[BE7CD4],EAX
00BD61D9   E8 4032FEFF      CALL 00BB941E
00BD61DE   6A 00            PUSH 0
00BD61E0   E8 8F8AFEFF      CALL 00BBEC74
00BD61E5   6A 00            PUSH 0
00BD61E7   C705 0CFCBD00 7C>MOV DWORD PTR DS:[BDFC0C],0BE077C        ; ASCII "RC"
00BD61F1   E8 9D2CFEFF      CALL 00BB8E93
00BD61F6   59               POP ECX
00BD61F7   59               POP ECX
00BD61F8   E8 8F10FFFF      CALL 00BC728C
00BD61FD   8BF8             MOV EDI,EAX
00BD61FF   A1 BC7BBE00      MOV EAX,DWORD PTR DS:[BE7BBC]
00BD6204   8B48 3C          MOV ECX,DWORD PTR DS:[EAX+3C]
00BD6207   3348 14          XOR ECX,DWORD PTR DS:[EAX+14]
00BD620A   3348 10          XOR ECX,DWORD PTR DS:[EAX+10]
00BD620D   03F9             ADD EDI,ECX
00BD620F   8B0E             MOV ECX,DWORD PTR DS:[ESI]
00BD6211   85C9             TEST ECX,ECX
00BD6213   75 2F            JNZ SHORT 00BD6244
00BD6215   8B78 3C          MOV EDI,DWORD PTR DS:[EAX+3C]
00BD6218   E8 6F10FFFF      CALL 00BC728C
00BD621D   8B0D BC7BBE00    MOV ECX,DWORD PTR DS:[BE7BBC]            ; iepro.00577260
00BD6223   FF76 14          PUSH DWORD PTR DS:[ESI+14]
00BD6226   8B51 14          MOV EDX,DWORD PTR DS:[ECX+14]
00BD6229   FF76 10          PUSH DWORD PTR DS:[ESI+10]
00BD622C   3351 10          XOR EDX,DWORD PTR DS:[ECX+10]
00BD622F   FF76 0C          PUSH DWORD PTR DS:[ESI+C]
00BD6232   33D7             XOR EDX,EDI
00BD6234   03C2             ADD EAX,EDX
00BD6236   8B51 24          MOV EDX,DWORD PTR DS:[ECX+24]
00BD6239   3351 1C          XOR EDX,DWORD PTR DS:[ECX+1C]
00BD623C   33D7             XOR EDX,EDI
00BD623E   2BC2             SUB EAX,EDX
00BD6240   FFD0             CALL EAX
00BD6242   EB 25            JMP SHORT 00BD6269
00BD6244   83F9 01          CMP ECX,1
00BD6247   75 22            JNZ SHORT 00BD626B
00BD6249   FF76 04          PUSH DWORD PTR DS:[ESI+4]
00BD624C   FF76 08          PUSH DWORD PTR DS:[ESI+8]
00BD624F   6A 00            PUSH 0
00BD6251   E8 3610FFFF      CALL 00BC728C
00BD6256   50               PUSH EAX
00BD6257   A1 BC7BBE00      MOV EAX,DWORD PTR DS:[BE7BBC]
00BD625C   8B48 3C          MOV ECX,DWORD PTR DS:[EAX+3C]
00BD625F   3348 24          XOR ECX,DWORD PTR DS:[EAX+24]
00BD6262   3348 1C          XOR ECX,DWORD PTR DS:[EAX+1C]
00BD6265   2BF9             SUB EDI,ECX
00BD6267   FFD7             CALL EDI    //這裡F7,飛向光明之顛。
00BD6269   8BD8             MOV EBX,EAX
00BD626B   5F               POP EDI
00BD626C   8BC3             MOV EAX,EBX
00BD626E   5E               POP ESI
00BD626F   5B               POP EBX
00BD6270   C3               RETN

在那個CALL EDI處F7我們就到入口了,這時可以用LORDPE 把主程式DUMP出來了。

―――――――――――――――――――――――――――――――――  
四、修復IAT

好了,執行Import1.6 , OEP填145C ,所有的的函式都完好無缺,FixDump它。好,執行一下,沒有問題,然後再拿Lordpe rebuild一下,減小體積。

【後語】自退出破界那麼久,再次回來時已經是今非昔比了,如今是長江後浪推前浪,技術不斷的發展,我們這些老CRACKER也該歇歇了。

相關文章