AntiSpy PRO 1.02 註冊演算法分析 + 序號產生器原始碼(tc2) (12千字)

看雪資料發表於2003-04-11

AntiSpy PRO 1.02 註冊演算法分析 + 序號產生器原始碼(tc2)

破解目標:AntiSpy PRO 1.02
官方主頁:http://www.antispypro.com/
軟體簡介:AntiSpy 可以幫你清除Cookies、瀏覽網站紀錄、網路快取檔案、Windows作業系統中的開啟程式紀錄、最近開啟檔案。
下載地址:http://www.antispypro.com/antispy/antispypro.exe

使用工具:PEiD 0.8、W32Dasm、Ollydbg 1.09b 漢化版、Windows 自帶的計算器、32bit Calculator 1.6 by cybult、UltraEdit

作者:炎之川[BCG]
時間:2003.4.10
主頁:http://skipli.yeah.net/

宣告: 此文僅用於學習及交流,若要轉載請保持文章完整。



經 PEiD 0.8 檢查可知,AntiSpy PRO 的主程式為 VC++ 6.0 編寫且無殼,W32Dasm 反彙編,一時似乎看不出什麼東西,所以直接用 OD 裝入程式。載入完成後,在 CPU 視窗中右擊,選擇“搜尋”->“字串參考”,然後在出現的視窗中搜尋到了軟體註冊出錯的提示,雙擊之,進入對應的程式碼區。

稍作分析後,在 4157C2 處下斷點,然後 Ctrl+F2 重新載入程式,F9 執行,輸入註冊名及假註冊碼:
Name: lovefire[BCG]
Serial: 78787878

(; 後是 Ollydbg 所分析的內容,// 後是我加的註釋,文中數值均為16進位制值)

004157C2  . 68 D8B34500    PUSH AntiSpyP.0045B3D8                  ;  SE handler installation  //下斷點
004157C7  . 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
004157CD  . 50            PUSH EAX
004157CE  . 64:8925 000000>MOV DWORD PTR FS:[0],ESP
004157D5  . 83EC 0C        SUB ESP,0C
004157D8  . 56            PUSH ESI
004157D9  . 8BF1          MOV ESI,ECX
004157DB  . E8 E7080400    CALL AntiSpyP.004560C7
004157E0  . 8B48 04        MOV ECX,DWORD PTR DS:[EAX+4]
004157E3  . E8 BB320300    CALL AntiSpyP.00448AA3
004157E8  . A1 34744700    MOV EAX,DWORD PTR DS:[477434]
004157ED  . C74424 18 0000>MOV DWORD PTR SS:[ESP+18],0
004157F5  . 894424 08      MOV DWORD PTR SS:[ESP+8],EAX
004157F9  . 894424 04      MOV DWORD PTR SS:[ESP+4],EAX
004157FD  . 8D4424 08      LEA EAX,DWORD PTR SS:[ESP+8]
00415801  . 8D8E 88010000  LEA ECX,DWORD PTR DS:[ESI+188]
00415807  . 50            PUSH EAX
00415808  . C64424 1C 02  MOV BYTE PTR SS:[ESP+1C],2
0041580D  . E8 914D0300    CALL AntiSpyP.0044A5A3
00415812  . 8D4C24 04      LEA ECX,DWORD PTR SS:[ESP+4]
00415816  . 51            PUSH ECX
00415817  . 8D8E 98000000  LEA ECX,DWORD PTR DS:[ESI+98]
0041581D  . E8 814D0300    CALL AntiSpyP.0044A5A3
00415822  . 8B5424 08      MOV EDX,DWORD PTR SS:[ESP+8]  //假碼放入edx
00415826  . 8B4424 04      MOV EAX,DWORD PTR SS:[ESP+4]  //註冊名放入eax
0041582A  . 52            PUSH EDX  //edx 入棧
0041582B  . 50            PUSH EAX  //eax 入帳
0041582C  . E8 4F010000    CALL AntiSpyP.00415980  //關鍵 call!F7 跟進
00415831  . 83C4 08        ADD ESP,8
00415834  . 84C0          TEST AL,AL  //呵呵,經典的比較
00415836  . 74 7D          JE SHORT AntiSpyP.004158B5  //跳轉的話就886啦~~
00415838  . 6A 00          PUSH 0                                  ; /Arg3 = 00000000
0041583A  . 6A 40          PUSH 40                                  ; |Arg2 = 00000040
0041583C  . 68 285C4700    PUSH AntiSpyP.00475C28                  ; |Arg1 = 00475C28 ASCII "Registration Successful!"  //不跳則註冊成功
00415841  . E8 289C0300    CALL AntiSpyP.0044F46E                  ; \AntiSpyP.0044F46E
00415846  . 51            PUSH ECX
00415847  . 8D5424 08      LEA EDX,DWORD PTR SS:[ESP+8]
0041584B  . 8BCC          MOV ECX,ESP
0041584D  . 896424 10      MOV DWORD PTR SS:[ESP+10],ESP
00415851  . 52            PUSH EDX
00415852  . E8 D2190300    CALL AntiSpyP.00447229
00415857  . 8D4424 10      LEA EAX,DWORD PTR SS:[ESP+10]
0041585B  . B9 289C4700    MOV ECX,AntiSpyP.00479C28
00415860  . 50            PUSH EAX
00415861  . E8 CAFEFEFF    CALL AntiSpyP.00405730
00415866  . 8D4C24 0C      LEA ECX,DWORD PTR SS:[ESP+C]
0041586A  . E8 451C0300    CALL AntiSpyP.004474B4
0041586F  . 51            PUSH ECX
00415870  . 8D5424 0C      LEA EDX,DWORD PTR SS:[ESP+C]
00415874  . 8BCC          MOV ECX,ESP
00415876  . 896424 10      MOV DWORD PTR SS:[ESP+10],ESP
0041587A  . 52            PUSH EDX
0041587B  . E8 A9190300    CALL AntiSpyP.00447229
00415880  . 8D4424 10      LEA EAX,DWORD PTR SS:[ESP+10]
00415884  . B9 089C4700    MOV ECX,AntiSpyP.00479C08
00415889  . 50            PUSH EAX
0041588A  . E8 A1FEFEFF    CALL AntiSpyP.00405730
0041588F  . 8D4C24 0C      LEA ECX,DWORD PTR SS:[ESP+C]
00415893  . E8 1C1C0300    CALL AntiSpyP.004474B4
00415898  . B9 289C4700    MOV ECX,AntiSpyP.00479C28
0041589D  . E8 1E000100    CALL AntiSpyP.004258C0
004158A2  . B9 089C4700    MOV ECX,AntiSpyP.00479C08
004158A7  . E8 14000100    CALL AntiSpyP.004258C0
004158AC  . 8BCE          MOV ECX,ESI
004158AE  . E8 C93C0300    CALL AntiSpyP.0044957C
004158B3  . EB 1F          JMP SHORT AntiSpyP.004158D4
004158B5  > 6A 44          PUSH 44
004158B7  . 68 64564700    PUSH AntiSpyP.00475664                  ;  ASCII "AntiSpy PRO"
004158BC  . 68 5C5B4700    PUSH AntiSpyP.00475B5C                  ;  ASCII "If you haven't ordered this software yet, please press "yes" to get registration number.
If you already have registration number - please press "no" and verify that you entered it correctly and try again"  //註冊失敗
004158C1  . 8BCE          MOV ECX,ESI
004158C3  . E8 C15A0300    CALL AntiSpyP.0044B389
004158C8  . 83F8 06        CMP EAX,6
004158CB  . 75 07          JNZ SHORT AntiSpyP.004158D4
004158CD  . 8BCE          MOV ECX,ESI
004158CF  . E8 4C000000    CALL AntiSpyP.00415920
004158D4  > 8D4C24 04      LEA ECX,DWORD PTR SS:[ESP+4]
004158D8  . C64424 18 01  MOV BYTE PTR SS:[ESP+18],1
004158DD  . E8 D21B0300    CALL AntiSpyP.004474B4
004158E2  . 8D4C24 08      LEA ECX,DWORD PTR SS:[ESP+8]
004158E6  . C64424 18 00  MOV BYTE PTR SS:[ESP+18],0
004158EB  . E8 C41B0300    CALL AntiSpyP.004474B4
004158F0  . C74424 18 FFFF>MOV DWORD PTR SS:[ESP+18],-1
004158F8  . E8 CA070400    CALL AntiSpyP.004560C7
004158FD  . 8B48 04        MOV ECX,DWORD PTR DS:[EAX+4]
00415900  . E8 B3310300    CALL AntiSpyP.00448AB8
00415905  . 8B4C24 10      MOV ECX,DWORD PTR SS:[ESP+10]
00415909  . 5E            POP ESI
0041590A  . 64:890D 000000>MOV DWORD PTR FS:[0],ECX
00415911  . 83C4 18        ADD ESP,18
00415914  . C3            RETN


-----------------------------------------------------------------------------
進入 41582C 的關鍵 call:

00415980  /$ 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00415986  |. 6A FF          PUSH -1
00415988  |. 68 F8B34500    PUSH AntiSpyP.0045B3F8
0041598D  |. 50            PUSH EAX
0041598E  |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP
00415995  |. 53            PUSH EBX
00415996  |. 56            PUSH ESI
00415997  |. 57            PUSH EDI
00415998  |. 8B7C24 1C      MOV EDI,DWORD PTR SS:[ESP+1C]  //註冊名放入edi
0041599C  |. B9 D0A54A27    MOV ECX,274AA5D0  //ecx 賦值為 274AA5D0
004159A1  |. 8A07          MOV AL,BYTE PTR DS:[EDI//取 edi 中的字元
004159A3  |. 84C0          TEST AL,AL  //比較是否為0(這裡估計是判斷有沒有輸入註冊名)
004159A5  |. 74 1E          JE SHORT AntiSpyP.004159C5  //為0則跳,這裡一定不能跳轉…

//計算開始
004159A7  |> 0FBEF0        /MOVSX ESI,AL  //al 送 esi,al 中是註冊名
004159AA  |. 8BC6          |MOV EAX,ESI  //esi 送 eax,註冊名字元送回 eax
004159AC  |. BB 11000000    |MOV EBX,11  //ebx=11
004159B1  |. 99            |CDQ  //edx雙字擴充套件(清零)
004159B2  |. F7FB          |IDIV EBX  //eax=eax/11,餘數放入 edx
004159B4  |. 8BC1          |MOV EAX,ECX  //eax = ecx,第一次ecx 為迴圈前賦的值 274AA5D0,第二次開始為上一次累積的值
004159B6  |. 8BCA          |MOV ECX,EDX  //ecx=edx,edx 為上面除法運算的餘數
004159B8  |. D3E0          |SHL EAX,CL  //邏輯左移cl位,cl 為上面除法運算的餘數,等於 cl 次 *2 運算
004159BA  |. 33C6          |XOR EAX,ESI  //eax 異或 esi,esi 為註冊名字元的 ASCII 值
004159BC  |. 47            |INC EDI  //edi+1,edi中是註冊名,所以這是為了下面取下一位的註冊名字元作準備
004159BD  |. 8BC8          |MOV ECX,EAX  //eax的值放入ecx,留待下次迴圈使用
004159BF  |. 8A07          |MOV AL,BYTE PTR DS:[EDI//從 edi 中取下一位註冊名的字元
004159C1  |. 84C0          |TEST AL,AL  //比較 al 是否為0
004159C3  |.^75 E2          \JNZ SHORT AntiSpyP.004159A7  //不為0就跳回去繼續迴圈。當取完註冊名字元後的下一次迴圈時al將為0,故此時才不再迴圈
//演算法結束
//所有迴圈完成後,eax 中儲存的就是真正的註冊碼。

004159C5  |> 8B15 34744700  MOV EDX,DWORD PTR DS:[477434]            ;  AntiSpyP.00477448
004159CB  |. 895424 1C      MOV DWORD PTR SS:[ESP+1C],EDX
004159CF  |. 51            PUSH ECX
004159D0  |. 8D4424 20      LEA EAX,DWORD PTR SS:[ESP+20]
004159D4  |. 68 805C4700    PUSH AntiSpyP.00475C80                  ;  ASCII "%08X"
004159D9  |. 50            PUSH EAX
004159DA  |. C74424 20 0000>MOV DWORD PTR SS:[ESP+20],0
004159E2  |. E8 FAF60200    CALL AntiSpyP.004450E1
004159E7  |. 8B4C24 2C      MOV ECX,DWORD PTR SS:[ESP+2C]            ; |  //假碼放入 ecx
004159EB  |. 8B5424 28      MOV EDX,DWORD PTR SS:[ESP+28]            ; |  //真碼放入 edx
004159EF  |. 51            PUSH ECX                                ; |Arg2
004159F0  |. 52            PUSH EDX                                ; |Arg1
004159F1  |. E8 DC120200    CALL AntiSpyP.00436CD2                  ; \AntiSpyP.00436CD2  //比較真假註冊碼
004159F6  |. 83C4 14        ADD ESP,14
004159F9  |. 8D4C24 1C      LEA ECX,DWORD PTR SS:[ESP+1C]
004159FD  |. 85C0          TEST EAX,EAX
004159FF  |. 0F94C3        SETE BL
00415A02  |. C74424 14 FFFF>MOV DWORD PTR SS:[ESP+14],-1
00415A0A  |. E8 A51A0300    CALL AntiSpyP.004474B4
00415A0F  |. 8B4C24 0C      MOV ECX,DWORD PTR SS:[ESP+C]
00415A13  |. 5F            POP EDI
00415A14  |. 8AC3          MOV AL,BL
00415A16  |. 5E            POP ESI
00415A17  |. 64:890D 000000>MOV DWORD PTR FS:[0],ECX
00415A1E  |. 5B            POP EBX
00415A1F  |. 83C4 0C        ADD ESP,0C
00415A22  \. C3            RETN



演算法總結如下:
設註冊名位數為n,即有效迴圈也為n次,存在 N0、N1、N2、N3、N4、N5…其中 N0=274AA5D0,則:
N(n)=(N(n-1) shl ((註冊名ASCII) mod 11)) xor (註冊名ASCII)
最後的 N(n) 就是註冊碼

試按照我輸入的註冊名“lovefire[BCG]”,列舉如下,
第一位註冊名“l”,N(1)=(274AA5D0 shl ((6C) mod 11)) xor 6C = (274AA5D0 shl 6) xor 6C = D2A97400 xor 6C = D2A9746C
第二位註冊名“o”,N(2)=(D2A9746C shl ((6F) mod 11)) xor 6F = (D2A9746C shl 9) xor 6F = 52E8D800 xor 6F = 52E8D86F
……
最後一位註冊名“]”,N(12)=(0210025F shl ((5D) mod 11)) xor 5D = (D2A9746C shl 8) xor 5D = 10025F00 xor 5D = 10025F5D
所以得出正確的註冊碼:10025F5D


至此 AntiSpy PRO 1.02 演算法分析完成,一組可用的註冊碼:Name: lovefire[BCG]  Serial: 10025F5D

註冊資訊儲存:
[HKEY_LOCAL_MACHINE\SOFTWARE\HT\AntiSpyPRO]
"strRegNum"="10025F5D"
"strUserName"="lovefire[BCG]"

----------------------------------------------------------
序號產生器原始碼(TC 2.0)

/* KeyGen by 炎之川[BCG],2003.4.11 */
/* 感謝hoto兄、菩提兄、小樓兄回答我提的弱智問題^^ */

#include <stdio.h>
main()
{
        char name[255];
        int name_len,i;
        unsigned long sn1=0x274AA5D0;
        clrscr();  /*非tc的C編譯程式可能不能識別此指令*/
        printf("    _/_/_/      _/_/_/    _/_/_/\n  _/    _/  _/        _/\n  _/_/_/    _/        _/  _/_/\n _/    _/  _/        _/    _/\n_/_/_/      _/_/_/    _/_/_/\n\n -= AntiSpy PRO 1.02 KeyGen by lovefire[BCG] =-\n\n\nPlease enter your name: ");
        gets(name);
        name_len=strlen(name);
        if (name_len>0)
        {
                for (i=0;i<name_len;i++)
                {
                        sn1=(sn1<<(name[i]%0x11))^name[i];
                }
                printf("\nok, try this serial: %08lX\n",sn1);
                printf("\n\nNOTE: serial only for test!");
                printf("\nIf you like it, buy it to support the soft's author!");
        }
        else
        {
                printf("\nI think you should tell me your name first ;)\n");
        }
        printf("\n\nhave fun^^\nwelcome to http://skipli.yeah.net/");
        getch();
}

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

炎之川
屬於中國破解組織BCG(Beginner's Cracking Group)

    _/_/_/      _/_/_/    _/_/_/
  _/    _/  _/        _/
  _/_/_/    _/        _/  _/_/
_/    _/  _/        _/    _/
_/_/_/      _/_/_/    _/_/_/

相關文章