史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 程式 & 網頁設計技術文件
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2004-02-09, 02:47 AM   #1 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 Asprotect1.23 Rc4 之SynchroMagic脫殼修復+破解

【脫文作者】 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 bl, bl
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 edx, ecx
.....................................................................

程序異常。

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 bl, ch
00EB4531 02E8 add ch, al
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 eax, dword 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 eax, dword 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 bx, cx
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 edi, edi
00EC6399 66:B9 C526 mov cx, 26C5
00EC639D E9 10000000 jmp 00EC63B2

00EC63B2 8BF3 mov esi, ebx
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 ecx, di
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 cx, dx
00EC63F3 8AE8 mov ch, al
00EC63F5 81F0 68E86160 xor eax, 6061E868
00EC63FB E8 07000000 call 00EC6407

00EC6407 8AFD mov bh, ch
00EC6409 5B pop ebx
00EC640A 81F0 81D4EF06 xor eax, 6EFD481
00EC6410 8AFC mov bh, ah
00EC6412 81C0 26F9A223 add eax, 23A2F926
00EC6418 80C5 B6 add ch, 0B6
00EC641B 8BD9 mov ebx, ecx
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 ebx, si
00EC6468 |66:81D1 AC23 adc cx, 23AC
00EC646D \8AD8 mov bl, al
00EC646F 81CB F3B3043D or ebx, 3D04B3F3
00EC6475 5E pop esi
00EC6476 4F dec edi
00EC6477 8BF7 mov esi, edi
00EC6479 E8 0D000000 call 00EC648B

00EC648B 0FB7CB movzx ecx, bx
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 esi, eax
00EC64BA 8AF9 mov bh, cl
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 eax, ebx ; Synchro.00400000
00EC652E BB B1000000 mov ebx, 0B1
00EC6533 0BDB or ebx, ebx
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 eax, dword ptr ss:[ebp+4B00D2]
00EC654B 8D8D 69014B00 lea ecx, dword ptr ss:[ebp+4B0169]
00EC6551 03CB add ecx, ebx
00EC6553 8941 01 mov dword ptr ds:[ecx+1], eax
00EC6556 8D85 11014B00 lea eax, dword ptr ss:[ebp+4B0111]
00EC655C 8D8D D6004B00 lea ecx, dword ptr ss:[ebp+4B00D6]
00EC6562 8901 mov dword ptr ds:[ecx], eax
00EC6564 B8 58140000 mov eax, 1458
00EC6569 8D8D DB004B00 lea ecx, dword ptr ss:[ebp+4B00DB]
00EC656F 8901 mov dword ptr ds:[ecx], eax
00EC6571 8D8D 69014B00 lea ecx, dword ptr ss:[ebp+4B0169]
00EC6577 8D85 69134B00 lea eax, dword 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 ecx, eax
00EC8890 64:EB 02 jmp short 00EC8895

00EC8895 334C24 00 xor ecx, dword 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 ecx, dword 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 ebp, esp
00EC88D2 6A FF push -1
00EC88D4 68 A8384A00 push 4A38A8
00EC88D9 68 6CC54600 push 46C56C
00EC88DE 64:A1 00000000 mov eax, dword 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 esp, ebp
00EC8915 00C3 add bl, al
.......................................................................

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

00EC88CF 55 push ebp
00EC88D0 8BEC mov ebp, esp
00EC88D2 6A FF push -1
00EC88D4 68 A8384A00 push 4A38A8
00EC88D9 68 6CC54600 push 46C56C
00EC88DE 64:A1 00000000 mov eax, dword 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 edx, edx
00467785 8AD4 mov dl, ah
00467787 8915 04154C00 mov dword ptr ds:[4C1504], edx
0046778D 8BC8 mov ecx, eax
0046778F 81E1 FF000000 and ecx, 0FF
00467795 890D 00154C00 mov dword ptr ds:[4C1500], ecx
0046779B C1E1 08 shl ecx, 8
0046779E 03CA add ecx, edx
.......................................................................

補好程式碼結果。

00467757 55 push ebp
00467758 8BEC mov ebp, esp
0046775A 6A FF push -1
0046775C 68 A8384A00 push Synchro.004A38A8
00467761 68 6CC54600 push Synchro.0046C56C
00467766 64:A1 00000000 mov eax, dword 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 edx, edx
00467785 8AD4 mov dl, ah
00467787 8915 04154C00 mov dword ptr ds:[4C1504], edx
0046778D 8BC8 mov ecx, eax
0046778F 81E1 FF000000 and ecx, 0FF
00467795 890D 00154C00 mov dword ptr ds:[4C1500], ecx
0046779B C1E1 08 shl ecx, 8
0046779E 03CA add ecx, edx
.......................................................................

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 edi, dword ptr ds:[4B7100]
004012E8 . 83C9 FF or ecx, FFFFFFFF
004012EB . 33C0 xor eax, eax
004012ED . F2:AE repne scas byte ptr es:[edi] //程序在這裡異常。
004012EF . F7D1 not ecx
004012F1 . 49 dec ecx
004012F2 . 8D4409 02 lea eax, dword 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 edi, dword ptr ds:[4B7100] //這裡將殼中位址給edi,點一下這句,看信息視窗提示。
004012E8 . 83C9 FF or ecx, FFFFFFFF
004012EB . 33C0 xor eax, eax
004012ED . F2:AE repne scas byte ptr es:[edi] //程序在這裡異常。
004012EF . F7D1 not ecx
004012F1 . 49 dec ecx
004012F2 . 8D4409 02 lea eax, dword 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

複製到程序,儲存文件,破解成功。

請看勝利截取影圖。



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


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

【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
貓和老鼠」的較量 軟體破解大揭密 psac Hacker/Cracker 及加解密技術文件 2 2004-05-23 06:51 PM


所有時間均為台北時間。現在的時間是 07:01 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1