用Armadillo標準加殼的程式的脫殼和引入表修復方案---OLLYDBG (8千字)

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

用過ARMADILLO的人都知道,用它加殼有兩種方式,一是使用COPYMEMII,一是標準加殼.用COPYMEMII的一般可用DILLODUMP脫(當然也有時脫不了),而用標準加殼用DILLODUMP是脫不了的,這是DILLODUMP中的說明,我們來看看:
NOTE: This only really works on programs that are at least protected to some extent. 
For example, it will not work on "Standard Protection" aramadillo files, which isn't
a big deal, because for those you do not need to have any "advanced" tools to dump. I plan
on released a "lite" version to support those files soon..
本人E文很菜,只能瞭解大意,是說標準加殼的脫殼比較簡單,不需用工具.但是對我等菜來說,還是要用工具的好,不過既然現在還沒有,還是手脫吧.
脫殼目標:SoundEdit pro v1.30.634,5月29日更新.
下載:
http://www.rmbsoft.com/getit.asp?pid=6&server=http://www.winsoft98.com/programs/sep13.exe
加殼程式:Armadillo v3.00a
工具:OLLYDBG,LOADPE,importREC
SoundEdit是一個聲音編輯軟體(國外的),採用了ARMADILLO的KEY加密,啟動要你輸入KEY,否則要等N秒才能讓你啟動,還有30天試用期,所以,如果脫了殼,上述現象都將沒有了.現在開始脫殼歷程.!!
第一步,DUMP出程式:
用OLLYDBG載入程式.在除錯選項中忽略所有異常,這樣可以少按SHIFT+F9
BP VirtualProtect,F9執行,這時會有異常,用SHIFT+F9過程式會斷下來,這時你不停按F9,一般在第5次會出現註冊框,OK後再次中斷,這時你要注意堆?技竅F9的次數了.我這第20下時在堆3魷秩縵灤畔:
0012F214   7342F406  /CALL to VirtualProtect from MSVBVM60.7342F400
說明程式,已經執行了.(VB是先執行MSVBVM60.DLL的,在其中也用呼叫VirtualProtect,如果是DELPHI等程式,可一直F9到程式執行為止)
現在重新載入程式,到出現這個資訊的前一次中斷停下來,然後按幾次CTRL+F9到程式中(也就是地址較低的地方,一般都是004*****,005*****,本程式在這:
004DA060    83C4 04         ADD     ESP, 4
004DA063    8945 FC         MOV     DWORD PTR SS:[EBP-4], EAX
004DA066    837D B8 00      CMP     DWORD PTR SS:[EBP-48], 0
004DA06A    74 0A           JE      SHORT SoundEdi.004DA076
004DA06C    8B45 B8         MOV     EAXDWORD PTR SS:[EBP-48]
004DA06F    50              PUSH    EAX
004DA070    FF15 E8615000   CALL    DWORD PTR DS:[<&USER32.DestroyWi>; USER32.DestroyWindow
004DA076    8B45 FC         MOV     EAXDWORD PTR SS:[EBP-4]
004DA079    8BE5            MOV     ESPEBP
004DA07B    5D              POP     EBP
004DA07C    C3              RETN
這時小心地用F8,因為有一堆的JMP,JNZ,JO等,不過也用不了多久的,大概20多次就可來到這:
004DB483    61              POPAD
004DB484    6A 00           PUSH    0
004DB486    E8 6E000000     CALL    SoundEdi.004DB4F9
004DB48B    83C4 04         ADD     ESP, 4
004DB48E    6A 00           PUSH    0
004DB490    E8 46830000     CALL    SoundEdi.004E37DB
004DB495    83C4 04         ADD     ESP, 4
004DB498    837D E4 01      CMP     DWORD PTR SS:[EBP-1C], 1
004DB49C    75 11           JNZ     SHORT SoundEdi.004DB4AF
004DB49E    68 E8965000     PUSH    SoundEdi.005096E8
004DB4A3    FF15 0C975000   CALL    DWORD PTR DS:[50970C]    ,這個CALL用F7跟進
004DB4A9    83C4 04         ADD     ESP, 4
004DB4AC    8945 E4         MOV     DWORD PTR SS:[EBP-1C], EAX
004DB4AF    68 0C9E4D00     PUSH    SoundEdi.004D9E0C
在4db4a3這個CALL用f7跟進,然後繼續F8,幾次後就來到這:
00D0B5E0   /75 29           JNZ     SHORT 00D0B60B
00D0B5E2   |E8 A05AFFFF     CALL    00D01087
00D0B5E7   |FF76 04         PUSH    DWORD PTR DS:[ESI+4]
00D0B5EA   |8BF8            MOV     EDIEAX
00D0B5EC   |A1 CCEED100     MOV     EAXDWORD PTR DS:[D1EECC]
00D0B5F1   |FF76 08         PUSH    DWORD PTR DS:[ESI+8]
00D0B5F4   |8B48 70         MOV     ECXDWORD PTR DS:[EAX+70]
00D0B5F7   |3348 50         XOR     ECXDWORD PTR DS:[EAX+50]
00D0B5FA   |6A 00           PUSH    0
00D0B5FC   |3348 34         XOR     ECXDWORD PTR DS:[EAX+34]
00D0B5FF   |03F9            ADD     EDIECX
00D0B601   |E8 815AFFFF     CALL    00D01087
00D0B606   |50              PUSH    EAX
00D0B607   |FFD7            CALL    EDI                               SoundEdi.004059B0
看到最後這個CALL EDI嗎,004059B0就是程式的OEP了,我們F7跟進:
00405996  - FF25 3C114000   JMP     DWORD PTR DS:[40113C]
0040599C  - FF25 8C104000   JMP     DWORD PTR DS:[40108C]
004059A2  - FF25 B0104000   JMP     DWORD PTR DS:[4010B0]
004059A8  - FF25 E8114000   JMP     DWORD PTR DS:[4011E8]
004059AE    0000            ADD     BYTE PTR DS:[EAX], AL
004059B0    68 787D4000     PUSH    SoundEdi.00407D78     ,這是OEP了,
004059B5    E8 EEFFFFFF     CALL    SoundEdi.004059A8
呵,典型的VB程式碼.拿出LOADPE,快快DUMP吧.我們把DUMP的程式儲存為DUMPED.EXE
第二步,引入表的修復
以前總以為它的修復很難,但實際上只要修改程式流程,完全可得到正確的引入表的.
1.可先用importREC試試,有一個指標無效,如果CUT程式退出時會出錯,所以要修復它.透過它我們可看到iat的rva為1000,錯誤指標為1030,(如果很多指標無效,只要記住一個無效的RVA就可以了)
2.重新載入程式,BP VirtualProtect,斷下後f9,注意堆5謀浠,當出現如下資訊時要注意了:
0012DB28   00D0887E  /CALL to VirtualProtect from 00D08878
0012DB2C   00401000  |Address = SoundEdi.00401000
0012DB30   000CB000  |Size = CB000 (831488.)
0012DB34   00000004  |NewProtect = PAGE_READWRITE
0012DB38   0012F034  \pOldProtect = 0012F034
它將往401000也就是IAT所在的地方寫入資訊:這是再按一下F9,又停下來,D 401000,我們可看到,IAT所在的位置已經寫入了東西,還不是dll的地址,還記得那個無效指標的地址嗎:401030,我們清掉斷點,然後在在記憶體定位到401030處,"右鍵-->breakpoint-->hardware on write-->dword",然後按F9執行,程式停了下來:
00D0942F    8B85 5CFBFFFF   MOV     EAXDWORD PTR SS:[EBP-4A4]
00D09435    8B8D 48F9FFFF   MOV     ECXDWORD PTR SS:[EBP-6B8]
00D0943B    8908            MOV     DWORD PTR DS:[EAX], ECX
00D0943D    8B85 5CFBFFFF   MOV     EAXDWORD PTR SS:[EBP-4A4]       停在這
00D09443    83C0 04         ADD     EAX, 4
00D09446    8985 5CFBFFFF   MOV     DWORD PTR SS:[EBP-4A4], EAX
00D0944C  ^ E9 78FEFFFF     JMP     00D092C9
看到上述二行:MOV ECX,DWORD PRT [EBP-6B8],我們再往上找幾行可看到這個語句:
00D093E3    E8 F8C0FEFF     CALL    00CF54E0
00D093E8    8985 48F9FFFF   MOV     DWORD PTR SS:[EBP-6B8], EAX
00D093EE    83BD 48F9FFFF 0>CMP     DWORD PTR SS:[EBP-6B8], 0
00D093F5    75 38           JNZ     SHORT 00D0942F
在第二行也有個[EBP-6B8],注意前面這個CALL,我們去看一看
00CF54E0    55              PUSH    EBP
00CF54E1    8BEC            MOV     EBPESP
00CF54E3    53              PUSH    EBX
00CF54E4    56              PUSH    ESI
00CF54E5    57              PUSH    EDI
00CF54E6    33FF            XOR     EDIEDI
00CF54E8    33DB            XOR     EBXEBX
00CF54EA    66:F745 0E FFFF TEST    WORD PTR SS:[EBP+E], 0FFFF
00CF54F0    75 03           JNZ     SHORT 00CF54F5
00CF54F2    8B5D 0C         MOV     EBXDWORD PTR SS:[EBP+C]
00CF54F5    57              PUSH    EDI
00CF54F6    FF15 A430D100   CALL    DWORD PTR DS:[D130A4]             kernel32.GetModuleHandleA
00CF54FC    3945 08         CMP     DWORD PTR SS:[EBP+8], EAX
00CF54FF    75 07           JNZ     SHORT 00CF5508
00CF5501    BE C053D100     MOV     ESI, 0D153C0
00CF5506    EB 60           JMP     SHORT 00CF5568
00CF5508    393D 9859D100   CMP     DWORD PTR DS:[D15998], EDI
00CF550E    B9 9859D100     MOV     ECX, 0D15998
00CF5513    74 3C           JE      SHORT 00CF5551
00CF5515    8B35 B8B1D100   MOV     ESIDWORD PTR DS:[D1B1B8]
00CF551B    A1 CCEED100     MOV     EAXDWORD PTR DS:[D1EECC]
00CF5520    F641 08 01      TEST    BYTE PTR DS:[ECX+8], 1
00CF5524    74 0E           JE      SHORT 00CF5534
00CF5526    8B50 70         MOV     EDXDWORD PTR DS:[EAX+70]
00CF5529    3350 60         XOR     EDXDWORD PTR DS:[EAX+60]
00CF552C    3350 3C         XOR     EDXDWORD PTR DS:[EAX+3C]
00CF552F    F6C2 80         TEST    DL, 80
00CF5532    75 13           JNZ     SHORT 00CF5547
00CF5534    8B50 70         MOV     EDXDWORD PTR DS:[EAX+70]
00CF5537    3350 64         XOR     EDXDWORD PTR DS:[EAX+64]
00CF553A    3350 58         XOR     EDXDWORD PTR DS:[EAX+58]
00CF553D    3350 20         XOR     EDXDWORD PTR DS:[EAX+20]
00CF5540    3316            XOR     EDXDWORD PTR DS:[ESI]
00CF5542    3955 08         CMP     DWORD PTR SS:[EBP+8], EDX
00CF5545    74 1E           JE      SHORT 00CF5565
00CF5547    83C1 0C         ADD     ECX, 0C
00CF554A    83C6 04         ADD     ESI, 4
00CF554D    3939            CMP     DWORD PTR DS:[ECX], EDI
00CF554F  ^ 75 CF           JNZ     SHORT 00CF5520
00CF5551    FF75 0C         PUSH    DWORD PTR SS:[EBP+C]
這裡面有幾個跳轉,其中最後一個CF554F是往上跳的.我們看一個就可發現:
00CF5513    74 3C           JE      SHORT 00CF5551,這個跳正好可跳出這個迴圈.只要改這個跳,就不會破壞引入表了.
再次重新載入,BP VirtualProtect,出現註冊框後OK,程式再斷下來,這時清除斷點(包括硬體斷點),CTRL+F9回程式領空,把CF5513的74 3c改成eb 3c,按F9執行,程式執行後開啟importREC,選中程式,入口填入59b0,-->IAT自動搜尋-->獲得輸入資訊",如果還有無效的大可放心的cut,因為它們本來就不是有用指標了(也可能是importREC把IAT的大小判斷錯了),.然後修復脫殼後的檔案.OK,大功告成.
測試了下脫殼後的程式,執行正常,那個煩人的註冊框沒有,時間限制也註冊了,別說30天,就是30年都沒問題.

相關文章