ASProtect 1.23 SDK之 Aspack2.12r 主程式脫殼去暗樁

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

【脫文標題】 ASProtect 1.23 SDK之 Aspack2.12r 主程式脫殼去暗樁

【脫文作者】 weiyi75[Dfcg]

【作者郵箱】 weiyi75@sohu.com

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

【使用工具】 Ollydbg1.10b,Imprec1.42,LoadPe

【破解平臺】 Win2000/XP

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

【下載地址】 http://www.pediy.com/tools/PACK/Packers/Aspack/aspack212r.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's 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. 

【軟體大小】 189k

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

【保護方式】 RSAKEY保護+30天日期限制。

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

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

【破解內容】

前言,關於這個軟體用SDK緊密結合殼,使脫殼檔案不能直接執行。上次發過一篇Aspack 沒有Key的Demo 版脫殼文章。

相關頁面

http://www.chinadfcg.com/viewthread.php?tid=1247

今天看見Jeffzhang用自己的名字可以註冊成功,發現了這個殼使用rsakey保護時,會使demo版無法被crack成完整版本,如果你有Key脫殼時可以脫殼成完全整本,關鍵是自己的註冊名字,不過有Key的時候不會太多。為了獲取完整脫殼版本,我將Key匯入了登錄檔。

好,脫殼開始。

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

00401000 >  68 01704600     push ASPACK.00467001  //停在這裡,F9一直執行。
00401005    E8 01000000     call ASPACK.0040100B
0040100A    C3              retn
0040100B    C3              retn
0040100C    9F              lahf
0040100D    24 9F           and al, 9F
0040100F    24 9C           and al, 9C
00401011    84E0            test alah
00401013    10FB            adc blbh
00401015    C022 90         shl byte ptr ds:[edx], 90
00401018    1212            adc dlbyte ptr ds:[edx]
0040101A    0921            or dword ptr ds:[ecx], esp
0040101C    0148 70         add dword ptr ds:[eax+70], ecx
0040101F    8BC2            mov eaxedx
00401021    1242 02         adc albyte ptr ds:[edx+2]
......................................................................

記憶體異常。

00D30739    3100            xor dword ptr ds:[eax], eax
00D3073B    EB 01           jmp short 00D3073E
00D3073D    68 648F0500     push 58F64
00D30742    0000            add byte ptr ds:[eax], al
00D30744    00EB            add blch
00D30746    02E8            add chal
00D30748    0158 68         add dword ptr ds:[eax+68], ebx
00D3074B    F8              clc
00D3074C  ^ E2 D2           loopd short 00D30720
00D3074E    0068 74         add byte ptr ds:[eax+74], ch
00D30751    08D3            or bldl
00D30753    0068 A4         add byte ptr ds:[eax-5C], ch
00D30756    FD              std
00D30757    D200            rol byte ptr ds:[eax], cl
00D30759    68 54FAD200     push 0D2FA54
00D3075E    68 2CF4D200     push 0D2F42C
00D30763    68 BCEED200     push 0D2EEBC
00D30768    68 4001D300     push 0D30140
00D3076D    C3              retn
......................................................................

Shift+F9 22次左右一直執行到硬碟指紋出現

00D3099F    3100            xor dword ptr ds:[eax], eax
00D309A1    EB 01           jmp short 00D309A4
00D309A3    68 648F0500     push 58F64
00D309A8    0000            add byte ptr ds:[eax], al
00D309AA    00EB            add blch
00D309AC    02E8            add chal
00D309AE    0158 B2         add dword ptr ds:[eax-4E], ebx
00D309B1    01B8 20CCD200   add dword ptr ds:[eax+D2CC20], edi
00D309B7    E8 74C2FFFF     call 00D2CC30
00D309BC    8BF0            mov esieax
00D309BE    A1 A439D300     mov eaxdword ptr ds:[D339A4]
00D309C3    8946 04         mov dword ptr ds:[esi+4], eax
00D309C6    66:8B15 8C22D30>mov dxword ptr ds:[D3228C]
00D309CD    8BC6            mov eaxesi
00D309CF    E8 BCC2FFFF     call 00D2CC90
00D309D4    8BD8            mov ebxeax
00D309D6    85DB            test ebxebx
00D309D8    74 0B           je short 00D309E5
00D309DA    8D55 C8         lea edxdword ptr ss:[ebp-38]
00D309DD    8D43 06         lea eaxdword ptr ds:[ebx+6]
00D309E0    E8 8F9AFFFF     call 00D2A474
00D309E5    66:8B15 DC22D30>mov dxword ptr ds:[D322DC]
00D309EC    8BC6            mov eaxesi
00D309EE    E8 9DC2FFFF     call 00D2CC90
......................................................................

堆疊內容

0012D71C   0012D724  指標到下一個 SEH 記錄
0012D720   00D30956  SE 控制程式碼
0012D724   0012FFE0  指標到下一個 SEH 記錄
0012D728   00D312CF  SE 控制程式碼
0012D72C   0012FF90
0012D730   00D20000
0012D734   00D00000
0012D738   00D306D4
0012D73C   00000000
0012D740   00D45480  ASCII "ARInMgCAUXY="
......................................................................

btw:  這裡涉及到Aspr殼的pre-dip的知識,Volx關於Aspr殼的pre-dip我到現在還沒有體會,另外Asprotect作者自己的拳頭產品比普通的Asprotect程式更難。

這裡必須不斷跟蹤親身在殼和程式中體會。

再按一次Shift+F9,注意每個Asprotect的處理方法都不同,不然也不會寫那麼多文章。

00D30DFC    3100            xor dword ptr ds:[eax], eax
00D30DFE    EB 01           jmp short 00D30E01
00D30E00    68 648F0500     push 58F64
00D30E05    0000            add byte ptr ds:[eax], al
00D30E07    00EB            add blch
00D30E09    02E8            add chal
00D30E0B    0158 E8         add dword ptr ds:[eax-18], ebx
00D30E0E    25 0000008B     and eax, 8B000000
00D30E13    44              inc esp
00D30E14    24 0C           and al, 0C
00D30E16    8380 B8000000 0>add dword ptr ds:[eax+B8], 2
00D30E1D    51              push ecx
00D30E1E    31C9            xor ecxecx
00D30E20    8948 04         mov dword ptr ds:[eax+4], ecx
00D30E23    8948 08         mov dword ptr ds:[eax+8], ecx
00D30E26    8948 0C         mov dword ptr ds:[eax+C], ecx
00D30E29    8948 10         mov dword ptr ds:[eax+10], ecx
00D30E2C    C740 18 5501000>mov dword ptr ds:[eax+18], 155
00D30E33    59              pop ecx
00D30E34    31C0            xor eaxeax
00D30E36    C3              retn
......................................................................

堆疊內容

0012D724   0012FFE0  指標到下一個 SEH 記錄
0012D728   00D312CF  SE 控制程式碼
0012D72C   0012FF90
0012D730   00D20000
0012D734   00D00000
0012D738   00D306D4
0012D73C   00000000
0012D740   00D40414  ASCII "SOFTWAREASPack"
......................................................................

繼續Shift+F9

00D30E3F    3100            xor dword ptr ds:[eax], eax
00D30E41    64:8F05 0000000>pop dword ptr fs:[0]
00D30E48    58              pop eax
00D30E49    833F 00         cmp dword ptr ds:[edi], 0
00D30E4C    74 0C           je short 00D30E5A
00D30E4E    8B07            mov eaxdword ptr ds:[edi]
00D30E50    E8 B724FFFF     call 00D2330C
00D30E55    83F8 0A         cmp eax, 0A
00D30E58    7D 0A           jge short 00D30E64
00D30E5A    E8 15D1FFFF     call 00D2DF74
00D30E5F    E9 71030000     jmp 00D311D5
00D30E64    B8 6836D300     mov eax, 0D33668
00D30E69    E8 CA25FFFF     call 00D23438
00D30E6E    8945 E0         mov dword ptr ss:[ebp-20], eax
00D30E71    A1 6836D300     mov eaxdword ptr ds:[D33668]
00D30E76    E8 9124FFFF     call 00D2330C
00D30E7B    8945 E4         mov dword ptr ss:[ebp-1C], eax
00D30E7E    A1 D039D300     mov eaxdword ptr ds:[D339D0]
00D30E83    8945 D8         mov dword ptr ss:[ebp-28], eax
00D30E86    A1 D439D300     mov eaxdword ptr ds:[D339D4]
00D30E8B    8945 DC         mov dword ptr ss:[ebp-24], eax
00D30E8E    8D95 ACD7FFFF   lea edxdword ptr ss:[ebp-2854]
00D30E94    8B07            mov eaxdword ptr ds:[edi]
00D30E96    E8 D9F8FFFF     call 00D30774
00D30E9B    8B85 ACD7FFFF   mov eaxdword ptr ss:[ebp-2854]
00D30EA1    8D95 B0D7FFFF   lea edxdword ptr ss:[ebp-2850]
00D30EA7    E8 4093FFFF     call 00D2A1EC
00D30EAC    8B95 B0D7FFFF   mov edxdword ptr ss:[ebp-2850]
00D30EB2    8BC7            mov eaxedi
00D30EB4    E8 5323FFFF     call 00D2320C
00D30EB9    E8 3A000000     call 00D30EF8
00D30EBE    68 C70ED300     push 0D30EC7
00D30EC3    FF0424          inc dword ptr ss:[esp]
00D30EC6    C3              retn
......................................................................

堆疊內容

0012D724   0012FFE0  指標到下一個 SEH 記錄
0012D728   00D312CF  SE 控制程式碼
0012D72C   0012FF90
0012D730   00D20000
0012D734   00D00000
0012D738   00D306D4
0012D73C   00000000
0012D740   00D40414  ASCII "SOFTWAREASPack"
......................................................................

00D30F07    3100            xor dword ptr ds:[eax], eax
00D30F09    EB 01           jmp short 00D30F0C
00D30F0B    68 648F0500     push 58F64
00D30F10    0000            add byte ptr ds:[eax], al
00D30F12    00EB            add blch
00D30F14    02E8            add chal
00D30F16    0158 8D         add dword ptr ds:[eax-73], ebx
00D30F19    05 6C36D300     add eax, 0D3366C
00D30F1E    50              push eax
00D30F1F    E8 04F6FFFF     call 00D30528
00D30F24    E8 3A000000     call 00D30F63
00D30F29    68 320FD300     push 0D30F32
00D30F2E    FF0424          inc dword ptr ss:[esp]
00D30F31    C3              retn
......................................................................

0012D724   0012FFE0  指標到下一個 SEH 記錄
0012D728   00D312CF  SE 控制程式碼
0012D72C   0012FF90
0012D730   00D20000
0012D734   00D00000
0012D738   00D306D4
0012D73C   00D40430  ASCII 

"0vKiRNl66uKx8sot6BFZOoQUZGrqmy5ObFIeSG8OZ0JJh0vizDoYi8KDpenBkQOczSPgwYqx9XcacySkO3xpCZPVv/GvABIkLwh4+x7emwMecMKZOavEkpJrmNMt

Mq0gOS4Ad06Qr1Tzfd6D3zrsLchc/7zMOFljkOAroxn79Ilc="
0012D740   00D404EC  ASCII 

"0vKiRNl66uKx8sot6BFZOoQUZGrqmy5ObFIeSG8OZ0JJh0vizDoYi8KDpenBkQOczSPgwYqx9XcacySkO3xpCZPVv/GvABIkLwh4+x7emwMecMKZOavEkpJrmNMt

Mq0gOS4Ad06Qr1Tzfd6D3zrsLchc/7zMOFljkOAroxn79Ilc="
......................................................................

00D305CC    8B43 02         mov eaxdword ptr ds:[ebx+2]
00D305CF    50              push eax
00D305D0    8D43 06         lea eaxdword ptr ds:[ebx+6]
00D305D3    50              push eax
00D305D4    E8 47BAFFFF     call 00D2C020
00D305D9    85C0            test eaxeax
00D305DB    74 15           je short 00D305F2
00D305DD    33C9            xor ecxecx
00D305DF    B2 01           mov dl, 1
00D305E1    B8 F8ECD200     mov eax, 0D2ECF8                         ; ASCII 06,"EFound"
00D305E6    E8 15ADFFFF     call 00D2B300
00D305EB    E8 5C28FFFF     call 00D22E4C
00D305F0    EB 13           jmp short 00D30605
00D305F2    33C9            xor ecxecx
00D305F4    B2 01           mov dl, 1
00D305F6    B8 4C9CD200     mov eax, 0D29C4C
00D305FB    E8 00ADFFFF     call 00D2B300
00D30600    E8 4728FFFF     call 00D22E4C
......................................................................

堆疊內容

0012D6D8   00D33670
0012D6DC   00000010
0012D6E0   0012D6EC  指標到下一個 SEH 記錄
0012D6E4   00D30612  SE 控制程式碼
0012D6E8   0012D718
0012D6EC   0012D724  指標到下一個 SEH 記錄
0012D6F0   00D306C3  SE 控制程式碼
......................................................................

00D30F72    3100            xor dword ptr ds:[eax], eax
00D30F74    EB 01           jmp short 00D30F77
00D30F76    68 648F0500     push 58F64
00D30F7B    0000            add byte ptr ds:[eax], al
00D30F7D    00EB            add blch
00D30F7F    02E8            add chal
00D30F81    0158 8B         add dword ptr ds:[eax-75], ebx
00D30F84    07              pop es
00D30F85    E8 8223FFFF     call 00D2330C
00D30F8A    48              dec eax
00D30F8B    50              push eax
00D30F8C    8BC7            mov eaxedi
00D30F8E    E8 A524FFFF     call 00D23438
00D30F93    40              inc eax
00D30F94    8D8D B0D7FFFF   lea ecxdword ptr ss:[ebp-2850]
00D30F9A    5A              pop edx
00D30F9B    E8 80D7FFFF     call 00D2E720
00D30FA0    8B85 B0D7FFFF   mov eaxdword ptr ss:[ebp-2850]
00D30FA6    50              push eax
00D30FA7    8D85 ACD7FFFF   lea eaxdword ptr ss:[ebp-2854]
00D30FAD    8B17            mov edxdword ptr ds:[edi]
00D30FAF    8A12            mov dlbyte ptr ds:[edx]
00D30FB1    E8 1623FFFF     call 00D232CC
......................................................................

堆疊內容

0012D71C   0012D724  指標到下一個 SEH 記錄
0012D720   00D30F29  SE 控制程式碼
0012D724   0012FFE0  指標到下一個 SEH 記錄
0012D728   00D312CF  SE 控制程式碼
0012D72C   0012FF90
0012D730   00D20000
0012D734   00D00000
0012D738   00D306D4
0012D73C   00D40430  ASCII 

"0vKiRNl66uKx8sot6BFZOoQUZGrqmy5ObFIeSG8OZ0JJh0vizDoYi8KDpenBkQOczSPgwYqx9XcacySkO3xpCZPVv/GvABIkLwh4+x7emwMecMKZOavEkpJrmNMt

Mq0gOS4Ad06Qr1Tzfd6D3zrsLchc/7zMOFljkOAroxn79Ilc="
0012D740   00D404EC  ASCII 

"0vKiRNl66uKx8sot6BFZOoQUZGrqmy5ObFIeSG8OZ0JJh0vizDoYi8KDpenBkQOczSPgwYqx9XcacySkO3xpCZPVv/GvABIkLwh4+x7emwMecMKZOavEkpJrmNMt

Mq0gOS4Ad06Qr1Tzfd6D3zrsLchc/7zMOFljkOAroxn79Ilc="
......................................................................

00D31013    3100            xor dword ptr ds:[eax], eax
00D31015    EB 01           jmp short 00D31018
00D31017    68 648F0500     push 58F64
00D3101C    0000            add byte ptr ds:[eax], al
00D3101E    00EB            add blch
00D31020    02E8            add chal
00D31022    0158 8B         add dword ptr ds:[eax-75], ebx
00D31025    45              inc ebp
00D31026    C4E8            les ebpeax                             ; 非法使用暫存器
00D31028    E0 22           loopdne short 00D3104C
00D3102A    FFFF            ???                                      ; 未知命令
00D3102C    50              push eax
00D3102D    8B45 C4         mov eaxdword ptr ss:[ebp-3C]
00D31030    E8 F723FFFF     call 00D2342C
00D31035    8D4D D0         lea ecxdword ptr ss:[ebp-30]
00D31038    5A              pop edx
00D31039    E8 FED9FFFF     call 00D2EA3C
00D3103E    8BD8            mov ebxeax
00D31040    E8 3A000000     call 00D3107F
00D31045    68 4E10D300     push 0D3104E
00D3104A    FF0424          inc dword ptr ss:[esp]
00D3104D    C3              retn
......................................................................

堆疊內容

0012D71C   0012D724  指標到下一個 SEH 記錄
0012D720   00D30FCA  SE 控制程式碼
0012D724   0012FFE0  指標到下一個 SEH 記錄
0012D728   00D312CF  SE 控制程式碼
......................................................................

00D3108E    3100            xor dword ptr ds:[eax], eax
00D31090    EB 01           jmp short 00D31093
00D31092    68 648F0500     push 58F64
00D31097    0000            add byte ptr ds:[eax], al
00D31099    00EB            add blch
00D3109B    02E8            add chal
00D3109D    0158 83         add dword ptr ds:[eax-7D], ebx
00D310A0    FB              sti
00D310A1    0175 64         add dword ptr ss:[ebp+64], esi
00D310A4    837D F8 00      cmp dword ptr ss:[ebp-8], 0
00D310A8    74 5E           je short 00D31108
00D310AA    33C0            xor eaxeax
00D310AC    55              push ebp
00D310AD    68 F910D300     push 0D310F9
00D310B2    64:FF30         push dword ptr fs:[eax]
00D310B5    64:8920         mov dword ptr fs:[eax], esp
00D310B8    8B45 F8         mov eaxdword ptr ss:[ebp-8]
00D310BB    E8 70F7FFFF     call 00D30830
00D310C0    DD5D B4         fstp qword ptr ss:[ebp-4C]
00D310C3    9B              wait
00D310C4    8B45 FC         mov eaxdword ptr ss:[ebp-4]
00D310C7    E8 64F7FFFF     call 00D30830
00D310CC    DD5D AC         fstp qword ptr ss:[ebp-54]
00D310CF    9B              wait
00D310D0    E8 D79BFFFF     call 00D2ACAC
......................................................................

堆疊內容

0012D71C   0012D724  指標到下一個 SEH 記錄
0012D720   00D31045  SE 控制程式碼
0012D724   0012FFE0  指標到下一個 SEH 記錄
0012D728   00D312CF  SE 控制程式碼
......................................................................

到這裡,Alt+M開啟記憶體映象。

記憶體映象,專案 12
 地址=00401000     //對401000 Code段下記憶體訪問斷點,Shift+F9
 大小=00042000 (270336.)
 Owner=ASPACK   00400000
 區段=
 包含=code
 型別=Imag 01001002
 訪問=R
 初始訪問=RWE
......................................................................

來到了 pre-dip 的總呼叫點。

00442BA4    55              push ebp     //我們當前位置,Shift+F9慢慢往下執行。
00442BA5    8BEC            mov ebpesp
00442BA7    8B45 08         mov eaxdword ptr ss:[ebp+8]
00442BAA    A3 08494400     mov dword ptr ds:[444908], eax
00442BAF    5D              pop ebp
00442BB0    C2 0400         retn 4
00442BB3    90              nop
00442BB4    55              push ebp
00442BB5    8BEC            mov ebpesp
00442BB7    8B45 08         mov eaxdword ptr ss:[ebp+8]
00442BBA    A3 0C494400     mov dword ptr ds:[44490C], eax
00442BBF    5D              pop ebp
00442BC0    C2 0400         retn 4
00442BC3    90              nop
00442BC4    55              push ebp
00442BC5    8BEC            mov ebpesp
00442BC7    8B45 08         mov eaxdword ptr ss:[ebp+8]
00442BCA    A3 BC564400     mov dword ptr ds:[4456BC], eax  //地址4456bc有秘密。
00442BCF    5D              pop ebp
00442BD0    C2 0400         retn 4   //當它執行到這裡時。

堆疊內容

0012D71C   00D311EF  返回到 00D311EF 來自 ASPACK.00442BC4  
0012D720   00D49734  ASCII "SAC/UG2002!"
0012D724   0012FFE0  指標到下一個 SEH 記錄
0012D728   00D312CF  SE 控制程式碼
0012D72C   0012FF90
0012D730   00D20000
0012D734   00D00000
0012D738   00D306D4
0012D73C   00D49670
0012D740   00D49734  ASCII "SAC/UG2002!"  //這個是註冊使用者名稱。

於是我們 dd 4456BC

004456BC  00D49734  ASCII "SAC/UG2002!"  //這個地址就是我們存放自己名字的位置。

00442BD3    90              nop
00442BD4    55              push ebp
00442BD5    8BEC            mov ebpesp
00442BD7    8B45 08         mov eaxdword ptr ss:[ebp+8]
00442BDA    A3 00494400     mov dword ptr ds:[444900], eax   //剩餘日期
00442BDF    8B45 0C         mov eaxdword ptr ss:[ebp+C]
00442BE2    A3 04494400     mov dword ptr ds:[444904], eax  //總共日期
00442BE7    5D              pop ebp
00442BE8    C2 0800         retn 8  
00442BEB    90              nop
00442BEC    55              push ebp
00442BED    8BEC            mov ebpesp
00442BEF    B9 B8564400     mov ecx, ASPACK.004456B8
00442BF4    BA 20E94300     mov edx, ASPACK.0043E920
00442BF9    A1 30564400     mov eaxdword ptr ds:[445630]
00442BFE    E8 450EFEFF     call ASPACK.00423A48
00442C03    5D              pop ebp
00442C04    C3              retn
00442C05    8D40 00         lea eaxdword ptr ds:[eax]
00442C08    55              push ebp
00442C09    8BEC            mov ebpesp
00442C0B    6A 24           push 24
00442C0D    68 402C4400     push ASPACK.00442C40                     ; ASCII "Expired"
00442C12    68 482C4400     push ASPACK.00442C48                     ; ASCII "Sorry, but the evaluation period of ASPack has 

expired!
Would you like to register this program?"   //太君,你放心,我101年後註冊這個程式。
00442C17    6A 00           push 0
00442C19    E8 0A25FCFF     call ASPACK.00405128
00442C1E    83F8 06         cmp eax, 6
00442C21    75 1B           jnz short ASPACK.00442C3E
.............................................................................................

我們繼續Shift+F9 執行到Oep入口。

之前先檢查一下剛才發現的幾個關鍵點是否正確。

dd  444900

004448FC  0043DC8C  David.0043DC8C  //普通的Asprotect是這裡存放使用者地址。
00444900  0000001E   //沒註冊的顯示30天試用期
00444904  0000001E

004448FC  0043DC8C  ASPACK.0043DC8C
00444900  00000001   //註冊版這裡直接是1天也就是無限制日期,其實脫殼後根本不會比較這裡,日期限制就沒有了。
00444904  00000001 

dd 004456BC

004456BC  00D49734  ASCII "SAC/UG2002!"

00D49734  //這個地址是?殼中,名字也不是自己的。

在脫殼前先寫上名字,沒使用者名稱部分Asprotect程式脫殼後執行會出錯,或顯示沒有註冊,我們提前去掉這個暗樁。

於是我們到程式尾部空地 445fe4  寫上 Mr.David

修正

004456BC



00D49734



445fe4

這個是Od的基本功,不會很難學下去啊。

00442CE8    55              push ebp  //現在就可以DUMP了。
00442CE9    8BEC            mov ebpesp
00442CEB    83C4 F4         add esp, -0C
00442CEE    E8 D506FCFF     call ASPACK.004033C8
00442CF3    E8 941CFCFF     call ASPACK.0040498C
00442CF8    E8 A34FFCFF     call ASPACK.00407CA0
00442CFD    E8 1AC2FCFF     call ASPACK.0040EF1C
00442D02    E8 01C3FCFF     call ASPACK.0040F008
00442D07    E8 58E2FCFF     call ASPACK.00410F64
00442D0C    E8 2349FDFF     call ASPACK.00417634
00442D11    E8 CA16FEFF     call ASPACK.004243E0
00442D16    E8 6983FEFF     call ASPACK.0042B084
00442D1B    E8 5896FEFF     call ASPACK.0042C378
00442D20    E8 D796FEFF     call ASPACK.0042C3FC
00442D25    E8 42A2FEFF     call ASPACK.0042CF6C
00442D2A    E8 09A8FEFF     call ASPACK.0042D538
00442D2F    E8 6CB7FEFF     call ASPACK.0042E4A0
00442D34    E8 ABB7FEFF     call ASPACK.0042E4E4
00442D39    E8 36B8FEFF     call ASPACK.0042E574
00442D3E    E8 41DFFEFF     call ASPACK.00430C84
00442D43    E8 4CAFFFFF     call ASPACK.0043DC94
........................................................................

接著用Import REC 填入oep 42CE8,iat自動搜尋-獲得輸入資訊-顯示無效的,右鍵先用追蹤層次1修復大部分指標,剩下8個指標用Asprotect1.2X外掛修復。執行修復後的程式出錯,當然不可能這麼簡單了。所以接下來的工作就是尋找出錯的位置然後修復。用OD載入修復後

的程式,來到這裡。

00442D48  |.  A1 30564400   mov eaxdword ptr ds:[445630]
00442D4D  |.  E8 E60CFEFF   call dumped_.00423A38
00442D52  |.  BA 842D4400   mov edx, dumped_.00442D84                ;  ASCII "ASPack"
00442D57  |.  A1 30564400   mov eaxdword ptr ds:[445630]
00442D5C  |.  E8 F309FEFF   call dumped_.00423754
00442D61  |.  FF15 10494400 call dword ptr ds:[444910]  //這裡指向殼中。

跟蹤原程式到達相應位置,F7跟進。

00D2C9A0    833D A835D300 0>cmp dword ptr ds:[D335A8], 0
00D2C9A7    74 06           je short 00D2C9AF
00D2C9A9    FF15 A835D300   call dword ptr ds:[D335A8]               ; ASPACK.00442BEC  

00442BEC    55              push ebp
00442BED    8BEC            mov ebpesp
00442BEF    B9 B8564400     mov ecx, ASPACK.004456B8
00442BF4    BA 20E94300     mov edx, ASPACK.0043E920
00442BF9    A1 30564400     mov eaxdword ptr ds:[445630]  //原來是呼叫pre-dip的某處。
00442BFE    E8 450EFEFF     call ASPACK.00423A48
00442C03    5D              pop ebp
00442C04    C3              retn
.......................................................................

好,明白原理,採取對策。

dd 444910





00D2C9A0

修改為

00442BEC 

複製修改到程式裡,重啟動Od,F9執行出錯。

堆疊友好提示。

0012FDFC   0043F5E2  返回到 dumped_.0043F5E2 來自 00D2C8F8
0012FE00   0012FE54  指標到下一個 SEH 記錄
0012FE04   0043F8F4  SE 控制程式碼
0012FE08   0012FE4C
0012FE0C   005516A8
0012FE10   0043E920  dumped_.0043E920
..........................................................

於是我們去

0043F5DC   .  FF15 08494400 call dword ptr ds:[444908]
0043F5E2   .  E9 83000000   jmp dumped_.0043F66A
0043F5E7      BE            db BE
0043F5E8      46            db 46                                    ;  CHAR 'F'
0043F5E9      23            db 23                                    ;  CHAR '#'
0043F5EA      25            db 25                                    ;  CHAR '%'
0043F5EB      9B            db 9B
0043F5EC      3D            db 3D                                    ;  CHAR '='
0043F5ED      40            db 40                                    ;  CHAR '@'
0043F5EE      CB            db CB
0043F5EF      FC            db FC
0043F5F0      EF            db EF
0043F5F1      93            db 93
0043F5F2      C8            db C8
0043F5F3      0F            db 0F
0043F5F4      3C            db 3C                                    ;  CHAR '<'
0043F5F5      F2            db F2
0043F5F6      C5            db C5
0043F5F7      0B            db 0B
0043F5F8      24            db 24                                    ;  CHAR '$'
0043F5F9      0C            db 0C
...........................................................

右鍵清除分析。

0043F5DC    FF15 08494400   call dword ptr ds:[444908]  //訪問殼中,解碼。
0043F5E2    E9 83000000     jmp dumped_.0043F66A    //直接跳走,肯定有問題,我們脫過幾個Sdk殼也有了一點經驗了。
0043F5E7    BE 4623259B     mov esi, 9B252346
0043F5EC    3D 40CBFCEF     cmp eax, EFFCCB40
0043F5F1    93              xchg eaxebx
0043F5F2    C8 0F3CF2       enter 3C0F, 0F2
0043F5F6    C50B            lds ecx, fword ptr ds:[ebx]
0043F5F8    24 0C           and al, 0C
0043F5FA    A6              cmps byte ptr ds:[esi], byte ptr es:[edi>
0043F5FB    A9 69B22AAF     test eax, AF2AB269
0043F600    3AF8            cmp bhal
0043F602    6F              outs dxdword ptr es:[edi]
0043F603    52              push edx
0043F604    3113            xor dword ptr ds:[ebx], edx
0043F606    F4              hlt
0043F607    47              inc edi
0043F608    41              inc ecx
0043F609    17              pop ss
0043F60A    96              xchg eaxesi
0043F60B    F6              ???                                      ; 未知命令
0043F60C    8D8B F9436B80   lea ecxdword ptr ds:[ebx+806B43F9]
0043F612  ^ 7E E1           jle short dumped_.0043F5F5
0043F614    20F6            and dhdh
0043F616    04 14           add al, 14
0043F618    9A 5D661EE7 A9D>call far D8A9:E71E665D
0043F61F    79 24           jns short dumped_.0043F645
0043F621    294E 96         sub dword ptr ds:[esi-6A], ecx
0043F624    EF              out dxeax
0043F625    E8 5F8F6EBF     call BFB28589
...........................................................


0043F5DC    FF15 08494400   call dword ptr ds:[444908]  //訪問殼中,解碼。

我們將 444908 指向殼中的地址,簡單在程式中找一個retn地址給它,我找的是401234

於是 

dd 

444908

00444908  00D2C8F8   //訪問殼,改為401234
0044490C  00D2C924  //這個是解碼時另一處訪問殼,順手改為401234

儲存修改到檔案,重啟動OD來到0043F5DC

解碼當然看原程式了,當經過

0043F5DC   .  FF15 08494400 call dword ptr ds:[444908]



下面程式碼發生很大變化。

先點分析程式碼過濾掉花指令,免的二進位制複製有遺漏導致修復失敗。

0043F5E2   . /E9 01000000   jmp ASPACK.0043F5E8  //二進位制複製下面到第一個retn的所有程式碼,雖然有多的,但絕對安全,不會漏掉一個程式碼。
0043F5E7     |29            db 29                                    ;  CHAR ')'
0043F5E8   > 8B45 FC       mov eaxdword ptr ss:[ebp-4]
0043F5EB   .  8B80 E0010000 mov eaxdword ptr ds:[eax+1E0]
0043F5F1   .  8B40 44       mov eaxdword ptr ds:[eax+44]
0043F5F4   .  33D2          xor edxedx
0043F5F6   .  E8 2993FDFF   call ASPACK.00418924
0043F5FB   .  8D55 D4       lea edxdword ptr ss:[ebp-2C]
0043F5FE   .  A1 BC564400   mov eaxdword ptr ds:[4456BC]
0043F603   .  E8 586DFCFF   call ASPACK.00406360
0043F608   .  8B55 D4       mov edxdword ptr ss:[ebp-2C]
0043F60B   .  8B45 FC       mov eaxdword ptr ss:[ebp-4]
0043F60E   .  8B80 E0010000 mov eaxdword ptr ds:[eax+1E0]
0043F614   .  E8 073BFDFF   call ASPACK.00413120
0043F619   .  8B45 FC       mov eaxdword ptr ss:[ebp-4]
0043F61C   .  8B80 6C020000 mov eaxdword ptr ds:[eax+26C]
0043F622   .  E8 E53EFDFF   call ASPACK.0041350C
0043F627   .  B2 01         mov dl, 1
0043F629   .  8B45 FC       mov eaxdword ptr ss:[ebp-4]
0043F62C   .  8B80 7C020000 mov eaxdword ptr ds:[eax+27C]
0043F632   .  E8 513AFDFF   call ASPACK.00413088
0043F637   .  B2 01         mov dl, 1
0043F639   .  8B45 FC       mov eaxdword ptr ss:[ebp-4]
0043F63C   .  8B80 78020000 mov eaxdword ptr ds:[eax+278]
0043F642   .  E8 413AFDFF   call ASPACK.00413088
0043F647   .  B2 01         mov dl, 1
0043F649   .  8B45 FC       mov eaxdword ptr ss:[ebp-4]
0043F64C   .  8B80 EC020000 mov eaxdword ptr ds:[eax+2EC]
0043F652   .  E8 313AFDFF   call ASPACK.00413088
0043F657   .  8B45 FC       mov eaxdword ptr ss:[ebp-4]
0043F65A   .  8B80 E4020000 mov eaxdword ptr ds:[eax+2E4]
0043F660   .  C640 20 01    mov byte ptr ds:[eax+20], 1
0043F664   .  EB 04         jmp short ASPACK.0043F66A
0043F666   .  46            inc esi
0043F667   .  8CDD          mov bpds
0043F669   .  94            xchg eaxesp
0043F66A   >  FF15 0C494400 call dword ptr ds:[44490C]
0043F670   .  B2 01         mov dl, 1
0043F672   .  B8 10B14200   mov eax, ASPACK.0042B110
0043F677   .  E8 9CBBFEFF   call ASPACK.0042B218
0043F67C   .  8945 E0       mov dword ptr ss:[ebp-20], eax
0043F67F   .  33C0          xor eaxeax
0043F681   .  55            push ebp
0043F682   .  68 D6F64300   push ASPACK.0043F6D6
0043F687   .  64:FF30       push dword ptr fs:[eax]
0043F68A   .  64:8920       mov dword ptr fs:[eax], esp
0043F68D   .  B1 01         mov cl, 1
0043F68F   .  BA 68F94300   mov edx, ASPACK.0043F968                 ;  ASCII "SoftwareASPackOptions"
0043F694   .  8B45 E0       mov eaxdword ptr ss:[ebp-20]
0043F697   .  E8 54BDFEFF   call ASPACK.0042B3F0
0043F69C   .  8D4D D4       lea ecxdword ptr ss:[ebp-2C]
0043F69F   .  BA 88F94300   mov edx, ASPACK.0043F988                 ;  ASCII "Lang_LanguageFile"
0043F6A4   .  8B45 E0       mov eaxdword ptr ss:[ebp-20]
0043F6A7   .  E8 C0C0FEFF   call ASPACK.0042B76C
0043F6AC   .  8B55 D4       mov edxdword ptr ss:[ebp-2C]
0043F6AF   .  8B45 FC       mov eaxdword ptr ss:[ebp-4]
0043F6B2   .  8B80 E4010000 mov eaxdword ptr ds:[eax+1E4]
0043F6B8   .  83C0 20       add eax, 20
0043F6BB   .  E8 983EFCFF   call ASPACK.00403558
0043F6C0   .  33C0          xor eaxeax
0043F6C2   .  5A            pop edx
0043F6C3   .  59            pop ecx
0043F6C4   .  59            pop ecx
0043F6C5   .  64:8910       mov dword ptr fs:[eax], edx
0043F6C8   .  68 DDF64300   push ASPACK.0043F6DD
0043F6CD   >  8B45 E0       mov eaxdword ptr ss:[ebp-20]
0043F6D0   .  E8 0735FCFF   call ASPACK.00402BDC
0043F6D5   .  C3            retn       //到這裡為止。

........................................................................................

Btw:  這裡之所以解碼是我們匯入了正確的註冊檔案的結果,沒匯入註冊檔案時上面呼叫程式領空的Call根本不解碼,只是一個簡單的Retn返

回,然後jmp直接跳走或執行失敗。

然後二進位制貼上到

0043F5E2 



0043F6D5

之間,複製到程式裡,儲存重啟動。

呵呵,大功告成,自己的註冊名,功能完全正常,無任何限制。

請看

【破解總結】

我很忙,沒時間總結了,感謝你耐心看完。


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



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



相關文章