找尋3DMark2001se的註冊碼,第一篇破文!

看雪資料發表於2003-06-29

開刀物件:3DMark 2001 SE Build 330版For Win9x/ME/2000/XP(2002年6月17日釋出)Madonion的3D Mark系列測試軟體憑籍著亮麗的畫面和動感的音樂兩大法寶,已經成為了標準測試軟體,且深受大家的喜愛。簡便的操作,直觀的結果,與3D Winbench相比,3D Mark確實更能打動我們這些普通玩家。新版本里更加入了對DirectX 9.0、AGP 3.0 (AGP 8x)、日文和韓文作業系統、新型號的硬體產品(主要在圖形晶片方面)的支援,修正了上個版本的一些BUG。

目的:練手,該軟體在不註冊的情況一樣可以正常使用,註冊後增加網上服務功能!

下載地址:http://file.mydrivers.com/tools/tweak/3DMark2001SE.exe

使用工具:PEid, W32Dasm, Ollydbg1.09

使用平臺:Windows XP SP1

難度:比較簡單

過程:

1、用PEid檢查3dmark2001se.exe,發現是用VC++6.0編寫,無殼。

2、採用靜態分析的方法,看是否能找到有助破解的字串。用W32Dasm開啟3dmark2001se.exe,由於檔案體積比較大,分析的時間較長。分析完畢後,在“字串參考”中找到三條十分有用的資訊。一條是恭喜成功註冊云云,另外兩條是一樣的,當然是說註冊碼不正確了。雙擊其中一條,在其彙編附近沒發現明顯的註冊碼判斷語句,雙擊另外一條,到達如下地方:

* Reference To: MFC42.Ordinal:18BE,  Ord:18BEh

00440598   .  E87DE71F00    CALL    0063ED1A
0044059D   .  8BB5A0000000  MOV     ESI, DWORD PTR [EBP+000000A0]
004405A3   .  8B46F8        MOV     EAX, DWORD PTR [ESI-08]
004405A6   .  85C0          TEST    EAX, EAX
004405A8   .  751F          JNZ     004405C9
004405AA   .  50            PUSH    EAX

* Possible Reference to String Resource ID=61600: "Incorrect registration information.Please enter the correc"

004405AB   .  68A0F00000    PUSH    0000F0A0
004405B0   .  8BCB          MOV     ECX, EBX
004405B2   .  E8 2945FCFF   CALL    00404AE0
004405B7   .  5E            POP     ESI
004405B8   .  5D            POP     EBP
004405B9   .  5B            POP     EBX
004405BA   .  8B4C24 34     MOV     ECX, DWORD PTR [ESP+34]
004405BE   .  64:890D 00000>MOV     DWORD PTR FS:[00000000], ECX
004405C5   .  83C4 40       ADD     ESP, 00000040
004405C8   .  C3            RET

在00440598處有一個Call,後面有一個Test和JNZ,很經典的判斷註冊碼正確與否的格式。在這裡下斷點吧!

3、用Ollydbg開啟3dmark2001se.exe後,點Register,使用者名稱:Hartnett,試驗碼:1234567890(隨便輸的)。然後在執行模組中轉到3dmark2001se.exe領空,在00440598處下斷點。在3dmark中點OK後,程式被斷下。第一遍用F8粗跟,大致分析一遍後用F7+F8,到如下地方:

00610C10   .  6A FF         PUSH    -1
00610C12   .  68 D4FA7400   PUSH    3DMark20.0074FAD4                ;  SE handler installation
00610C17   .  64:A1 0000000>MOV     EAX, DWORD PTR FS:[0]
00610C1D   .  50            PUSH    EAX
00610C1E   .  64:8925 00000>MOV     DWORD PTR FS:[0], ESP
00610C25   .  83EC 24       SUB     ESP, 24
00610C28   .  53            PUSH    EBX
00610C29   .  56            PUSH    ESI
00610C2A   .  8B7424 40     MOV     ESI, DWORD PTR SS:[ESP+40]
00610C2E   .  57            PUSH    EDI
00610C2F   .  8B7E 08       MOV     EDI, DWORD PTR DS:[ESI+8]
00610C32   .  33DB          XOR     EBX, EBX
00610C34   .  83FF 17       CMP     EDI, 17          在此判斷註冊碼是否23位。
00610C37   .  895C24 0C     MOV     DWORD PTR SS:[ESP+C], EBX
00610C3B   .  0F85 5A010000 JNZ     3DMark20.00610D9B    不是23位的話跳走(爆破點)
00610C41   .  8B46 04       MOV     EAX, DWORD PTR DS:[ESI+4]
00610C44   .  3BC3          CMP     EAX, EBX
00610C46   .  8B15 5CF77500 MOV     EDX, DWORD PTR DS:[<&MSVCP60.?_C>;  MSVCP60.?_C@?1??_Nullstr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@CAPBDXZ@4DB
00610C4C   .  8BCA          MOV     ECX, EDX
00610C4E   .  74 03         JE      SHORT 3DMark20.00610C53
00610C50   .  8D48 05       LEA     ECX, DWORD PTR DS:[EAX+5]
00610C53   >  8039 2D       CMP     BYTE PTR DS:[ECX], 2D    第六個字元是否是“-”
00610C56   .  0F85 3F010000 JNZ     3DMark20.00610D9B      不是的話註冊失敗
00610C5C   .  3BC3          CMP     EAX, EBX
00610C5E   .  8BCA          MOV     ECX, EDX
00610C60   .  74 03         JE      SHORT 3DMark20.00610C65
00610C62   .  8D48 0B       LEA     ECX, DWORD PTR DS:[EAX+B]
00610C65   >  8039 2D       CMP     BYTE PTR DS:[ECX], 2D   第十二個字元是否是“-”
00610C68   .  0F85 2D010000 JNZ     3DMark20.00610D9B     不是的話註冊失敗
00610C6E   .  3BC3          CMP     EAX, EBX
00610C70   .  75 04         JNZ     SHORT 3DMark20.00610C76
00610C72   .  8BC2          MOV     EAX, EDX
00610C74   .  EB 03         JMP     SHORT 3DMark20.00610C79
00610C76   >  83C0 11       ADD     EAX, 11
00610C79   >  8038 2D       CMP     BYTE PTR DS:[EAX], 2D   第十八個字元是否是“-”
00610C7C   .  0F85 19010000 JNZ     3DMark20.00610D9B     從這裡知道,註冊碼採用
00610C82   .  6A 05         PUSH    5          xxxxx-xxxxx-xxxxx-xxxxx的格式
00610C84   .  53            PUSH    EBX
00610C85   .  8D4424 18     LEA     EAX, DWORD PTR SS:[ESP+18]
00610C89   .  50            PUSH    EAX
00610C8A   .  8BCE          MOV     ECX, ESI
........

於是在00610C8A處下一斷點,按F9換到3dmark2001se下,重新輸入註冊試驗碼:12345-67890-12345-67890。點OK後按F9直到00610C8A,跟著程式走一遍,會輕而易舉地發現下面的程式把註冊試驗碼中間的“-”去掉,成為12345678901234567890的形式。由於Ollydbg的跟蹤結果會隨時顯示在暫存器對話方塊中,我們可以非常清楚地看到轉換後的註冊碼,同時,我們也可以從函式名稱上大致知道這個函式是做什麼的,這裡就不再具體分析了。繼續跟到如下程式碼處:

00611211  |>  8B46 04       /MOV     EAX, DWORD PTR DS:[ESI+4]
00611214  |.  85C0          |TEST    EAX, EAX
00611216  |.  75 07         |JNZ     SHORT 3DMark20.0061121F
00611218  |.  A1 5CF77500   |MOV     EAX, DWORD PTR DS:[<&MSVCP60.?_C@>
0061121D  |.  EB 02         |JMP     SHORT 3DMark20.00611221
0061121F  |>  03C2          |ADD     EAX, EDX
00611221  |>  8B4C24 1C     |MOV     ECX, DWORD PTR SS:[ESP+1C]
00611225  |.  8B71 08       |MOV     ESI, DWORD PTR DS:[ECX+8]
00611228  |.  85F6          |TEST    ESI, ESI
0061122A  |.  8A00          |MOV     AL, BYTE PTR DS:[EAX]
0061122C  |.  884424 13     |MOV     BYTE PTR SS:[ESP+13], AL
00611230  |.  76 3E         |JBE     SHORT 3DMark20.00611270
00611232  |.  83FE 01       |CMP     ESI, 1
00611235  |.  72 39         |JB      SHORT 3DMark20.00611270
00611237  |.  8B79 04       |MOV     EDI, DWORD PTR DS:[ECX+4]
0061123A  |.  0FBEE8        |MOVSX   EBP, AL
0061123D  |.  56            |PUSH    ESI
0061123E  |.  55            |PUSH    EBP
0061123F  |.  57            |PUSH    EDI
00611240  |.  FFD3          |CALL    EBX                               ;  msvcrt.memchr
00611242  |.  83C4 0C       |ADD     ESP, 0C
00611245  |.  85C0          |TEST    EAX, EAX
00611247  |.  74 1F         |JE      SHORT 3DMark20.00611268
00611249  |>  8A10          |/MOV     DL, BYTE PTR DS:[EAX]
0061124B  |.  8D4C24 13     ||LEA     ECX, DWORD PTR SS:[ESP+13]
0061124F  |.  3A11          ||CMP     DL, BYTE PTR DS:[ECX]
00611251  |.  74 36         ||JE      SHORT 3DMark20.00611289
00611253  |.  2BF8          ||SUB     EDI, EAX
00611255  |.  8D743E FF     ||LEA     ESI, DWORD PTR DS:[ESI+EDI-1]
00611259  |.  56            ||PUSH    ESI
0061125A  |.  8D78 01       ||LEA     EDI, DWORD PTR DS:[EAX+1]
0061125D  |.  55            ||PUSH    EBP
0061125E  |.  57            ||PUSH    EDI
0061125F  |.  FFD3          ||CALL    EBX      這個Call把輸入的註冊碼換個形式。
00611261  |.  83C4 0C       ||ADD     ESP, 0C
00611264  |.  85C0          ||TEST    EAX, EAX
00611266  |.^ 75 E1         |\JNZ     SHORT 3DMark20.00611249
00611268  |>  8B5424 14     |MOV     EDX, DWORD PTR SS:[ESP+14]
0061126C  |.  8B7C24 24     |MOV     EDI, DWORD PTR SS:[ESP+24]
00611270  |>  A1 E8F67500   |MOV     EAX, DWORD PTR DS:[<&MSVCP60.?npo>
00611275  |.  8B00          |MOV     EAX, DWORD PTR DS:[EAX]
00611277  |>  8B0D E8F67500 |MOV     ECX, DWORD PTR DS:[<&MSVCP60.?npo>;  MSVCP60.?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB
0061127D  |.  3B01          |CMP     EAX, DWORD PTR DS:[ECX]
0061127F  |.  74 1B         |JE      SHORT 3DMark20.0061129C
00611281  |.  8B4F 04       |MOV     ECX, DWORD PTR DS:[EDI+4]
00611284  |.  890491        |MOV     DWORD PTR DS:[ECX+EDX*4], EAX 轉換後的註冊碼儲存
00611287  |.  EB 22         |JMP     SHORT 3DMark20.006112AB
00611289  |>  8B4C24 1C     |MOV     ECX, DWORD PTR SS:[ESP+1C]
0061128D  |.  8B51 04       |MOV     EDX, DWORD PTR DS:[ECX+4]
00611290  |.  8B7C24 24     |MOV     EDI, DWORD PTR SS:[ESP+24]
00611294  |.  2BC2          |SUB     EAX, EDX
00611296  |.  8B5424 14     |MOV     EDX, DWORD PTR SS:[ESP+14]
0061129A  |.^ EB DB         |JMP     SHORT 3DMark20.00611277
0061129C  |>  8B47 04       |MOV     EAX, DWORD PTR DS:[EDI+4]
0061129F  |.  C70490 FFFFFF>|MOV     DWORD PTR DS:[EAX+EDX*4], -1
006112A6  |.  C64424 12 00  |MOV     BYTE PTR SS:[ESP+12], 0
006112AB  |>  8B7424 20     |MOV     ESI, DWORD PTR SS:[ESP+20]
006112AF  |.  8B46 08       |MOV     EAX, DWORD PTR DS:[ESI+8]
006112B2  |.  42            |INC     EDX             迴圈次數加1
006112B3  |.  3BD0          |CMP     EDX, EAX
006112B5  |.  895424 14     |MOV     DWORD PTR SS:[ESP+14], EDX  迴圈20次,註冊碼位數
006112B9  |.^ 0F82 52FFFFFF \JB      3DMark20.00611211

上面的程式將把註冊碼轉換成另一種形式。這裡要注意比較原碼和轉換碼,發現其中的一一對應關係,以方便後面找到真正的註冊碼。由於我們所用的試驗碼排列有序,可以清楚地看到這種對應關係,即:1->18;2->19;3->1A;4->1B;5->1C;6->1D;7->1E;8->1F;9->20;0->17。那字母呢?也很簡單,如果你不想費腦筋把Call EBX弄清楚的話,可直接把試驗碼換成ABCDE-FGHIJ-KLMNO-PQRST,然後看看轉換後的結果就行了。結果是A->00;B->01;C->03;D->04;......還有一點要說明一下的是轉換後的註冊碼是以DWord形式儲存的,也就是說,我們的試驗碼轉換成:
             18 00 00 00 19 00 00 00 1A 00 00 00 1B 00 00 00
             1C 00 00 00 1D 00 00 00 1E 00 00 00 1F 00 00 00
             20 00 00 00 17 00 00 00 18 00 00 00 19 00 00 00
             1A 00 00 00 1B 00 00 00 1C 00 00 00 1D 00 00 00
             1E 00 00 00 1F 00 00 00 20 00 00 00 17 00 00 00

繼續跟程式,到達如下關鍵地方:

0061079A   >  8B4C24 14     MOV     ECX, DWORD PTR SS:[ESP+14] 註冊碼的判斷以5位為單位
0061079E   .  8B51 08       MOV     EDX, DWORD PTR DS:[ECX+8]
006107A1   .  8B41 0C       MOV     EAX, DWORD PTR DS:[ECX+C]
006107A4   .  8B69 04       MOV     EBP, DWORD PTR DS:[ECX+4]
006107A7   .  8B7424 28     MOV     ESI, DWORD PTR SS:[ESP+28]  ESI賦值21
006107AB   .  03C2          ADD     EAX, EDX
006107AD   .  8B11          MOV     EDX, DWORD PTR DS:[ECX]
006107AF   .  03C5          ADD     EAX, EBP
006107B1   .  03C2          ADD     EAX, EDX           將前4個數字累加
006107B3   .  33D2          XOR     EDX, EDX           EDX清零
006107B5   .  F7F6          DIV     ESI             累加值除以21
006107B7   .  8B59 10       MOV     EBX, DWORD PTR DS:[ECX+10]  將第5位送入EBX
006107BA   .  3BDA          CMP     EBX, EDX           EBX與餘數比較
006107BC   .  0F85 10010000 JNZ     3DMark20.006108D2     不相等的話玩完(爆破點)
006107C2   .  8B51 1C       MOV     EDX, DWORD PTR DS:[ECX+1C]  繼續比較下5位
006107C5   .  8B41 20       MOV     EAX, DWORD PTR DS:[ECX+20]
006107C8   .  8B59 18       MOV     EBX, DWORD PTR DS:[ECX+18]
006107CB   .  03C2          ADD     EAX, EDX
006107CD   .  8B51 14       MOV     EDX, DWORD PTR DS:[ECX+14]
006107D0   .  03C3          ADD     EAX, EBX
006107D2   .  03C2          ADD     EAX, EDX
006107D4   .  33D2          XOR     EDX, EDX
006107D6   .  F7F6          DIV     ESI
006107D8   .  8B69 24       MOV     EBP, DWORD PTR DS:[ECX+24]
006107DB   .  3BEA          CMP     EBP, EDX
006107DD   .  0F85 EF000000 JNZ     3DMark20.006108D2      不相等跳走(爆破點)
006107E3   .  8B51 30       MOV     EDX, DWORD PTR DS:[ECX+30]  再比較下5位
006107E6   .  8B41 34       MOV     EAX, DWORD PTR DS:[ECX+34]
006107E9   .  03C2          ADD     EAX, EDX
006107EB   .  0341 2C       ADD     EAX, DWORD PTR DS:[ECX+2C]
006107EE   .  0341 28       ADD     EAX, DWORD PTR DS:[ECX+28]
006107F1   .  33D2          XOR     EDX, EDX
006107F3   .  F7F6          DIV     ESI
006107F5   .  8B59 38       MOV     EBX, DWORD PTR DS:[ECX+38]
006107F8   .  3BDA          CMP     EBX, EDX
006107FA   .  0F85 D2000000 JNZ     3DMark20.006108D2     不相等再跳走(爆破點)
00610800   .  8B51 10       MOV     EDX, DWORD PTR DS:[ECX+10]  第一次判斷的餘數
00610803   .  8D042B        LEA     EAX, DWORD PTR DS:[EBX+EBP]  第二次判斷的餘數
00610806   .  03C2          ADD     EAX, EDX           三次餘數和
00610808   .  33D2          XOR     EDX, EDX
0061080A   .  F7F6          DIV     ESI              除以21H
0061080C   .  8B79 3C       MOV     EDI, DWORD PTR DS:[ECX+3C]
0061080F   .  3BFA          CMP     EDI, EDX          餘數與第16位比較
00610811   .  0F85 B9000000 JNZ     3DMark20.006108D0      第16位的判斷(爆破點)
00610817   .  8B51 24       MOV     EDX, DWORD PTR DS:[ECX+24]  第二次判斷的餘數
0061081A   .  8D041F        LEA     EAX, DWORD PTR DS:[EDI+EBX]  第三、四次判斷的餘數
0061081D   .  03C2          ADD     EAX, EDX           餘數和
0061081F   .  33D2          XOR     EDX, EDX
00610821   .  F7F6          DIV     ESI              除以21H
00610823   .  8B69 40       MOV     EBP, DWORD PTR DS:[ECX+40]
00610826   .  3BEA          CMP     EBP, EDX
00610828   .  0F85 A2000000 JNZ     3DMark20.006108D0      第17位的判斷(爆破點)
0061082E   .  8D042F        LEA     EAX, DWORD PTR DS:[EDI+EBP]
00610831   .  03C3          ADD     EAX, EBX
00610833   .  33D2          XOR     EDX, EDX
00610835   .  F7F6          DIV     ESI
00610837   .  8B59 44       MOV     EBX, DWORD PTR DS:[ECX+44]
0061083A   .  3BDA          CMP     EBX, EDX
0061083C   .  0F85 8E000000 JNZ     3DMark20.006108D0      第18位的判斷(爆破點)
00610842   .  8D042B        LEA     EAX, DWORD PTR DS:[EBX+EBP]
00610845   .  03C7          ADD     EAX, EDI
00610847   .  33D2          XOR     EDX, EDX
00610849   .  F7F6          DIV     ESI
0061084B   .  8B41 48       MOV     EAX, DWORD PTR DS:[ECX+48]
0061084E   .  3BC2          CMP     EAX, EDX
00610850   .  75 7E         JNZ     SHORT 3DMark20.006108D0   第19位的判斷(爆破點)
00610852   .  03C3          ADD     EAX, EBX
00610854   .  03C5          ADD     EAX, EBP
00610856   .  33D2          XOR     EDX, EDX
00610858   .  F7F6          DIV     ESI
0061085A   .  3951 4C       CMP     DWORD PTR DS:[ECX+4C], EDX 
0061085D   .  75 71         JNZ     SHORT 3DMark20.006108D0   第20位的判斷(爆破點)
0061085F   .  51            PUSH    ECX
00610860   .  E8 5FE00200   CALL    <JMP.&MFC42.#825_??3@YAXPAX@Z>
00610865   .  8B4C24 28     MOV     ECX, DWORD PTR SS:[ESP+28]
00610869   .  33F6          XOR     ESI, ESI
0061086B   .  83C4 04       ADD     ESP, 4
0061086E   .  3BCE          CMP     ECX, ESI
00610870   .  897424 14     MOV     DWORD PTR SS:[ESP+14], ESI
00610874   .  897424 18     MOV     DWORD PTR SS:[ESP+18], ESI
00610878   .  897424 1C     MOV     DWORD PTR SS:[ESP+1C], ESI
0061087C   .  74 1C         JE      SHORT 3DMark20.0061089A
0061087E   .  8A41 FF       MOV     AL, BYTE PTR DS:[ECX-1]
00610881   .  84C0          TEST    AL, AL
00610883   .  74 0B         JE      SHORT 3DMark20.00610890
00610885   .  3C FF         CMP     AL, 0FF
00610887   .  74 07         JE      SHORT 3DMark20.00610890
00610889   .  FEC8          DEC     AL
0061088B   .  8841 FF       MOV     BYTE PTR DS:[ECX-1], AL
0061088E   .  EB 0A         JMP     SHORT 3DMark20.0061089A
00610890   >  49            DEC     ECX
00610891   .  51            PUSH    ECX
00610892   .  E8 2DE00200   CALL    <JMP.&MFC42.#825_??3@YAXPAX@Z>
00610897   .  83C4 04       ADD     ESP, 4
0061089A   >  8B4C24 34     MOV     ECX, DWORD PTR SS:[ESP+34]
0061089E   .  3BCE          CMP     ECX, ESI
006108A0   .  897424 24     MOV     DWORD PTR SS:[ESP+24], ESI
006108A4   .  897424 28     MOV     DWORD PTR SS:[ESP+28], ESI
006108A8   .  897424 2C     MOV     DWORD PTR SS:[ESP+2C], ESI
006108AC   .  74 1E         JE      SHORT 3DMark20.006108CC
006108AE   .  8A41 FF       MOV     AL, BYTE PTR DS:[ECX-1]
006108B1   .  84C0          TEST    AL, AL
006108B3   .  74 0D         JE      SHORT 3DMark20.006108C2
006108B5   .  3C FF         CMP     AL, 0FF
006108B7   .  74 09         JE      SHORT 3DMark20.006108C2
006108B9   .  FEC8          DEC     AL
006108BB   .  8841 FF       MOV     BYTE PTR DS:[ECX-1], AL
006108BE   .  B0 01         MOV     AL, 1
006108C0   .  EB 7B         JMP     SHORT 3DMark20.0061093D
006108C2   >  49            DEC     ECX
006108C3   .  51            PUSH    ECX
006108C4   .  E8 FBDF0200   CALL    <JMP.&MFC42.#825_??3@YAXPAX@Z>
006108C9   .  83C4 04       ADD     ESP, 4
006108CC   >  B0 01         MOV     AL, 1
006108CE   .  EB 6D         JMP     SHORT 3DMark20.0061093D
006108D0   >  33FF          XOR     EDI, EDI
006108D2   >  51            PUSH    ECX
006108D3   .  E8 ECDF0200   CALL    <JMP.&MFC42.#825_??3@YAXPAX@Z>

演算法分析:註冊碼判斷正確與否是以5位為單位進行的。前三次判斷(即前15位註冊碼)是一樣的,即將前四位累加,然後除以21H,將餘數與第五位比較,相等的話再進行下一次判斷。以試驗碼為例,判斷過程為:1->18;2->19;3->1A;4->1B,累加進來為66H,除以21H,餘數是3。03H對應的原碼是字母D。為方便我們找到可用的註冊碼,我們可以把試驗碼的前15位換成1234D-1234D-1234D-XXXXX。注意:程式會自動把輸入的小寫字母變成大寫字母。
轉換碼為:  18 00 00 00 19 00 00 00 1A 00 00 00 1B 00 00 00
             03 00 00 00 18 00 00 00 19 00 00 00 1A 00 00 00
             1B 00 00 00 03 00 00 00 18 00 00 00 19 00 00 00
             1A 00 00 00 1B 00 00 00 03 00 00 00 14 00 00 00
             14 00 00 00 14 00 00 00 14 00 00 00 14 00 00 00

從第16位開始,註冊碼判斷開始改變。

第16位:前三次餘數和(03+03+03=09)除以21H的餘數(09)與第16位比較,09H對應原碼字母L
第17位:第四次判斷的餘數(09),加上第二、三次判斷的餘數,即(03+03+09=0F)除以21H的餘數(0F)與第17位比較,0FH對應原碼字母S。
第18位:第三、四、五次判斷的餘數和,即(03+09+0F=1B)除以21H的餘數(1B),與第18位比較,1BH對應原碼數字4。
第19位:第四、五、六次判斷的餘數和,即(09+0F+1B=33)除以21H的餘數(12),與第19位比較,12H對應原碼字母V。
第20位:第五、六、七次判斷的餘數和,即(0F+1B+12=3C)除以21H的餘數(1B),與第20位比較,1BH對應原碼數字4。
綜上所述,第16-20位註冊碼是LS4V4,可用的完整註冊碼為:1234D-1234D-1234D-LS4V4.

弄清楚了註冊碼的生成過程,就可以寫序號產生器了。當然了,如果不想費力氣找註冊碼的話,也可以爆破的,爆破點我已經在程式碼中標出了。

整個註冊過程使用者名稱並不參與計算,你可以隨便輸入你想用的使用者名稱!使用者名稱和註冊碼儲存在登錄檔中:

[HKEY_LOCAL_MACHINE\SOFTWARE\MadOnion.com\Registration2001]
"3DMarkRegName"="Hartnett"
"3DMarkRegKey"="1234D1234D1234DLS4V4"

但願我把上述過程寫得比較清楚了,呵呵!


相關文章