手動脫殼ASProtect 1.23beta21之Aspack2.12的主程式and暗樁分析

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

標 題:手動脫殼ASProtect 1.23beta21之Aspack2.12的主程式and暗樁分析

發信人:David

時 間:2004-2-01 週日, 下午3:04 

詳細資訊:



【脫文作者】 weiyi75[Dfcg](感謝jeffzhang[Dfcg]技術指點)

【作者郵箱】 weiyi75@sohu.com

【作者主頁】 Dfcg官方大本營

【使用工具】 Ollydbg1.09d,Imprec1.42,LoadPe

【破解平臺】 Win2000/XP

【軟體名稱】 Aspack2.12主程式

【下載地址】 http://www.aspack.com/files/aspack212.zip

【軟體簡介】 

   ASPack is an advanced Win32 executable file compressor, capable of reducing the file size of 32-bit Windows programs by as much as 70%. (ASPack compression ratio improves upon the industry-standard zip file format by as much as 10-20%.) ASPack makes Windows 95/98/NT programs and libraries smaller, and decrease load times across networks, and download times from the internet; it also protects programs against reverse engineering by non-professional hackers. Programs compressed with ASPack are self-contained and run exactly as before, with no runtime performance penalties. 

【軟體大小】 293k

【加殼方式】 ASProtect 1.22 - 1.23 Beta 21 -> Alexey Solodovnikov

【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享:)

--------------------------------------------------------------------------------

【破解內容】

前言,關於這個軟體用SDK緊密結合殼,使脫殼檔案不能直接執行。Fpx原來寫出一篇節點修復文章,這裡Jeffzhang兄提示有另外辦法修復,我學會後覺的對初學者有用,故釋出此文。Jeffzhang真是脫殼高手,吾望塵莫及。

好,脫殼開始。

這個版本的Asprotect對Nt偵錯程式不檢測,Softice嚴格校驗。OD異常設定不忽略記憶體異常,其餘全部忽略,載入程式。

00401000 >  68 01804600     PUSH ASPack.00468001  停在這裡,F9執行。
00401005    E8 01000000     CALL ASPack.0040100B
0040100A    C3              RETN
0040100B    C3              RETN
0040100C    3B92 7724E04E   CMP EDX,DWORD PTR DS:[EDX+4EE02477]
00401012    04 84           ADD AL,84
00401014    3D 62110889     CMP EAX,89081162
00401019    1905 9080A438   SBB DWORD PTR DS:[38A48090],EAX
0040101F    45              INC EBP
00401020    E1 09           LOOPDE SHORT ASPack.0040102B
......................................................................

記憶體異常。

009E0739    3100            XOR DWORD PTR DS:[EAX],EAX
009E073B    EB 01           JMP SHORT 009E073E
009E073D    68 648F0500     PUSH 58F64
009E0742    0000            ADD BYTE PTR DS:[EAX],AL
009E0744    00EB            ADD BL,CH
009E0746    02E8            ADD CH,AL
009E0748    0158 68         ADD DWORD PTR DS:[EAX+68],EBX
009E074B    F8              CLC
009E074C  ^ E2 9D           LOOPD SHORT 009E06EB
......................................................................

繼續Shift+F9 32次忽略異常到最後一次異常處。

009E00E1    3100            XOR DWORD PTR DS:[EAX],EAX   最後一次異常。
009E00E3    64:8F05 0000000>POP DWORD PTR FS:[0]  //  在此處下斷,Shift+F9中斷到這句,然後清除斷點
009E00EA    58              POP EAX
009E00EB    833D DC399E00 0>CMP DWORD PTR DS:[9E39DC],0
009E00F2    74 14           JE SHORT 009E0108
009E00F4    6A 0C           PUSH 0C
009E00F6    B9 DC399E00     MOV ECX,9E39DC
009E00FB    8D45 F8         LEA EAX,DWORD PTR SS:[EBP-8]
009E00FE    BA 04000000     MOV EDX,4
009E0103    E8 94C3FFFF     CALL 009DC49C
009E0108    FF75 FC         PUSH DWORD PTR SS:[EBP-4]
009E010B    FF75 F8         PUSH DWORD PTR SS:[EBP-8]
009E010E    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
009E0111    8338 00         CMP DWORD PTR DS:[EAX],0
009E0114    74 02           JE SHORT 009E0118
009E0116    FF30            PUSH DWORD PTR DS:[EAX]
009E0118    FF75 F0         PUSH DWORD PTR SS:[EBP-10]
009E011B    FF65 EC         JMP DWORD PTR SS:[EBP-14]   這裡就跳走了。
009E011E    5F              POP EDI
009E011F    5E              POP ESI
009E0120    5B              POP EBX
009E0121    8BE5            MOV ESP,EBP
009E0123    5D              POP EBP
009E0124    C3              RETN       注意這裡不能下斷點啊,不同於Asprotect1.23rc4
......................................................................

接著按ALT+M開啟記憶體映象。在第一個塊上下記憶體訪問斷點。

記憶體映象
   R         R
00400000   00001000   ASPack                PE header     Imag   R         RWE
00401000   00042000   ASPack                code          Imag   R         RWE   //在此處上下記憶體

訪問斷點
......................................................................


按F9執行,程式就會中斷在OEP處了。

0044289C    55              PUSH EBP   //中斷在這裡,現在就可以DUMP了。
0044289D    8BEC            MOV EBP,ESP
0044289F    83C4 F4         ADD ESP,-0C
004428A2    E8 4D0BFCFF     CALL ASPack.004033F4
004428A7    E8 0C21FCFF     CALL ASPack.004049B8
004428AC    E8 6354FCFF     CALL ASPack.00407D14
004428B1    E8 D6C6FCFF     CALL ASPack.0040EF8C


接著用Import REC 填入oep 4289C ,iat自動搜尋-獲得輸入資訊-顯示無效的,右鍵先用追蹤層次1修復大部分指標,剩下8個指標用Asprotect1.2X外掛修復。

執行修復後的程式出錯,當然不可能這麼簡單了。所以接下來的工作就是尋找出錯的位置然後修復。用OD載入修復後的程式,來到這裡。

00442901  |.  E8 D210FEFF   CALL Dump_.004239D8
00442906  |.  BA 38294400   MOV EDX,Dump_.00442938                   
0044290B  |.  A1 30564400   MOV EAX,DWORD PTR DS:[445630]
00442910  |.  E8 DF0DFEFF   CALL Dump_.004236F4
00442915      FF15 0C494400 CALL DWORD PTR DS:[44490C]  //這裡出錯,資訊框提示 DS:[0044490C]

=0098C9A0,這裡是呼叫殼中的程式碼,殼被脫了,當然出錯,所以要知道它究竟是呼叫什麼內容,只能跟蹤未脫殼的程式相應位置。

用OD重新載入未脫殼的程式,重複上敘步驟。直到OEP處停下。

00442915    FF15 0C494400   CALL DWORD PTR DS:[44490C]  //按F4來到這裡,接著F7跟入

0098C9A0    833D A8359900 0>CMP DWORD PTR DS:[9935A8],0  //來到這裡
0098C9A7    74 06           JE SHORT 0098C9AF
0098C9A9    FF15 A8359900   CALL DWORD PTR DS:[9935A8]  //DS:[009935A8]=004427A8,呼叫004427A8處的程式碼   ; ASPack.004427A8
0098C9AF    C3              RETN

看到這裡大家應該都知道該怎樣修復了吧。在轉儲視窗,Ctrl+G來到0044490C

0044490C  A0 C9 98 00     //原先值

0044490C  A8 27 44 00     //修改值

儲存為Unpack1.exe,試執行,確定一個錯誤提示,英文介面,還不能加殼程式。

繼續查詢出錯的位置


0043F1B8      FF15 04494400 CALL DWORD PTR DS:[444904]  //這裡出錯,DS:[00444904]=0098C8F4,又是呼叫殼中的程式碼

同理跟蹤未脫殼的程式來到此處

0043F1B8    FF15 04494400   CALL DWORD PTR DS:[444904]   //F7進入

0098C8F4    C3              RETN   //來到這裡。返回到 0043F1BE

暈,裡面就是一個RETN,這個也好辦,隨便找一個RETN讓它返回吧。可以用Ctrl+F查詢RETN,我選用的是

00401234處的,隨便哪個RETN都行。

同樣來到轉儲視窗,Ctrl+G來到00444904

00444904  F4 C8 98 00    //原先值

00444904  34 12 40 00    //修改值


繼續查詢出錯的位置

0043F246      FF15 08494400 CALL DWORD PTR DS:[444908]  //DS:[00444908]=0098C8F4  這裡也是呼叫殼中的程式碼

同樣跟蹤未脫殼的程式來到此處

0043F246    FF15 08494400   CALL DWORD PTR DS:[444908]  //F7進入

0098C8F4    C3              RETN   //來到這裡。

這裡和上面修改一樣。

00444908  F4 C8 98 00    //原先值

00444908  34 12 40 00    //修改值

到這裡就是徹底結束了,可以正常執行了。




【破解總結】


在轉儲視窗中修改

00444904  F4 C8 98 00           //原先值

00444904  34 12 40 00           //修改值


00444908  F4 C8 98 00           //原先值

00444908  34 12 40 00           //修改值 


0044490C  A0 C9 98 00           //原先值 

0044490C  A8 27 44 00           //修改值

相關文章