Armadillo 3.6主程式脫殼

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

標 題: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出來的檔案的同一地址。

相關文章