|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2004-02-09, 02:47 AM | #1 (permalink) |
榮譽會員
|
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 複製到程序,儲存文件,破解成功。 請看勝利截取影圖。 謹以本文獻給困惑中的脫友,如果對你有所說明 是我的心願。 -------------------------------------------------------------------------------- 【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝 |
送花文章: 3,
|
|
|
相似的主題 | ||||
主題 | 主題作者 | 討論區 | 回覆 | 最後發表 |
貓和老鼠」的較量 軟體破解大揭密 | psac | Hacker/Cracker 及加解密技術文件 | 2 | 2004-05-23 06:51 PM |