Asprotect1.23 Rc4 之SynchroMagic脫殼修復+破解

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

標 題:Asprotect1.23 Rc4 之SynchroMagic脫殼修復+破解

發信人:David

時 間:2004-2-06 週五, 下午3:21 

詳細資訊:



【脫文作者】 weiyi75[Dfcg]

【作者郵箱】 weiyi75@sohu.com

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

【使用工具】 Ollydbg1.09d,ImportREC1.42,Peid

【破解平臺】 Win2000/XP

【軟體名稱】 SynchroMagic V3.0.557

【下載地址】 http://www.skycn.com/soft/2889.html

【軟體簡介】  SynchroMagic 是一個檔案備份同步系統,對指定的檔案、資料夾做同步、備份、多餘刪除的動作,並支援FTP功能,可以將電腦與FTP Server中的檔案同步,不論你走到哪裡,時時確保都有最新的檔案在手邊。
 
【軟體大小】 2022 KB

【加殼方式】 ASProtect 1.23 RC4 Registered -> Alexey Solodovnikov

【脫殼目的】 查詢Asprotect1.23 RC4的Stolen Code,由於Asprotect動態地址分配,初學者查Stolen Code的具體位置不是很容易的,針對此點,詳細寫出脫殼過程。

【破解宣告】 本文感謝csjwaman[DFCG]和JustICE[DFCG]技術指導,我是一隻小菜鳥,偶得一點心得,願與大家分享。


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

【破解內容】

 
首先Peid查殼,脫殼,為ASProtect 1.23 RC4 Registered -> Alexey Solodovnikov。Ollydbg載入程式,外掛隱藏OD,OD異常設定忽略除記憶體異常外的全部異常。

由於Asprotect動態地址分配,大家看到本文記憶體地址將和你不同,但看到的程式碼基本一樣的,脫殼開始。

00401000 >  68 01005500     push Synchro.00550001      //程式開始點,F9執行。
00401005    E8 01000000     call Synchro.0040100B
0040100A    C3              retn
0040100B    C3              retn
0040100C    27              daa
0040100D    60              pushad
0040100E    FB              sti
0040100F    8ADB            mov blbl
00401011    A7              cmps dword ptr ds:[esi], dword ptr es:[e>
00401012    0D BFAC50FC     or eax, FC50ACBF
00401017    853B            test dword ptr ds:[ebx], edi
00401019    F3:             prefix rep:
0040101A    FE              ???                                      ; 未知命令
0040101B    39CA            cmp edxecx
.....................................................................

程式異常。

00EB4524    3100            xor dword ptr ds:[eax], eax
00EB4526    EB 01           jmp short 00EB4529
00EB4528    68 648F0500     push 58F64
00EB452D    0000            add byte ptr ds:[eax], al
00EB452F    00EB            add blch
00EB4531    02E8            add chal
00EB4533    0158 68         add dword ptr ds:[eax+68], ebx
00EB4536    34 B4           xor al, 0B4
00EB4538    EA 00689445 EB0>jmp far 00EB:45946800
00EB453F    68 FC39EB00     push 0EB39FC
00EB4544    68 C436EB00     push 0EB36C4
00EB4549    68 7030EB00     push 0EB3070
00EB454E    68 582AEB00     push 0EB2A58
00EB4553    68 BC3DEB00     push 0EB3DBC
00EB4558    C3              retn
.....................................................................

然後按Shift+F9 29 次到程式最後一次異常處。

00EB3D5F    3100            xor dword ptr ds:[eax], eax  //典型最後一次記憶體異常。
00EB3D61    64:8F05 0000000>pop dword ptr fs:[0]
00EB3D68    58              pop eax
00EB3D69    833D BC7EEB00 0>cmp dword ptr ds:[EB7EBC], 0
00EB3D70    74 14           je short 00EB3D86
00EB3D72    6A 0C           push 0C
00EB3D74    B9 BC7EEB00     mov ecx, 0EB7EBC
00EB3D79    8D45 F8         lea eaxdword ptr ss:[ebp-8]
00EB3D7C    BA 04000000     mov edx, 4
00EB3D81    E8 8ED2FFFF     call 00EB1014
00EB3D86    FF75 FC         push dword ptr ss:[ebp-4]
00EB3D89    FF75 F8         push dword ptr ss:[ebp-8]
00EB3D8C    8B45 F4         mov eaxdword ptr ss:[ebp-C]
00EB3D8F    8338 00         cmp dword ptr ds:[eax], 0
00EB3D92    74 02           je short 00EB3D96
00EB3D94    FF30            push dword ptr ds:[eax]
00EB3D96    FF75 F0         push dword ptr ss:[ebp-10]
00EB3D99    FF75 EC         push dword ptr ss:[ebp-14]
00EB3D9C    C3              retn    //在這裡下斷點,Shift+F9執行到這裡後取消斷點。
.....................................................................

這裡沒有用記憶體映象斷點和模擬跟蹤到達偽Oep,因為前者跳過了Stolen Code的具體位置,後者我目前找不到Stolen Code的具體位置。

下面有無數小跳轉,小迴圈,可疑Call,用F8極其容易跑飛,沒特別說明,一律F7步過,F4直接執行到指定位置。

00EC6368    B7 C0           mov bh, 0C0
00EC636A    B5 DF           mov ch, 0DF
00EC636C    66:8BD9         mov bxcx
00EC636F    E8 07000000     call 00EC637B  //Btw,遇到Call較近距離的Call一般用F7步過,我的理解是 相距10個程式碼左右視為近距離Call。

00EC637B    81DE 74BBB366   sbb esi, 66B3BB74
00EC6381    5A              pop edx
00EC6382    66:81EB 3FA8    sub bx, 0A83F
00EC6387    66:81D3 3760    adc bx, 6037
00EC638C    81C2 0B160000   add edx, 160B
00EC6392    BE D3C8BF65     mov esi, 65BFC8D3
00EC6397    33FF            xor ediedi
00EC6399    66:B9 C526      mov cx, 26C5
00EC639D    E9 10000000     jmp 00EC63B2

00EC63B2    8BF3            mov esiebx
00EC63B4    FF3417          push dword ptr ds:[edi+edx]
00EC63B7    B9 E9199279     mov ecx, 799219E9
00EC63BC    81DE 7A4B4D4B   sbb esi, 4B4D4B7A
00EC63C2    E9 0D000000     jmp 00EC63D4

00EC63D4    58              pop eax                                  ; Synchro.005508E6
00EC63D5    51              push ecx
00EC63D6    66:81CB CDA4    or bx, 0A4CD
00EC63DB    68 9300546A     push 6A540093
00EC63E0    0FB7CF          movzx ecxdi
00EC63E3    68 DA0EF02D     push 2DF00EDA
00EC63E8    5E              pop esi
00EC63E9    66:81D9 94A4    sbb cx, 0A494
00EC63EE    59              pop ecx
00EC63EF    5B              pop ebx
00EC63F0    66:8BCA         mov cxdx
00EC63F3    8AE8            mov chal
00EC63F5    81F0 68E86160   xor eax, 6061E868
00EC63FB    E8 07000000     call 00EC6407

00EC6407    8AFD            mov bhch
00EC6409    5B              pop ebx
00EC640A    81F0 81D4EF06   xor eax, 6EFD481
00EC6410    8AFC            mov bhah
00EC6412    81C0 26F9A223   add eax, 23A2F926
00EC6418    80C5 B6         add ch, 0B6
00EC641B    8BD9            mov ebxecx
00EC641D    BE AFC6AD5E     mov esi, 5EADC6AF
00EC6422    89043A          mov dword ptr ds:[edx+edi], eax
00EC6425    57              push edi
00EC6426    51              push ecx
00EC6427    68 FD0CF236     push 36F20CFD
00EC642C    59              pop ecx
00EC642D    0F82 00000000   jb 00EC6433
00EC6433    66:81CB B5DE    or bx, 0DEB5
00EC6438    5E              pop esi
00EC6439    5B              pop ebx
00EC643A    66:BE 6955      mov si, 5569
00EC643E    53              push ebx
00EC643F    66:BE ABDE      mov si, 0DEAB
00EC6443    59              pop ecx
00EC6444    83EF 03         sub edi, 3
00EC6447    81E6 AA144070   and esi, 704014AA
00EC644D    E8 0D000000     call 00EC645F

00EC645F   /0F8B 08000000   jpo 00EC646D
00EC6465   |0FBFDE          movsx ebxsi
00EC6468   |66:81D1 AC23    adc cx, 23AC
00EC646D   8AD8            mov blal
00EC646F    81CB F3B3043D   or ebx, 3D04B3F3
00EC6475    5E              pop esi
00EC6476    4F              dec edi
00EC6477    8BF7            mov esiedi
00EC6479    E8 0D000000     call 00EC648B

00EC648B    0FB7CB          movzx ecxbx
00EC648E    5B              pop ebx
00EC648F    E8 12000000     call 00EC64A6

00EC64A6    BB 6C5C2657     mov ebx, 57265C6C
00EC64AB    5E              pop esi
00EC64AC    81FF 60EBFFFF   cmp edi, -14A0
00EC64B2    0F85 1D000000   jnz 00EC64D5 //Btw:注意這裡,這裡即將跳到某處,慢慢又迴圈回這裡,往下看。
00EC64B8    8BF0            mov esieax
00EC64BA    8AF9            mov bhcl
00EC64BC    E9 22000000     jmp 00EC64E3  //F4直接到這裡,我個人認為如果發現Jnz等跳轉附近如果有jmp xxxx語句,直接F4到這裡,很可能是迴圈出口。
00EC64C1    9C              pushfd
00EC64C2    A5              movs dword ptr es:[edi], dword ptr ds:[e>
00EC64C3    7A 2B           jpe short 00EC64F0
.................................................................

00EC64E3    5B              pop ebx     成功到達這裡。
00EC64E4    58              pop eax
00EC64E5    05 7C40E3C3     add eax, C3E3407C
00EC64EA    5C              pop esp
00EC64EB    EB 3F           jmp short 00EC652C

00EC652C    03C3            add eaxebx                             ; Synchro.00400000
00EC652E    BB B1000000     mov ebx, 0B1
00EC6533    0BDB            or ebxebx
00EC6535    75 02           jnz short 00EC6539

00EC6539    E8 00000000     call 00EC653E

00EC653E    5D              pop ebp
00EC653F    81ED 23014B00   sub ebp, 4B0123
00EC6545    8D85 D2004B00   lea eaxdword ptr ss:[ebp+4B00D2]
00EC654B    8D8D 69014B00   lea ecxdword ptr ss:[ebp+4B0169]
00EC6551    03CB            add ecxebx
00EC6553    8941 01         mov dword ptr ds:[ecx+1], eax
00EC6556    8D85 11014B00   lea eaxdword ptr ss:[ebp+4B0111]
00EC655C    8D8D D6004B00   lea ecxdword ptr ss:[ebp+4B00D6]
00EC6562    8901            mov dword ptr ds:[ecx], eax
00EC6564    B8 58140000     mov eax, 1458
00EC6569    8D8D DB004B00   lea ecxdword ptr ss:[ebp+4B00DB]
00EC656F    8901            mov dword ptr ds:[ecx], eax
00EC6571    8D8D 69014B00   lea ecxdword ptr ss:[ebp+4B0169]
00EC6577    8D85 69134B00   lea eaxdword ptr ss:[ebp+4B1369]
00EC657D    51              push ecx
00EC657E    50              push eax
00EC657F    E8 7BFFFFFF     call 00EC64FF  //這個Call往回Call,而且距離超過10個,F8放心步過。
00EC6584    3E:EB 01        jmp short 00EC6588

00EC6588    66:8105 9165EC0>add word ptr ds:[EC6591], 0CCFC
00EC6591    F61E            neg byte ptr ds:[esi]  //F7到這裡發現語句變化,F8沒試過。

00EC8871    83EC 1C         sub esp, 1C
00EC8874    83C4 18         add esp, 18
00EC8877    F2:             prefix repne:  //發現這樣的語句實際是變形jmp

00EC887C    894C24 00       mov dword ptr ss:[esp], ecx
00EC8880    66:812D 8988EC0>sub word ptr ds:[EC8889], 0EC49
00EC8889    AE              scas byte ptr es:[edi]  //F7到這裡發現語句變化,F8沒試過。

00EC8889   /65:EB 02        jmp short 00EC888E

00EC888E    23C8            and ecxeax
00EC8890    64:EB 02        jmp short 00EC8895

00EC8895    334C24 00       xor ecxdword ptr ss:[esp]
00EC8899    EB 02           jmp short 00EC889D

00EC889D    F2:             prefix repne:
00EC889E    EB 02           jmp short 00EC88A2

00EC88A2    0FC9            bswap ecx
00EC88A4    66:8135 AE88EC0>xor word ptr ds:[EC88AE], 223D
00EC88AD    F2:             prefix repne:  //F7到這裡發現語句變化,F8沒試過。

00EC88B1    B9 B288EC00     mov ecx, 0EC88B2
00EC88B6    FF51 08         call dword ptr ds:[ecx+8]

00EC88C0    59              pop ecx                                  ; 00EC88B9
00EC88C1    26:EB 02        jmp short 00EC88C6

00EC88C6    034C24 18       add ecxdword ptr ss:[esp+18]
00EC88CA    59              pop ecx
00EC88CB    3E:EB 01        jmp short 00EC88CF

00EC88CE    F2:             prefix repne:  //未知用途語句,有待研究,但發現這些語句,Stolen Code就在附近。
00EC88CF    55              push ebp  //這裡是,往下看看,不難看出是C++的入口特徵碼,就是Stolen Code的具體位置,看看被Stolen Code多少程式碼,整理結果在下面。
00EC88D0    8BEC            mov ebpesp
00EC88D2    6A FF           push -1
00EC88D4    68 A8384A00     push 4A38A8
00EC88D9    68 6CC54600     push 46C56C
00EC88DE    64:A1 00000000  mov eaxdword ptr fs:[0]
00EC88E4    3E:EB 01        jmp short 00EC88E8  //這是干擾Unpack的指令,略過。
00EC88E7    F2:             prefix repne:       //這是干擾Unpack的指令,略過。
00EC88E8    50              push eax
00EC88E9    64:8925 0000000>mov dword ptr fs:[0], esp
00EC88F0    83EC 58         sub esp, 58
00EC88F3    3E:EB 01        jmp short 00EC88F7   //這是干擾Unpack的指令,略過。
00EC88F6    F2:             prefix repne:        //這是干擾Unpack的指令,略過。
00EC88F7    53              push ebx
00EC88F8    3E:EB 01        jmp short 00EC88FC   //這是干擾Unpack的指令,略過。
00EC88FB    F2:             prefix repne:        //這是干擾Unpack的指令,略過。
00EC88FC    56              push esi
00EC88FD    3E:EB 01        jmp short 00EC8901   //這是干擾Unpack的指令,略過。
00EC8900    F2:             prefix repne:        //這是干擾Unpack的指令,略過。
00EC8901    57              push edi
00EC8902    8965 E8         mov dword ptr ss:[ebp-18], esp
00EC8905    3E:EB 01        jmp short 00EC8909   //這是干擾Unpack的指令,略過。
00EC8908    F2:             prefix repne:        //這是干擾Unpack的指令,略過。
00EC8909    EB 01           jmp short 00EC890C
00EC890B    9A 687D7746 006>call far 6800:46777D68
00EC8912    C9              leave
00EC8913    87EC            xchg espebp
00EC8915    00C3            add blal
.......................................................................

這是整理出的Stolen Code共38個位元組。

00EC88CF    55              push ebp
00EC88D0    8BEC            mov ebpesp
00EC88D2    6A FF           push -1
00EC88D4    68 A8384A00     push 4A38A8
00EC88D9    68 6CC54600     push 46C56C
00EC88DE    64:A1 00000000  mov eaxdword ptr fs:[0]
00EC88E8    50              push eax
00EC88E9    64:8925 0000000>mov dword ptr fs:[0], esp
00EC88F0    83EC 58         sub esp, 58
00EC88F7    53              push ebx
00EC88FC    56              push esi
00EC8901    57              push edi
00EC8902    8965 E8         mov dword ptr ss:[ebp-18], esp

找到了Stolen Code位元組,繼續前進,全部用F8走。
00EC890C    68 7D774600     push 46777D
00EC8911    68 C987EC00     push 0EC87C9
00EC8916    C3              retn

00EC87C9    60              pushad
00EC87CA    9C              pushfd
00EC87CB    FC              cld
00EC87CC    BF 0888EC00     mov edi, 0EC8808
00EC87D1    B9 58140000     mov ecx, 1458
00EC87D6    F3:AA           rep stos byte ptr es:[edi]  執行Stolen Code
00EC87D8    9D              popfd
00EC87D9    61              popad
00EC87DA    C3              retn

00467756    C3              retn
00467757    0000            add byte ptr ds:[eax], al  //這裡是真的Oep,Asprotect一共抽掉38個位元組,這裡有個問題是Asprotect有時抽11個位元組,有時抽38個位元組,有什麼規律,應該是從push ebp到第一個Call指令中間的程式碼,有多少抽多少。 
00467759    0000            add byte ptr ds:[eax], al   //好啦,直接雙擊這句補上剛才整理的Stolen Code,Od必須去掉用Nop填充選項。
0046775B    0000            add byte ptr ds:[eax], al
0046775D    0000            add byte ptr ds:[eax], al
0046775F    0000            add byte ptr ds:[eax], al
00467761    0000            add byte ptr ds:[eax], al
00467763    0000            add byte ptr ds:[eax], al
00467765    0000            add byte ptr ds:[eax], al
00467767    0000            add byte ptr ds:[eax], al
00467769    0000            add byte ptr ds:[eax], al
0046776B    0000            add byte ptr ds:[eax], al
0046776D    0000            add byte ptr ds:[eax], al
0046776F    0000            add byte ptr ds:[eax], al
00467771    0000            add byte ptr ds:[eax], al
00467773    0000            add byte ptr ds:[eax], al
00467775    0000            add byte ptr ds:[eax], al
00467777    0000            add byte ptr ds:[eax], al
00467779    0000            add byte ptr ds:[eax], al
0046777B    0000            add byte ptr ds:[eax], al
0046777D    FF15 94934900   call dword ptr ds:[499394]  //偽Oep地址。
00467783    33D2            xor edxedx
00467785    8AD4            mov dlah
00467787    8915 04154C00   mov dword ptr ds:[4C1504], edx
0046778D    8BC8            mov ecxeax
0046778F    81E1 FF000000   and ecx, 0FF
00467795    890D 00154C00   mov dword ptr ds:[4C1500], ecx
0046779B    C1E1 08         shl ecx, 8
0046779E    03CA            add ecxedx
.......................................................................

補好程式碼結果。

00467757    55              push ebp   
00467758    8BEC            mov ebpesp
0046775A    6A FF           push -1
0046775C    68 A8384A00     push Synchro.004A38A8
00467761    68 6CC54600     push Synchro.0046C56C
00467766    64:A1 00000000  mov eaxdword ptr fs:[0]
0046776C    50              push eax
0046776D    64:8925 0000000>mov dword ptr fs:[0], esp
00467774    83EC 58         sub esp, 58
00467777    53              push ebx
00467778    56              push esi
00467779    57              push edi
0046777A    8965 E8         mov dword ptr ss:[ebp-18], esp
0046777D    FF15 94934900   call dword ptr ds:[499394]
00467783    33D2            xor edxedx
00467785    8AD4            mov dlah
00467787    8915 04154C00   mov dword ptr ds:[4C1504], edx
0046778D    8BC8            mov ecxeax
0046778F    81E1 FF000000   and ecx, 0FF
00467795    890D 00154C00   mov dword ptr ds:[4C1500], ecx
0046779B    C1E1 08         shl ecx, 8
0046779E    03CA            add ecxedx
.......................................................................

Od外掛修改入口為67757重建輸入表選擇2脫殼。

然後用ImportREC用跟蹤等級1和Asprotect1.3X外掛輕鬆修復,正常執行。
使用Active Registry Monitor備份登錄檔,修改系統時間,發現原程式早已不能執行,脫殼程式正常執行。還原系統時間,然後用Active Registry Monitor還原登錄檔。

點About按鈕,程式崩潰。

好,繼續努力。

Od載入脫殼修復的程式,直接執行,點關於按鈕。



004012DD   .  E8 37C10700   call Unpack_.0047D419
004012E2   .  8B3D 00714B00 mov edidword ptr ds:[4B7100]  
004012E8   .  83C9 FF       or ecx, FFFFFFFF
004012EB   .  33C0          xor eaxeax
004012ED   .  F2:AE         repne scas byte ptr es:[edi]  //程式在這裡異常。
004012EF   .  F7D1          not ecx
004012F1   .  49            dec ecx
004012F2   .  8D4409 02     lea eaxdword ptr ds:[ecx+ecx+2]
004012F6   .  50            push eax
004012F7   .  E8 83F80700   call Unpack_.00480B7F

看程式碼視窗下面的資訊視窗。

ecx=FFFFFFFF
al=00
es:[edi]=[00EA3951]=???  //edi中的地址不存在,程式異常,我們看右邊寄存Edi中的值00EA3951,這個地址是沒脫殼的程式中的某地址,而且是儲存的是註冊使用者名稱字。

解決方法很簡單,我們在脫殼修復程式轉存視窗尾部為0處,注意空間要夠你填入個人資訊,隨意找,我選擇的是4C3FE8處,右鍵編輯轉存-二進位制,去掉保留大小選項,選ASCII方式填入個人破解資訊,如Crack By weiyi75[Dfcg]。選定剛才修改的程式碼,右鍵複製到可執行檔案-然後儲存檔案。

然後讓錯誤的指標指向我們指定的位置,繼續分析原程式。


004012DD   .  E8 37C10700   call Unpack_.0047D419
004012E2   .  8B3D 00714B00 mov edidword ptr ds:[4B7100]  //這裡將殼中地址給edi,點一下這句,看資訊視窗提示。
004012E8   .  83C9 FF       or ecx, FFFFFFFF
004012EB   .  33C0          xor eaxeax
004012ED   .  F2:AE         repne scas byte ptr es:[edi]  //程式在這裡異常。
004012EF   .  F7D1          not ecx
004012F1   .  49            dec ecx
004012F2   .  8D4409 02     lea eaxdword ptr ds:[ecx+ecx+2]
004012F6   .  50            push eax
004012F7   .  E8 83F80700   call Unpack_.00480B7F

資訊視窗提示。

ds:[004B7100]=00EA3951  //這個是殼中地址。

我們在轉存視窗,Ctrl+G,填入4b7100

004B7100  51 39 EA 00     

點右鍵-二進位制編輯,HEX+00

004B7100  E8 3F 4C 00  

複製到程式,儲存檔案,破解成功。



謹以本文獻給困惑中的脫友,如果對你有所幫助是我的心願。

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

【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!

相關文章