標 題:Armadillo 3.6主程式脫殼
發信人:tDasm
時 間:2004年3月13日 10:55
詳細資訊:
Armadillo 3.6主程式脫殼
工具:OllyDBG1.1漢化版;LordPE
作業系統:WIN2K
目標程式:Armadillo.exe(3.6主程式)
最近大家對Armadillo 3.6脫的研究有所升溫,有標準加殼的還有CopyMemII+Debug模式的加殼的等等。於是本人也湊個熱鬧:來個其主程式的脫文。較之他們的不同點是:一是主程式脫殼難度大點;二是不用其它輔助dump工具。(初步脫殼,沒有修復)
一、尋找OEP並Dump程式
用OllyDBG載入後,停留在入口004A2000處,記下入口開始二位元組(60E8)以便修復IAT用。用外掛IsDebuggerPresent隱藏ollydbg並在除錯設定裡忽略掉所有異常(全鉤上)。
在命令視窗裡下斷點:bp WaitForDebugEvent,然後F9執行。斷在WaitForDebugEvent入口(按F2取消斷點)。檢視堆疊視窗:
0012DA98 00487F67 /CALL 到 WaitForDebugEvent 來自 Armadill.00487F61
0012DA9C 0012EB5C |pDebugEvent = 0012EB5C
0012DAA0 000003E8 Timeout = 1000. ms
0012DAA4 0012FF04
0012DAA8 00000000
0012DAAC 00497B99 Armadill.00497B99
其中第2行0012EB5C就是發生除錯事件時具體內容存放地址。到次行點選滑鼠右鍵然後在選單選擇“轉存中跟隨”,以便在轉存視窗隨時觀察0012EB5C開始一段地址中的資料變化。
到CPU視窗,Ctrl-G:0048858A,然後在0048858A處設定硬體執行斷點。此斷點是偶經過無數次跟蹤分析而找到的最佳切入點(本人獨創,絕無2家),主要是為了便於Dump程式,至於為什麼大家看在此處斷下後的程式碼分析片斷。
ok,在所設硬體斷點處斷下。察看0012EB5C開始一段地址中的資料:
0012EB5C 01 00 00 00 58 06 00 00 ...X..
0012EB64 30 04 00 00 01 00 00 80 0....
0012EB6C 00 00 00 00 00 00 00 00 ........
0012EB74 B0 28 44 00 02 00 00 00 ?D....
[0012EB74]=004428B0,這就是我們要找的OEP!
接著來看斷點處的程式碼 (每行尾部//為說明)
0048858A CMP DWORD PTR SS:[EBP-A30],0 //[EBP-A30]為01000H大小的塊號(0-47),0對應00401000塊;1對應00402000塊;依次類推。
00488591 JL Armadill.00488840
00488597 MOV ECX,DWORD PTR SS:[EBP-A30]
0048859D CMP ECX,DWORD PTR DS:[4B85E4] //[4B85E4]為塊的總個數,本程式=48h
004885A3 JGE Armadill.00488840
004885A9 MOV EDX,DWORD PTR SS:[EBP-9BC]
004885AF AND EDX,0FF
004885B5 TEST EDX,EDX
004885B7 JE Armadill.0048866A
004885BD PUSH 0
004885BF MOV ESI,DWORD PTR SS:[EBP-A30]
004885C5 SHL ESI,4
004885C8 MOV EAX,DWORD PTR SS:[EBP-A30]
004885CE AND EAX,80000007
004885D3 JNS SHORT Armadill.004885DA
004885D5 DEC EAX
004885D6 OR EAX,FFFFFFF8
004885D9 INC EAX
004885DA XOR ECX,ECX
004885DC MOV CL,BYTE PTR DS:[EAX+4B6A80]
004885E2 MOV EDX,DWORD PTR SS:[EBP-A30]
004885E8 AND EDX,80000007
004885EE JNS SHORT Armadill.004885F5
004885F0 DEC EDX
004885F1 OR EDX,FFFFFFF8
004885F4 INC EDX
004885F5 XOR EAX,EAX
004885F7 MOV AL,BYTE PTR DS:[EDX+4B6A81]
004885FD MOV EDI,DWORD PTR DS:[ECX*4+4B2260]
00488604 XOR EDI,DWORD PTR DS:[EAX*4+4B2260]
0048860B MOV ECX,DWORD PTR SS:[EBP-A30]
00488611 AND ECX,80000007
00488617 JNS SHORT Armadill.0048861E
00488619 DEC ECX
0048861A OR ECX,FFFFFFF8
0048861D INC ECX
0048861E XOR EDX,EDX
00488620 MOV DL,BYTE PTR DS:[ECX+4B6A82]
00488626 XOR EDI,DWORD PTR DS:[EDX*4+4B2260]
0048862D MOV EAX,DWORD PTR SS:[EBP-A30]
00488633 CDQ
00488634 MOV ECX,1C
00488639 IDIV ECX
0048863B MOV ECX,EDX
0048863D SHR EDI,CL
0048863F AND EDI,0F
00488642 ADD ESI,EDI
00488644 MOV EDX,DWORD PTR DS:[4B85D4]
0048864A LEA EAX,DWORD PTR DS:[EDX+ESI*4]
0048864D PUSH EAX
0048864E MOV ECX,DWORD PTR SS:[EBP-A30]
00488654 PUSH ECX
00488655 CALL Armadill.0048A659 //解密資料並複製到對應的塊。
0048865A ADD ESP,0C
0048865D AND EAX,0FF
00488662 TEST EAX,EAX
00488664 JE Armadill.00488840
察看[EBP-A30]的值如下:
0012EB48 41 00 00 00 01 49 13 00 A...I.
修改0012eb48處的值為0,從第一塊開始解密並複製資料到00401000處,大小01000H.為了迴圈直到所有資料全部解密,偶修改了0048865D處的程式碼如下:
0048865D:inc dword ptr [0012eb48]
00488663:nop
00488664:jmp 0048858A
到資料轉存視窗,Ctrl-G:004B85E4,用來觀察004B85E4和004B85E8二處資料。其中004B85E4單元為總塊數;004B85E8單元為已經解密的塊數,如果解密塊數>=23H,則會對第0塊即00401000處程式碼實現加密並改變該塊讀寫許可權不能進行任何操作(GUARD),所以當004B85E8
的值到了20h時就修改為0(也可以在21/22H時改,但不能超過23H).
F9繼續執行,(中間記得修改004B85E8的值)在該硬體斷點中斷48h次後,執行LordPE,選擇第2個程式(有2個同名程式),即可完全dump.
二、得到引入表
重頭再來,用OllyDBG載入,設定bp DebugActiveProcess。斷下後察看堆疊視窗:
0012DA9C 00487DDB /CALL 到 DebugActiveProcess 來自 Armadill.00487DD5
0012DAA0 0000057C ProcessId = 57C
0012DAA4 0012FF04
0012DAA8 00000000
子程式ID為57C,另外開啟一個ollydbg程式,附加到這個57c程式,OK。
按ALT+F9來到入口處,修改入口指令EB FE為60 E8(第一步記下的),結果:
004A2000 >PUSHAD
004A2001 CALL Armadill.004A2006
004A2006 POP EBP
004A2007 PUSH EAX
004A2008 PUSH ECX
004A2009 JMP SHORT Armadill.004A201A
取消DebugActiveProcess斷點,設定bp OpenMutexA斷點,斷下後取消。
察看堆疊視窗:
0012F574 004797F1 /CALL 到 OpenMutexA 來自 Armadill.004797EB
0012F578 001F0001 |Access = 1F0001
0012F57C 00000000 |Inheritable = FALSE
0012F580 0012FBB4 MutexName = "57C::DAAD341ECC"
0012F584 0012FF04
在00401000空白處輸入程式碼:
00401000 60 PUSHAD
00401001 68 B4FB1200 PUSH 12FBB4
00401006 6A 00 PUSH 0
00401008 6A 00 PUSH 0
0040100A E8 D08BA877 CALL KERNEL32.CreateMutexA
0040100F 61 POPAD
00401010 -E9 D48CA877 JMP KERNEL32.OpenMutexA
在00401000地址按滑鼠右鍵,然後在選單中選擇“此處新建EIP”。
設定bp LoadLibraryA斷點,第2次斷下後,再F8跟,就會發現00E18000開始就是原來未經任何修改的引入表。用LordPe把起始地址00e18000,大小03000h全部dump出來,並編輯修改到第一步dump出來的檔案的同一地址。