星光之夜 -- Starry Night 共享版演算法分析

看雪資料發表於2003-07-27

【破解宣告】本文純系技術性討論,任何人因使用本文資訊造成的一切後果,作者概不負責。

【軟體名稱】Starry Night Digital Download v4.05-- 星光之夜電子下載最新版

【軟體簡介】這是一款美麗而實用的星圖軟體, 根據實時天文資料計算並顯示指定時間的星空景象,
           甚至包括人造衛星的位置和運動情況! 自動識別所有星座, 視野達到20,000光年。包含
           約35,000 顆各類星球及170多個深層空間物體,如星系、星雲和星團等的詳細資料。在
           功能上相當於Backyard版,可以製作自己的電影和星際圖片,並可從livesky.com 下載
           最新的天文資料。但為了減小體積,便於下載,省略了很多星球的資料。可以用backyard
           版本的updater進行升級,配備完整的.pdf使用手冊,是廣大天文愛好者的必備工具。

【軟體大小】56.2MB

【下載地址】www.starrynight.com

【應用平臺】Windows 98/ME/2000/XP

【軟體限制】15天時間限制。在網上登記下載時,會要求填寫email 地址,隨後就會給你傳送一個試用
           註冊碼,可免費使用15天。
           
【破解工具】OllyDbg 1.09d

【分析過程】用PEid和FI3.01均顯示沒有殼,但不能確定是何種語言寫成。如果註冊碼失敗,會有訊息框
           顯示失敗資訊,如成功則進入主介面。試用註冊碼的形式是:yt4-383b-7669-71c1-5824,
           所以試煉碼設定為yr1-2345-6789-abcd-ef00.用OD載入後,現直接執行,利用臨時註冊碼
           進入主介面,然後下CreateWindowExA斷點,再從help選單中選擇軟體註冊。在顯示註冊對話
           框的時候會被OD攔住,記下編輯框控制元件的控制程式碼。輸入試煉碼後,回OD下GetWindowsTextA斷點,
           但沒能攔住(這年頭,用這種方法來獲得輸入的東東好像不多了)。重新來過,這次在我們的
           老朋友CallWindowProc函式上下條件斷點([esp+8]==編輯框控制程式碼) && ([esp+C]==WM_GETTEXT),
           攔截成功,記下存放輸入的記憶體地址,待函式返回後,在該處下記憶體斷點,然後執行程式直至
           訪問輸入的資訊,便來到以下程式碼:

入口處:

Arg1 = 00000002
Arg2 = 00C4BB78 ASCII "yr1-2345-6789-abcd-ef00"
Arg3 = 00C4BC78 ASCII "lianzi2000"
Arg4 = 00CB97F8
Arg5 = 00CB97FC
Arg6 = 00000000
Arg7 = 00000079
Arg8 = 00000034
................................................

005B330F  |> 8B4D 0C        /MOV ECX,DWORD PTR SS:[EBP+C]        ****試煉碼
005B3312  |. 0FBE0431       |MOVSX EAX,BYTE PTR DS:[ECX+ESI]     ****esi是索引
005B3316  |. 8945 8C        |MOV DWORD PTR SS:[EBP-74],EAX       ****取一個字元放入暫存處
005B3319  |. B0 01          |MOV AL,1
005B331B  |. 837D 8C 00     |CMP DWORD PTR SS:[EBP-74],0
005B331F  |. 7C 0B          |JL SHORT starryni.005B332C
005B3321  |. 817D 8C 000100>|CMP DWORD PTR SS:[EBP-74],100       ****看是否在0-0x100範圍內
005B3328  |. 7D 02          |JGE SHORT starryni.005B332C
005B332A  |. 30C0           |XOR AL,AL
005B332C  |> 84C0           |TEST AL,AL
005B332E  |. 74 04          |JE SHORT starryni.005B3334
005B3330  |. 31C0           |XOR EAX,EAX
005B3332  |. EB 1B          |JMP SHORT starryni.005B334F
005B3334  |> 6A 01          |PUSH 1
005B3336  |. E8 D5690800    |CALL starryni.00639D10              ****tls相關
005B333B  |. 59             |POP ECX
005B333C  |. 8B90 BC010000  |MOV EDX,DWORD PTR DS:[EAX+1BC]        
005B3342  |. 8B5A 08        |MOV EBX,DWORD PTR DS:[EDX+8]        ****ebx 是個字元型別表
005B3345  |. 8B45 8C        |MOV EAX,DWORD PTR SS:[EBP-74]       ****暫存處的字元
005B3348  |. 0FB70443       |MOVZX EAX,WORD PTR DS:[EBX+EAX*2]
005B334C  |. 83E0 09        |AND EAX,9                           ****如果字母或數字,
005B334F  |> 85C0           |TEST EAX,EAX                        ****EAX就不會為0
005B3351  |. 75 09          |JNZ SHORT starryni.005B335C
005B3353  |. 8B45 0C        |MOV EAX,DWORD PTR SS:[EBP+C]
005B3356  |. 803C30 2D      |CMP BYTE PTR DS:[EAX+ESI],2D        ****如果是特殊符號,就檢查是否連字號
005B335A  |. 75 17          |JNZ SHORT starryni.005B3373         ****別的字元一概忽略
005B335C  |> 8B45 0C        |MOV EAX,DWORD PTR SS:[EBP+C]
005B335F  |. 0FB61430       |MOVZX EDX,BYTE PTR DS:[EAX+ESI]
005B3363  |. 8B45 90        |MOV EAX,DWORD PTR SS:[EBP-70]
005B3366  |. 885405 9C      |MOV BYTE PTR SS:[EBP+EAX-64],DL
005B336A  |. FF45 90        |INC DWORD PTR SS:[EBP-70]           ****[ebp-70] 是長度計數
005B336D  |. 837D 90 17     |CMP DWORD PTR SS:[EBP-70],17        ****這裡表明正確的長度應該是0x17
005B3371  |. 7D 16          |JGE SHORT starryni.005B3389
005B3373  |> 46             |INC ESI
005B3374  |> 8B7D 0C         MOV EDI,DWORD PTR SS:[EBP+C]
005B3377  |. 31C0           |XOR EAX,EAX
005B3379  |. 83C9 FF        |OR ECX,FFFFFFFF
005B337C  |. F2:AE          |REPNE SCAS BYTE PTR ES:[EDI]
005B337E  |. BA FEFFFFFF    |MOV EDX,-2
005B3383  |. 29CA           |SUB EDX,ECX
005B3385  |. 39D6           |CMP ESI,EDX
005B3387  |.^72 86          \JB SHORT starryni.005B330F

以上程式碼整理輸入的註冊碼,忽略除數字和字母以及連字號之外的一切字元。

005B3389  |> C645 B3 00     MOV BYTE PTR SS:[EBP-4D],0          
005B338D  |. 8D45 9C        LEA EAX,DWORD PTR SS:[EBP-64]        ****整理後的註冊碼
005B3390  |. 50             PUSH EAX
005B3391  |. FF75 0C        PUSH DWORD PTR SS:[EBP+C]            
005B3394  |. E8 373D0800    CALL starryni.006370D0               ****複製覆蓋原註冊碼
005B3399  |. 59             POP ECX
005B339A  |. 59             POP ECX
005B339B  |. FF75 0C        PUSH DWORD PTR SS:[EBP+C]            ****註冊碼
005B339E  |. E8 A1080000    CALL starryni.005B3C44               ****這個函式把註冊碼中的字母全變成小寫
005B33A3  |. 59             POP ECX
005B33A4  |. 8B4D 0C        MOV ECX,DWORD PTR SS:[EBP+C]         ****註冊碼
005B33A7  |. 0FB641 01      MOVZX EAX,BYTE PTR DS:[ECX+1]        ****取第二個字元
005B33AB  |. 8945 98        MOV DWORD PTR SS:[EBP-68],EAX        ****存入[ebp-68]處
005B33AE  |. 807D 08 01     CMP BYTE PTR SS:[EBP+8],1            
005B33B2  |. 75 04          JNZ SHORT starryni.005B33B8
005B33B4  |. C645 97 00     MOV BYTE PTR SS:[EBP-69],0
005B33B8  |> 807D 98 63     CMP BYTE PTR SS:[EBP-68],63        
005B33BC  |. 75 04          JNZ SHORT starryni.005B33C2
005B33BE  |. C645 97 00     MOV BYTE PTR SS:[EBP-69],0
005B33C2  |> 8B7D 0C        MOV EDI,DWORD PTR SS:[EBP+C]        
005B33C5  |. 31C0           XOR EAX,EAX
005B33C7  |. 83C9 FF        OR ECX,FFFFFFFF
005B33CA  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI]
005B33CC  |. B8 FEFFFFFF    MOV EAX,-2
005B33D1  |. 29C8           SUB EAX,ECX
005B33D3  |. 83F8 17        CMP EAX,17
005B33D6  |. 73 0B          JNB SHORT starryni.005B33E3        
005B33D8  |. 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]
005B33DB  |. C600 05        MOV BYTE PTR DS:[EAX],5
005B33DE  |. E9 FC010000    JMP starryni.005B35DF

005B33E3  |> 8B7D 0C        MOV EDI,DWORD PTR SS:[EBP+C]         ****註冊碼
005B33E6  |. 31C0           XOR EAX,EAX
005B33E8  |. 83C9 FF        OR ECX,FFFFFFFF
005B33EB  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI]
005B33ED  |. B8 FEFFFFFF    MOV EAX,-2
005B33F2  |. 29C8           SUB EAX,ECX
005B33F4  |. 83F8 17        CMP EAX,17                           ****長度檢查
005B33F7  |. 76 07          JBE SHORT starryni.005B3400
005B33F9  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]         ****如果大於0x17,則在此截斷,只取0x17個字元
005B33FC  |. C640 17 00     MOV BYTE PTR DS:[EAX+17],0
005B3400  |> 8B7D 10        MOV EDI,DWORD PTR SS:[EBP+10]        ****名字
005B3403  |. 31C0           XOR EAX,EAX
005B3405  |. 83C9 FF        OR ECX,FFFFFFFF
005B3408  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI]         ****長度檢查
005B340A  |. B8 FEFFFFFF    MOV EAX,-2
005B340F  |. 29C8           SUB EAX,ECX
005B3411  |. 807D 97 00     CMP BYTE PTR SS:[EBP-69],0
005B3415  |. 74 10          JE SHORT starryni.005B3427
005B3417  |. 83F8 02        CMP EAX,2
005B341A  |. 7D 0B          JGE SHORT starryni.005B3427          
005B341C  |. 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]        ****如果長度小於2就失敗
005B341F  |. C600 06        MOV BYTE PTR DS:[EAX],6
005B3422  |. E9 B8010000    JMP starryni.005B35DF
005B3427  |> C645 CC 00     MOV BYTE PTR SS:[EBP-34],0
005B342B  |. 6A 03          PUSH 3                               ****立即數指明子串長度
005B342D  |. FF75 0C        PUSH DWORD PTR SS:[EBP+C]            ****註冊碼
005B3430  |. 8D45 CC        LEA EAX,DWORD PTR SS:[EBP-34]        ****存放返回字串的緩衝區
005B3433  |. 50             PUSH EAX
005B3434  |. E8 273D0800    CALL starryni.00637160               ****該函式從一個字串的左端取子串      
005B3439  |. 83C4 0C        ADD ESP,0C                           ****所以這裡取註冊碼第一部分3個字元的子串
005B343C  |. 6A 04          PUSH 4
005B343E  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
005B3441  |. 83C0 04        ADD EAX,4
005B3444  |. 50             PUSH EAX
005B3445  |. 8D45 CC        LEA EAX,DWORD PTR SS:[EBP-34]
005B3448  |. 50             PUSH EAX
005B3449  |. E8 123D0800    CALL starryni.00637160               ****第二部分4個字元
005B344E  |. 83C4 0C        ADD ESP,0C
005B3451  |. 6A 04          PUSH 4
005B3453  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
005B3456  |. 83C0 09        ADD EAX,9
005B3459  |. 50             PUSH EAX
005B345A  |. 8D45 CC        LEA EAX,DWORD PTR SS:[EBP-34]
005B345D  |. 50             PUSH EAX
005B345E  |. E8 FD3C0800    CALL starryni.00637160               ****第三部分4個字元
005B3463  |. 83C4 0C        ADD ESP,0C
005B3466  |. 6A 04          PUSH 4
005B3468  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
005B346B  |. 83C0 0E        ADD EAX,0E
005B346E  |. 50             PUSH EAX
005B346F  |. 8D45 CC        LEA EAX,DWORD PTR SS:[EBP-34]
005B3472  |. 50             PUSH EAX
005B3473  |. E8 E83C0800    CALL starryni.00637160               ****第4部分4個字元
005B3478  |. 83C4 0C        ADD ESP,0C                              

以上程式碼把註冊碼的第1,2,3,4部分連線起來,去掉連字號,形成yr123456789abcd, 在[ebp-34]處。


005B347B  |. 8D45 CF        LEA EAX,DWORD PTR SS:[EBP-31]       ****這裡eax指向"23456789abcd"
005B347E  |. 50             PUSH EAX                            
005B347F  |. E8 83010000    CALL starryni.005B3607              ****這個函式根據一個表把上述字串重新排序

            005B3616  MOV EDI,DWORD PTR SS:[EBP+8]
            005B3619  XOR EAX,EAX
            005B361B  OR ECX,FFFFFFFF
            005B361E  REPNE SCAS BYTE PTR ES:[EDI]
            005B3620  MOV EAX,-2
            005B3625  SUB EAX,ECX
            005B3627  CMP EAX,0C                             ****長度檢查:應該有0xC個字元
            005B362A  JE SHORT starryni.005B362E
            005B362C  JMP SHORT starryni.005B3663
            005B362E  XOR ESI,ESI                            ****esi作為索引
            005B3630  JMP SHORT starryni.005B3646
            005B3632  /MOVSX EBX,WORD PTR DS:[ESI*2+729CA8]  ****從位於[729CA8]的表中得到新索引
            005B363A  |MOV EAX,DWORD PTR SS:[EBP+8]          
            005B363D  |MOVZX EDX,BYTE PTR DS:[EAX+EBX]       ****從原字串中取出新索引對應的字元
            005B3641  |MOV BYTE PTR SS:[EBP+ESI-1C],DL       ****放在臨時緩衝區的原索引對應位置
            005B3645  |INC ESI
            005B3646   CMP ESI,0C
            005B3649  \JL SHORT starryni.005B3632
            005B364B  MOV BYTE PTR SS:[EBP-10],0            
            005B364F  MOV EAX,DWORD PTR SS:[EBP+8]          
            005B3652  MOV BYTE PTR DS:[EAX],0                
            005B3655  LEA EAX,DWORD PTR SS:[EBP-1C]          
            005B3658  PUSH EAX
            005B3659  PUSH DWORD PTR SS:[EBP+8]              
            005B365C  CALL starryni.00637130                 ****用重排過的字串代替原字串  
           
            [729CA8]表的內容如下:
            0B 00 02 00 06 00 08 00 04 00 07 00 0A 00 01 00 03 00 09 00 00 00 05 00
            所以"23456789abcd"重排後變成"d48a69c35b27"

005B3484  |. 59             POP ECX
005B3485  |. 8D45 CC        LEA EAX,DWORD PTR SS:[EBP-34]     ****字串現已變成"yr1d48a69c35b27"
005B3488  |. 50             PUSH EAX                          ****作為引數壓入堆疊
005B3489  |. E8 CE020000    CALL starryni.005B375C            ****關鍵call,計算檢查和

            005B375C   PUSH EBP
            005B375D   MOV EBP,ESP
            005B375F   PUSH EBX
            005B3760   PUSH ESI
            005B3761   PUSH EDI
            005B3762   SUB ESP,24
            005B3765  >MOV DWORD PTR SS:[EBP-30],-32EB       ****這裡有一個常數
            005B376C   PUSH 1E                               ****立即數指明所需字串的長度
            005B376E   LEA EAX,DWORD PTR SS:[EBP-2C]         ****存放返回結果的緩衝區
            005B3771   PUSH EAX                              
            005B3772   PUSH DWORD PTR SS:[EBP+8]             ****"yr1d48a69c35b27"
            005B3775   CALL starryni.005B37BD                ****這個函式複製並連線字串直到達到指定長度
            005B377A   ADD ESP,0C
            005B377D   TEST AL,AL                            ****返回非零表示成功
            005B377F   JNZ SHORT starryni.005B3788
            005B3781   MOV EAX,-11CD
            005B3786   JMP SHORT starryni.005B37B5
            005B3788   LEA EDI,DWORD PTR SS:[EBP-2C]         ****已經連線的字串:
            005B378B   XOR EAX,EAX                           ****"yr1d48a69c35b27yr1d48a69c35b27"
            005B378D   OR ECX,FFFFFFFF
            005B3790   REPNE SCAS BYTE PTR ES:[EDI]
            005B3792   MOV ESI,-2
            005B3797   SUB ESI,ECX                           ****長度0x1E
            005B3799   XOR EBX,EBX                           ****ebx為索引index
            005B379B   JMP SHORT starryni.005B37AE
            005B379D   /MOVZX ECX,BYTE PTR SS:[EBP+EBX-2C]   ****ecx = ch
            005B37A2   |MOV EDX,EBX                          ****edx = index
            005B37A4   |IMUL EDX,ECX                         ****edx = index*ch
            005B37A7   |IMUL EDX,ECX                         ****edx = index*ch*ch = index*ch**2
            005B37AA   |ADD DWORD PTR SS:[EBP-30],EDX        ****結果加到常數-32EB上
            005B37AD   |INC EBX
            005B37AE    CMP EBX,ESI
            005B37B0   \JL SHORT starryni.005B379D
            005B37B2   MOV EAX,DWORD PTR SS:[EBP-30]         ****返回最後結果
            005B37B5   LEA ESP,DWORD PTR SS:[EBP-C]
            005B37B8   POP EDI
            005B37B9   POP ESI
            005B37BA   POP EBX
            005B37BB   POP EBP
            005B37BC   RETN
           
            這個過程的工作是把字串首尾相連達到30個字元(0x1E),然後計算檢查和:
            checksum = sum(index*ch**2)-0x32EB

005B348E  |. 59             POP ECX
005B348F  |. 0FB7C0         MOVZX EAX,AX                      ****拋棄檢查和的高位字
005B3492  |. 8D55 C0        LEA EDX,DWORD PTR SS:[EBP-40]
005B3495  |. 52             PUSH EDX
005B3496  |. 0FB7C0         MOVZX EAX,AX
005B3499  |. 50             PUSH EAX
005B349A  |. E8 40040000    CALL starryni.005B38DF            ****這個函式將檢查和的低位字轉成字串行式
005B349F  |. 59             POP ECX
005B34A0  |. 59             POP ECX
005B34A1  |. C645 B4 00     MOV BYTE PTR SS:[EBP-4C],0
005B34A5  |. 6A 04          PUSH 4
005B34A7  |. 8B7D 0C        MOV EDI,DWORD PTR SS:[EBP+C]      ****這是原來輸入的原始形式的註冊碼
005B34AA  |. 31C0           XOR EAX,EAX
005B34AC  |. 83C9 FF        OR ECX,FFFFFFFF
005B34AF  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI]
005B34B1  |. BA FEFFFFFF    MOV EDX,-2
005B34B6  |. 29CA           SUB EDX,ECX                       ****取長度
005B34B8  |. 83C2 FC        ADD EDX,-4                        **** -4
005B34BB  |. 0355 0C        ADD EDX,DWORD PTR SS:[EBP+C]      ****edx 指向最後4個字元,即第5部分
005B34BE  |. 52             PUSH EDX                          
005B34BF  |. 8D45 B4        LEA EAX,DWORD PTR SS:[EBP-4C]
005B34C2  |. 50             PUSH EAX
005B34C3  |. E8 983C0800    CALL starryni.00637160            ****取出最後4個字元
005B34C8  |. 83C4 0C        ADD ESP,0C
005B34CB  |. 8D45 C0        LEA EAX,DWORD PTR SS:[EBP-40]     ****檢查和字串
005B34CE  |. 50             PUSH EAX
005B34CF  |. 8D45 B4        LEA EAX,DWORD PTR SS:[EBP-4C]     ****註冊碼最後部分字串
005B34D2  |. 50             PUSH EAX
005B34D3  |. E8 C83C0800    CALL starryni.006371A0            ****比較看是否相等
005B34D8  |. 59             POP ECX
005B34D9  |. 59             POP ECX
005B34DA  |. 85C0           TEST EAX,EAX                      ****返回0表示相等
005B34DC  |. 74 0B          JE SHORT starryni.005B34E9
005B34DE  |. 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]
005B34E1  |. C600 08        MOV BYTE PTR DS:[EAX],8
005B34E4  |. E9 F6000000    JMP starryni.005B35DF
005B34E9  |> 8D7D CC        LEA EDI,DWORD PTR SS:[EBP-34]    
005B34EC  |. 31C0           XOR EAX,EAX
005B34EE  |. 83C9 FF        OR ECX,FFFFFFFF
005B34F1  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI]
005B34F3  |. BB FEFFFFFF    MOV EBX,-2
005B34F8  |. 29CB           SUB EBX,ECX
005B34FA  |. 807D 97 00     CMP BYTE PTR SS:[EBP-69],0        ****不明標誌
005B34FE  |. 74 29          JE SHORT starryni.005B3529
005B3500  |. FF75 10        PUSH DWORD PTR SS:[EBP+10]        ****名字
005B3503  |. E8 ED010000    CALL starryni.005B36F5            ****關鍵call,計算名字檢查和

            005B36F5  PUSH EBP
            005B36F6  MOV EBP,ESP
            005B36F8  PUSH EBX
            005B36F9  PUSH ESI
            005B36FA  PUSH EDI
            005B36FB  SUB ESP,24
            005B36FE  MOV DWORD PTR SS:[EBP-30],75BCD15      ****常數
            005B3705  PUSH 1E                                
            005B3707  LEA EAX,DWORD PTR SS:[EBP-2C]          
            005B370A  PUSH EAX                              
            005B370B  PUSH DWORD PTR SS:[EBP+8]                
            005B370E  CALL starryni.005B37BD                 ****這個函式見過了,就是串聯字串達到0x1E
            005B3713  ADD ESP,0C
            005B3716  TEST AL,AL
            005B3718  JNZ SHORT starryni.005B3721
            005B371A  MOV EAX,4455EE33                       ****奇怪的返回值表示失敗
            005B371F  JMP SHORT starryni.005B3754
            005B3721  LEA EDI,DWORD PTR SS:[EBP-2C]          ****註冊名字相連而成的長度為1E的串
            005B3724  XOR EAX,EAX
            005B3726  OR ECX,FFFFFFFF
            005B3729  REPNE SCAS BYTE PTR ES:[EDI]
            005B372B  MOV ESI,-2
            005B3730  SUB ESI,ECX
            005B3732  XOR EBX,EBX                            ****ebx是索引index
            005B3734  JMP SHORT starryni.005B374D
            005B3736  /MOVZX ECX,BYTE PTR SS:[EBP+EBX-2C]    ****ecx = ch
            005B373B  |MOV EDX,EBX                           ****edx = index
            005B373D  |IMUL EDX,EBX                          ****edx = index**2
            005B3740  |IMUL EDX,EBX                          ****edx = index**3
            005B3743  |IMUL EDX,ECX                          ****edx = index**3*ch
            005B3746  |IMUL EDX,ECX                          ****edx = index**3*ch**2
            005B3749  |ADD DWORD PTR SS:[EBP-30],EDX         ****加到常數75BCD15上
            005B374C  |INC EBX
            005B374D   CMP EBX,ESI
            005B374F  \JL SHORT starryni.005B3736
            005B3751  MOV EAX,DWORD PTR SS:[EBP-30]
            005B3754  LEA ESP,DWORD PTR SS:[EBP-C]
            005B3757  POP EDI
            005B3758  POP ESI
            005B3759  POP EBX
            005B375A  POP EBP
            005B375B  RETN
           
            這個過程計算名字的檢查和,同樣先把名字串聯達到0x1E長度,然後計算:
            checksum = sum(index**3*ch**2) + 0x75BCD15

005B3508  |. 59             POP ECX
005B3509  |. 89C6           MOV ESI,EAX                        ****名字的檢查和
005B350B  |. 8D53 F8        LEA EDX,DWORD PTR DS:[EBX-8]      
005B350E  |. 8D4D CC        LEA ECX,DWORD PTR SS:[EBP-34]      ****註冊碼前4部分相連並重排後的字串
005B3511  |. 01CA           ADD EDX,ECX                        ****edx指向該字串的後面8個字元
005B3513  |. 52             PUSH EDX                          
005B3514  |. E8 6A040000    CALL starryni.005B3983             ****轉換成16進位制數碼
005B3519  |. 59             POP ECX
005B351A  |. 39F0           CMP EAX,ESI                        ****結果與名字的檢查和比較
005B351C  |. 74 0B          JE SHORT starryni.005B3529         ****必須相等,否則失敗
005B351E  |. 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]
005B3521  |. C600 04        MOV BYTE PTR DS:[EAX],4
005B3524  |. E9 B6000000    JMP starryni.005B35DF
005B3529  |> 8D45 CF        LEA EAX,DWORD PTR SS:[EBP-31]      ****重排後註冊碼的第2部分
005B352C  |. 50             PUSH EAX                          
005B352D  |. E8 FF030000    CALL starryni.005B3931             ****轉換成16進位制數
005B3532  |. 59             POP ECX
005B3533  |. 0FB7C0         MOVZX EAX,AX                       只保留低位字


005B3536  |. 89C3           MOV EBX,EAX
005B3538  |. E8 2E010000    CALL starryni.005B366B             ****這個函式沒有搞懂。看上去十分複雜,很多層次
                                                              ****子程式呼叫,但與名字及註冊碼均無關,最後返回
005B353D  |. 89DA           MOV EDX,EBX                        ****0x135A
005B353F  |. 29C2           SUB EDX,EAX                        ****第2部分的值減去這個135A
005B3541  |. 8B45 14        MOV EAX,DWORD PTR SS:[EBP+14]
005B3544  |. 8910           MOV DWORD PTR DS:[EAX],EDX         ****如果結果小於0就會失敗
005B3546  |. 0FBE45 98      MOVSX EAX,BYTE PTR SS:[EBP-68]     ****這裡是註冊碼第二個字元,可能決定註冊的版本
005B354A  |. 83E8 63        SUB EAX,63                        
005B354D  |. 74 26          JE SHORT starryni.005B3575
005B354F  |. 83E8 0B        SUB EAX,0B
005B3552  |. 74 56          JE SHORT starryni.005B35AA
005B3554  |. 83E8 04        SUB EAX,4
005B3557  |. 74 3B          JE SHORT starryni.005B3594
005B3559  |. 83E8 02        SUB EAX,2
005B355C  |. 74 07          JE SHORT starryni.005B3565
005B355E  |. 83E8 01        SUB EAX,1
005B3561  |. 74 47          JE SHORT starryni.005B35AA
005B3563  |. EB 4D          JMP SHORT starryni.005B35B2
005B3565  |> 8B45 14        MOV EAX,DWORD PTR SS:[EBP+14]      ****'t',註冊15天試用版
005B3568  |. 8338 00        CMP DWORD PTR DS:[EAX],0
005B356B  |. 7C 2F          JL SHORT starryni.005B359C
005B356D  |. 837D 1C 28     CMP DWORD PTR SS:[EBP+1C],28
005B3571  |. 7E 47          JLE SHORT starryni.005B35BA
005B3573  |. EB 27          JMP SHORT starryni.005B359C
005B3575  |> 8B45 14        MOV EAX,DWORD PTR SS:[EBP+14]      ****'c',不明用處
005B3578  |. 8338 00        CMP DWORD PTR DS:[EAX],0
005B357B  |. 7C 1F          JL SHORT starryni.005B359C
005B357D  |. 837D 1C 14     CMP DWORD PTR SS:[EBP+1C],14
005B3581  |. 7E 02          JLE SHORT starryni.005B3585
005B3583  |. EB 17          JMP SHORT starryni.005B359C
005B3585  |> BA 14000000    MOV EDX,14
005B358A  |. 2B55 1C        SUB EDX,DWORD PTR SS:[EBP+1C]
005B358D  |. 8B45 14        MOV EAX,DWORD PTR SS:[EBP+14]
005B3590  |. 8910           MOV DWORD PTR DS:[EAX],EDX
005B3592  |. EB 26          JMP SHORT starryni.005B35BA
005B3594  |> 8B45 14        MOV EAX,DWORD PTR SS:[EBP+14]      ****'r',好像是正式的backyard版
005B3597  |. 8338 00        CMP DWORD PTR DS:[EAX],0
005B359A  |. 7D 1E          JGE SHORT starryni.005B35BA
005B359C  |> 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]
005B359F  |. C600 03        MOV BYTE PTR DS:[EAX],3
005B35A2  |. 8B45 14        MOV EAX,DWORD PTR SS:[EBP+14]
005B35A5  |. 8320 00        AND DWORD PTR DS:[EAX],0
005B35A8  |. EB 35          JMP SHORT starryni.005B35DF
005B35AA  |> 8B45 14        MOV EAX,DWORD PTR SS:[EBP+14]      ****'n'和'u',沒看出有什麼特別
005B35AD  |. 8320 00        AND DWORD PTR DS:[EAX],0
005B35B0  |. EB 08          JMP SHORT starryni.005B35BA
005B35B2  |> 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]            ;  Default case of switch 005B354A
005B35B5  |. C600 07        MOV BYTE PTR DS:[EAX],7
005B35B8  |. EB 25          JMP SHORT starryni.005B35DF
005B35BA  |> 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]             ;  original code
005B35BD  |. 0FB610         MOVZX EDX,BYTE PTR DS:[EAX]
005B35C0  |. 3A55 20        CMP DL,BYTE PTR SS:[EBP+20]        ****第1個字元必須是'y'
005B35C3  |. 74 08          JE SHORT starryni.005B35CD
005B35C5  |. 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]
005B35C8  |. C600 09        MOV BYTE PTR DS:[EAX],9
005B35CB  |. EB 12          JMP SHORT starryni.005B35DF
005B35CD  |> 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
005B35D0  |. 0FB650 02      MOVZX EDX,BYTE PTR DS:[EAX+2]      
005B35D4  |. 3A55 24        CMP DL,BYTE PTR SS:[EBP+24]        ****第3個字元必須是'4'
005B35D7  |. 74 0A          JE SHORT starryni.005B35E3
005B35D9  |. 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]
005B35DC  |. C600 0A        MOV BYTE PTR DS:[EAX],0A
005B35DF  |> 30C0           XOR AL,AL                              
005B35E1  |. EB 1C          JMP SHORT starryni.005B35FF
005B35E3  |> 807D 98 74     CMP BYTE PTR SS:[EBP-68],74            
005B35E7  |. 74 06          JE SHORT starryni.005B35EF
005B35E9  |. 807D 98 63     CMP BYTE PTR SS:[EBP-68],63            
005B35ED  |. 75 08          JNZ SHORT starryni.005B35F7
005B35EF  |> 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]
005B35F2  |. C600 01        MOV BYTE PTR DS:[EAX],1
005B35F5  |. EB 06          JMP SHORT starryni.005B35FD
005B35F7  |> 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]
005B35FA  |. C600 00        MOV BYTE PTR DS:[EAX],0
005B35FD  |> B0 01          MOV AL,1
005B35FF  |> 8D65 F4        LEA ESP,DWORD PTR SS:[EBP-C]
005B3602  |. 5F             POP EDI
005B3603  |. 5E             POP ESI
005B3604  |. 5B             POP EBX
005B3605  |. 5D             POP EBP
005B3606  \. C3             RETN

【分析總結】可用以下步驟生成註冊碼:
           1 將名字剔除一切特殊字元(包括空格)後,重複複製至0x1E個字元長;
           2 計算名字串的32-bit檢查和 checksum = sum(index**3*ch**2)+0x75BCD15
           3 將檢查和數字轉換成字串(8個字元)
           4 在該字串頭上加上"yx4ssss",其中'x'可以是t,r,n,u或c;s可以是任何16進位制數字
             但不能小於0x135A
           5 將所得字串複製、連線,正好達到0x1E個字元,計算檢查和:
             checksum = sum(index*ch**2)-32EB
           6 所的檢查和的低位字轉換成字串形式,這4個字元構成註冊碼的最後4位
           7 由名字檢查和生成的字串(長度8)加上前面的任意4個16進位制數字構成一個12字元長的串,
             按照下面的順序重新排列:
             10,7,1,8,4,11,2,5,3,9,6,0
             重排後的字串構成註冊碼的第2,3和4部分。
           8 第一部分就是"yx4",其中'x'可以是t,r,n,u或c

【版權資訊】本文版權屬作者lianzi2000所有,轉載請保持完整


相關文章