處子之作(心夢網頁特效精靈6.0 XP特別版) (1千字)

看雪資料發表於2015-11-15

發言人:NewHand[BCG]
研究目標:心夢網頁特效精靈6.0 XP特別版
使用工具:olldbg、trw2000、filemon、Regmon、FI、Import REConstructo
軟體保護方式:使用次數限制、自校驗防脫殼、兩重註冊碼驗證
工作平臺:Win98
軟體評級:不難不易(典型的明碼比較)
下載地址:自己用搜尋引擎找
展示內容:手動脫殼、解除自校驗、爆破、解除使用次數限制、序號產生器和演算法。
研究原因:首次加入BCG,覺得應該勇於實踐,展示自我,讓別人指正我的不足,
          促進自我與愛好者的技術交流,學人之長,補已之短,若有更好的方法,望不吝賜教。
宣告:可能網上已經有人破解了,但本文絕對是本人獨立完成的,如有雷同,實屬不幸。。。
      本文只是研究學習交流技術,別無它意,請不要用作不法用途,否則後果本人概不負責。
      內容已經容寫得相當詳細,希望能對一些和我一起的初學者有點幫助。很多人會寫“高手莫入”,
      其意圖相當明顯,何必這麼狡猾,我覺得只要是用心去寫,哪怕是普通的,也會得到別人的尊重和幫助!

我對策的方式(僅供參考,你完全可以按你的方式去DO--畢竟行行出狀元):
        瞭解: 看看說明,執行一下該軟體先,大概知道一下都有些什麼功能以及註冊方法等等...
        偵測:可用FI、Pe-scan、PEiD等偵測工具,測試軟體是否加殼或加密方式。
(可選)脫殼:軟體加殼的可用脫殼軟體解除或手動脫殼(本人剛剛入行,正努力學習中。。。)
              脫殼後有自校驗的除之,有Anti-dbg的就小心了(我也沒有什麼心得經驗,也想學…)
(可選)靜態分析:脫殼後可根據軟體編譯語言,用w32dasm等或對應反彙編、反編譯工具進行靜態分析(看你哪樣在行裸)
(可選)動態跟蹤:olldbg和trw2000結合:trw2000使用穩定、靈活(要走要跟任我行),OD資訊詳盡豐富,滿足你瞬間的視野(接近目的地附近)。


若你是個不愛記斷點函式或經常一時忘記要下函式名字,就要記Hmemcpy,用trw2000的Hmemcpy斷下,
                  用F12和F10配合使用令其返回程式領空(記下斷點)----做“探子”,用olldbg--做“武將”在(記下斷點)下斷,中斷後進行
                  粗略跟蹤,有頭緒就進行細跟蹤,沒頭緒就再來,如此是也,然後就要看看“主帥”的你怎麼看怎麼辦。。。

施工過程:
一、【手動脫殼】:
用olldbg載入程式,提示有壓縮加密,選擇“否”,開始我們手動脫殼之旅…
00585001 > 60               PUSHAD                                    看…Aspak的壓棧標誌
00585002   E8 72050000      CALL SM60.00585579
00585007   EB 33            JMP SHORT SM60.0058503C
00585009   87DB             XCHG EBX,EBX
0058500B   90               NOP
省略部分程式碼。。。在搜尋“命令”Ctrl+F,填寫“POPAD”向下進行搜尋,可找到如下特徵:
005854F3   61               POPAD                                     看…Aspak的出棧標誌,它解壓完畢了,就要返回程式入口
005854F4   75 08            JNZ SHORT SM60.005854FE
005854F6   B8 01000000      MOV EAX,1
005854FB   C2 0C00          RETN 0C
005854FE   68 90654D00      PUSH SM60.004D6590                        這裡儲存程式入口的地址
00585503   C3               RETN                                      按一下F8,就可抵達程式入口進行Dump,要記住入口地址,以後可能有用。
若Dump出的File不能執行,執行原程式(最好是在OEP處掛起),可用Import REConstructo等PE工具進行修復,全Yes後就選Dump出的File進行Fix,這樣可以執行了。

二、【脫殼後解除自校驗】:
軟體本身自校驗----跳出對話,告知檔案被破壞,不予執行。出現這種情況,你就crack這對話方塊,一般問題就解決了。
分析:①軟體的這種自校驗肯定是在程式開始執行的時候就要比較的,所以這段程式碼一定在程式的入口不遠處。
      ②另外,在“GetFileSize函式”等獲取檔案大小的函式上下斷點,返回程式領空進行跟蹤,
        往後看見“JE或JNE”可嘗試修改,校驗可能從此消失!
      ③自校驗的地方可能不止一個,你就要逐一進行擊破,哈哈,要給些耐性哦!
004D6590 > $ 55             PUSH EBP                                 
004D6591   . 8BEC           MOV EBP,ESP
004D6593   . 83C4 F0        ADD ESP,-10
004D6596   . 53             PUSH EBX
004D6597   . B8 D8614D00    MOV EAX,SM6.004D61D8
004D659C   . E8 BF08F3FF    CALL SM6.00406E60
004D65A1   . 8B1D D8954D00  MOV EBX,DWORD PTR DS:[4D95D8]              SM6.004DAC38
004D65A7   . 8B03           MOV EAX,DWORD PTR DS:[EBX]
004D65A9   . E8 BAECF8FF    CALL SM6.00465268
004D65AE   . 8B03           MOV EAX,DWORD PTR DS:[EBX]
004D65B0   . BA 30664D00    MOV EDX,SM6.004D6630
004D65B5   . E8 BAE8F8FF    CALL SM6.00464E74
004D65BA   . 8B0D F4944D00  MOV ECX,DWORD PTR DS:[4D94F4]              SM6.004DAFA4
004D65C0   . 8B03           MOV EAX,DWORD PTR DS:[EBX]
004D65C2   . 8B15 4C194D00  MOV EDX,DWORD PTR DS:[4D194C]              SM6.004D1998
004D65C8   . E8 B3ECF8FF    CALL SM6.00465280                          1號校驗call,過了Call,出現警告,多麼友善啊!跟入看看,往後還有同樣的4個call。
進入CALL SM6.00465280...來到
004652A8   . 8BCE           MOV ECX,ESI
004652AA     83CA FF        OR EDX,FFFFFFFF
004652AD   . 8BC3           MOV EAX,EBX                                這裡修改edx為0,可kill校驗,但不妥,往後有4個同樣的call要進入這裡,結果令要提交作者的所有註冊資訊為空
004652AF   . 8B38           MOV EDI,DWORD PTR DS:[EAX]
004652B1   . FF57 2C        CALL DWORD PTR DS:[EDI+2C]                 2號校驗call過了Call,出現警告。
這裡按上述的方式你可以一層一層地去驗證,定會找到最關鍵的校驗跳轉(可能挺艱苦的)。
我是用了②進行解決的:
省略部分程式碼。。。按原檔案大小直接修改GetFileSize的返回值,雖然能逃過自校驗,但有地址訪問問題彈出(可能其它地方都要呼叫它),所以要找出校驗關鍵跳轉點,按著順序你會來到這裡
004D3302  |. B9 443A4D00    MOV ECX,SM6.004D3A44                       準備裝入“CRC6.dll”
004D3307  |. E8 381AF3FF    CALL SM6.00404D44
004D330C  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]

004D33B0  |. 52             PUSH EDX                                  /Arg2 => 00000000
004D33B1  |. 50             PUSH EAX                                  |Arg1
004D33B2  |. 8D95 14FEFFFF  LEA EDX,DWORD PTR SS:[EBP-1EC]            |
004D33B8  |. B8 08000000    MOV EAX,8                                 |
004D33BD  |. E8 665EF3FF    CALL SM6.00409228                         \SM6.00409228
004D33C2  |. 8B85 14FEFFFF  MOV EAX,DWORD PTR SS:[EBP-1EC]
004D33C8  |. 8D95 18FEFFFF  LEA EDX,DWORD PTR SS:[EBP-1E8]
004D33CE  |. E8 65F0FFFF    CALL SM6.004D2438
004D33D3  |. 8B85 18FEFFFF  MOV EAX,DWORD PTR SS:[EBP-1E8]
004D33D9  |. 8B55 F0        MOV EDX,DWORD PTR SS:[EBP-10]
004D33DC  |. E8 5B1AF3FF    CALL SM6.00404E3C
004D33E1     74 16          JE SHORT SM6.004D33F9                      ***********校驗關鍵跳轉點,可改成JMP**********


三、【爆破、解除使用次數限制】:
啟動比較註冊碼:(一般用filemon、Regmon等可以檢測程式要讀取什麼,然後就搜尋它字元參考位置下斷點進行跟蹤,若遇上利害的Anti-dbg就麻煩了!)
004D2D23  |. BA 742E4D00    MOV EDX,SM6.004D2E74                       ASCII "Software\smsoft\sm6xp"
004D2D28  |. 8BC3           MOV EAX,EBX
004D2D2A  |. E8 B5FCF9FF    CALL SM6.004729E4
004D2D2F  |. 8D4D F8        LEA ECX,DWORD PTR SS:[EBP-8]
004D2D32  |. BA 942E4D00    MOV EDX,SM6.004D2E94                       ASCII "sm6sn"
004D2D37  |. 8BC3           MOV EAX,EBX
004D2D39  |. E8 8EFEF9FF    CALL SM6.00472BCC                          啟動時裝入登錄檔假碼
004D2D3E  |. 33C0           XOR EAX,EAX
004D2D40  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
004D2D43  |. 68 A42E4D00    PUSH SM6.004D2EA4                          ASCII "S6L"
省略部分程式碼。。。
004D2E28  |. E8 8B1FF3FF    CALL SM6.00404DB8                          啟動時最後生成真註冊碼的call
004D2E2D  |. 8B55 D8        MOV EDX,DWORD PTR SS:[EBP-28]
004D2E30  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004D2E33  |. E8 0420F3FF    CALL SM6.00404E3C                          啟動時真假註冊碼比較的call
004D2E38     75 04          JNZ SHORT SM6.004D2E3E                     ***不能跳,爆破點***
004D2E3A  |. B3 01          MOV BL,1

啟動時檢測使用限制次數
004D0368  /$ 55             PUSH EBP                                   啟動後不進行註冊就Call 4D07A7或4D0C3F來到這
省略部分程式碼。。。
004D0399  |. BA 0C044D00    MOV EDX,SM6.004D040C                       ASCII "Software\Microsoft\Windows\CurrentVersion\Telephony\temp"
004D039E  |. 8BC6           MOV EAX,ESI
004D03A0  |. E8 3F26FAFF    CALL SM6.004729E4
004D03A5  |. BA 50044D00    MOV EDX,SM6.004D0450                       ASCII "smyx"
004D03AA  |. 8BC6           MOV EAX,ESI
004D03AC  |. E8 B329FAFF    CALL SM6.00472D64
004D03B1  |. 84C0           TEST AL,AL
004D03B3  |. 74 24          JE SHORT SM6.004D03D9
004D03B5  |. 8D4D FC        LEA ECX,DWORD PTR SS:[EBP-4]
004D03B8  |. BA 50044D00    MOV EDX,SM6.004D0450                       ASCII "smyx"
004D03BD  |. 8BC6           MOV EAX,ESI
004D03BF  |. E8 0828FAFF    CALL SM6.00472BCC                          讀取登錄檔限制使用次數的鍵值
004D03C4  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004D03C7  |. E8 9C8EF3FF    CALL SM6.00409268
004D03CC  |. 3D A0000000    CMP EAX,0A0                                再次檢測限制使用次數
004D03D1  |. 7E 04          JLE SHORT SM6.004D03D7                     這裡可以改成“JMP”--解除使用次數限制

004D2A6C  /$ 55             PUSH EBP                                   啟動時註冊碼已透過來自Call 4D40AD
省略部分程式碼。。。
004D2AA1  |. BA 442B4D00    MOV EDX,SM6.004D2B44                       ASCII "Software\Microsoft\Windows\CurrentVersion\Telephony\temp"
004D2AA6  |. 8BC6           MOV EAX,ESI
004D2AA8  |. E8 37FFF9FF    CALL SM6.004729E4
004D2AAD  |. 8D4D F8        LEA ECX,DWORD PTR SS:[EBP-8]
004D2AB0  |. BA 882B4D00    MOV EDX,SM6.004D2B88                       ASCII "smyx"
004D2AB5  |. 8BC6           MOV EAX,ESI
004D2AB7  |. E8 1001FAFF    CALL SM6.00472BCC                          啟動時註冊碼已透過,讀取登錄檔使用次數限制鍵值的Call
004D2ABC  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004D2ABF  |. E8 A467F3FF    CALL SM6.00409268
004D2AC4     83C0 08        ADD EAX,8                                  ***執行1次就累加使用次數限制值--爆破點可nop掉它①***
004D2AC7  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]
004D2ACA  |. E8 B966F3FF    CALL SM6.00409188
004D2ACF  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004D2AD2  |. BA 882B4D00    MOV EDX,SM6.004D2B88                       ASCII "smyx"
004D2AD7  |. 8BC6           MOV EAX,ESI
004D2AD9  |. E8 C200FAFF    CALL SM6.00472BA0                          增加後的鍵值裝入登錄檔的Call
004D2ADE  |. 8D4D F4        LEA ECX,DWORD PTR SS:[EBP-C]
004D2AE1  |. BA 882B4D00    MOV EDX,SM6.004D2B88                       ASCII "smyx"
004D2AE6  |. 8BC6           MOV EAX,ESI
004D2AE8  |. E8 DF00FAFF    CALL SM6.00472BCC
004D2AED  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
004D2AF0  |. E8 7367F3FF    CALL SM6.00409268
004D2AF5  |. 3D A8000000    CMP EAX,0A8                                檢測是否使用過期
004D2AFA  |. 7E 04          JLE SHORT SM6.004D2B00                     這裡可以改成“JMP”--解除使用次數限制

省略部分程式碼。。。
004D2C29  |> 8D4D F4        LEA ECX,DWORD PTR SS:[EBP-C]
004D2C2C  |. BA D42C4D00    MOV EDX,SM6.004D2CD4                       ASCII "smyx"
004D2C31  |. 8BC6           MOV EAX,ESI
004D2C33  |. E8 94FFF9FF    CALL SM6.00472BCC
004D2C38  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
004D2C3B  |. E8 2866F3FF    CALL SM6.00409268                          過了這個Call就在登錄檔你的使用次數限制
004D2C40  |. A3 A8AF4D00    MOV DWORD PTR DS:[4DAFA8],EAX
004D2C45  |. 813D A8AF4D00 >CMP DWORD PTR DS:[4DAFA8],0A0              比較已執行使用次數
004D2C4F  |. 7E 04          JLE SHORT SM6.004D2C55                     少於等於限制次數可樂了,否則別想美了,可改成Jmp
進行註冊部分:
004D095E   . E8 B949F7FF    CALL SM6.0044531C
004D0963   . 837D FC 00     CMP DWORD PTR SS:[EBP-4],0                 比較判斷註冊碼輸入是否為空
004D0967   . 74 14          JE SHORT SM6.004D097D                      跳就叫你再輸入
004D0969   . 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
004D096C   . 8B83 14030000  MOV EAX,DWORD PTR DS:[EBX+314]
004D0972   . E8 A549F7FF    CALL SM6.0044531C
004D0977   . 837D F8 00     CMP DWORD PTR SS:[EBP-8],0                 比較判斷使用者名稱輸入是否為空
004D097B   . 75 1D          JNZ SHORT SM6.004D099A                     跳就叫你再輸入
004D097D   > 6A 40          PUSH 40
004D097F   . B9 840B4D00    MOV ECX,SM6.004D0B84
004D0984   . BA 8C0B4D00    MOV EDX,SM6.004D0B8C
004D0989   . A1 D8954D00    MOV EAX,DWORD PTR DS:[4D95D8]
004D098E   . 8B00           MOV EAX,DWORD PTR DS:[EAX]
004D0990   . E8 FB4AF9FF    CALL SM6.00465490
004D0995   . E9 79010000    JMP SM6.004D0B13
004D099A   > 8BC3           MOV EAX,EBX
004D099C   . E8 27FEFFFF    CALL SM6.004D07C8                          *****計算比較註冊碼的關鍵call****
004D09A1   . 84C0           TEST AL,AL
004D09A3     0F84 5E010000  JE SM6.004D0B07                            ****判斷是否寫註冊碼,跳就不寫(往下看不就一清二楚)***
004D09A9   . 6A 40          PUSH 40
004D09AB   . B9 840B4D00    MOV ECX,SM6.004D0B84
004D09B0   . BA BC0B4D00    MOV EDX,SM6.004D0BBC
004D09B5   . A1 D8954D00    MOV EAX,DWORD PTR DS:[4D95D8]
004D09BA   . 8B00           MOV EAX,DWORD PTR DS:[EAX]
004D09BC   . E8 CF4AF9FF    CALL SM6.00465490                          提示註冊成功的call
004D09C1   . B2 01          MOV DL,1
004D09C3   . A1 E0274700    MOV EAX,DWORD PTR DS:[4727E0]
004D09C8   . E8 131FFAFF    CALL SM6.004728E0
004D09CD   . 8BF0           MOV ESI,EAX
004D09CF   . BA 02000080    MOV EDX,80000002
004D09D4   . 8BC6           MOV EAX,ESI
004D09D6   . E8 A51FFAFF    CALL SM6.00472980
004D09DB   . B1 01          MOV CL,1
004D09DD   . BA D40B4D00    MOV EDX,SM6.004D0BD4                       ASCII "Software\smsoft\sm6xp"
004D09E2   . 8BC6           MOV EAX,ESI
004D09E4   . E8 FB1FFAFF    CALL SM6.004729E4
004D09E9   . 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C]
004D09EC   . 8B83 10030000  MOV EAX,DWORD PTR DS:[EBX+310]
004D09F2   . E8 2549F7FF    CALL SM6.0044531C
004D09F7   . 8B4D F4        MOV ECX,DWORD PTR SS:[EBP-C]               裝入假碼
004D09FA   . BA F40B4D00    MOV EDX,SM6.004D0BF4                       ASCII "sm6sn"
004D09FF   . 8BC6           MOV EAX,ESI
004D0A01   . E8 9A21FAFF    CALL SM6.00472BA0                          寫假碼入登錄檔的call



進行認證碼檢測(觸發條件:過160就過期):......\smyx 執行1次登錄檔存放的此鍵值加8,
......\sm6rz 登錄檔存放驗證碼的地方 
004D2902  |> 8D45 EC        /LEA EAX,DWORD PTR SS:[EBP-14]
004D2905  |. 50             |PUSH EAX
004D2906  |. B9 01000000    |MOV ECX,1
004D290B  |. 8BD6           |MOV EDX,ESI
004D290D  |. 8B45 F8        |MOV EAX,DWORD PTR SS:[EBP-8]              裝入code1
004D2910  |. E8 3B26F3FF    |CALL SM6.00404F50
004D2915  |. 8B45 EC        |MOV EAX,DWORD PTR SS:[EBP-14]             code1逐位裝入eax
004D2918  |. E8 D325F3FF    |CALL SM6.00404EF0
004D291D  |. 8A00           |MOV AL,BYTE PTR DS:[EAX]
004D291F  |. 8845 F3        |MOV BYTE PTR SS:[EBP-D],AL
004D2922  |. 8D55 E8        |LEA EDX,DWORD PTR SS:[EBP-18]
004D2925  |. 33C0           |XOR EAX,EAX
004D2927  |. 8A45 F3        |MOV AL,BYTE PTR SS:[EBP-D]                code1逐位裝入al
004D292A  |. E8 5968F3FF    |CALL SM6.00409188                         生成對應驗證碼
004D292F  |. 8B55 E8        |MOV EDX,DWORD PTR SS:[EBP-18]             驗證碼湊2位入edx
004D2932  |. 8D45 F4        |LEA EAX,DWORD PTR SS:[EBP-C]
004D2935  |. E8 C623F3FF    |CALL SM6.00404D00                         驗證碼進行連線
004D293A  |. 46             |INC ESI
004D293B  |. 4B             |DEC EBX
004D293C  |.^75 C4          \JNZ SHORT SM6.004D2902
004D293E  |> B2 01          MOV DL,1                                   生成前部分認證碼code=(計算code1)
004D2940  |. A1 E0274700    MOV EAX,DWORD PTR DS:[4727E0]
004D2945  |. E8 96FFF9FF    CALL SM6.004728E0
004D294A  |. 8BD8           MOV EBX,EAX
004D294C  |. BA 01000080    MOV EDX,80000001
004D2951  |. 8BC3           MOV EAX,EBX
004D2953  |. E8 2800FAFF    CALL SM6.00472980
004D2958  |. B1 01          MOV CL,1
004D295A  |. BA 0C2A4D00    MOV EDX,SM6.004D2A0C                       ASCII "Software\Microsoft\Windows\CurrentVersion\rzsm6"
004D295F  |. 8BC3           MOV EAX,EBX
004D2961  |. E8 7E00FAFF    CALL SM6.004729E4
004D2966  |. BA 442A4D00    MOV EDX,SM6.004D2A44                       ASCII "sm6rz"
004D296B  |. 8BC3           MOV EAX,EBX
004D296D  |. E8 F203FAFF    CALL SM6.00472D64
004D2972  |. 84C0           TEST AL,AL
004D2974  |. 75 13          JNZ SHORT SM6.004D2989                     認證碼為0就將ASCII "7211213"寫入登錄檔
004D2976  |. B9 542A4D00    MOV ECX,SM6.004D2A54                       ASCII "7211213"
004D297B  |. BA 442A4D00    MOV EDX,SM6.004D2A44                       ASCII "sm6rz"
004D2980  |. 8BC3           MOV EAX,EBX
004D2982  |. E8 1902FAFF    CALL SM6.00472BA0
004D2987  |. EB 32          JMP SHORT SM6.004D29BB
004D2989  |> 8D4D E4        LEA ECX,DWORD PTR SS:[EBP-1C]
004D298C  |. BA 442A4D00    MOV EDX,SM6.004D2A44                       ASCII "sm6rz"
004D2991  |. 8BC3           MOV EAX,EBX
004D2993  |. E8 3402FAFF    CALL SM6.00472BCC                          裝入認證碼(假碼)的call
004D2998  |. 8B45 E4        MOV EAX,DWORD PTR SS:[EBP-1C]
004D299B  |. 50             PUSH EAX
004D299C  |. 8D45 E0        LEA EAX,DWORD PTR SS:[EBP-20]
004D299F  |. B9 642A4D00    MOV ECX,SM6.004D2A64                       ASCII "0381"
004D29A4  |. 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]
004D29A7  |. E8 9823F3FF    CALL SM6.00404D44                          連線認證碼:認證碼格式--(code+0381)
004D29AC  |. 8B55 E0        MOV EDX,DWORD PTR SS:[EBP-20]
004D29AF  |. 58             POP EAX
004D29B0  |. E8 8724F3FF    CALL SM6.00404E3C                          比較真假認證碼的call
004D29B5     75 04          JNZ SHORT SM6.004D29BB                     ***比較驗證碼的關鍵跳轉--爆破點***


計算註冊碼演算法部分: 
004D2D39  |. E8 8EFEF9FF    CALL SM6.00472BCC                          啟動時裝入登錄檔假碼
004D2D3E  |. 33C0           XOR EAX,EAX
004D2D40  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX               下面一行就是演算法開始了
004D2D43  |. 68 A42E4D00    PUSH SM6.004D2EA4                          ASCII "S6L"
004D2D48  |. 8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10]
004D2D4B  |. B0 63          MOV AL,63
004D2D4D  |. E8 D2F4FFFF    CALL SM6.004D2224                          生成8位資料code1(即C盤卷標值)
004D2D52  |. FF75 F0        PUSH DWORD PTR SS:[EBP-10]
004D2D55  |. 68 B02E4D00    PUSH SM6.004D2EB0
004D2D5A  |. 8D55 EC        LEA EDX,DWORD PTR SS:[EBP-14]
004D2D5D  |. B0 64          MOV AL,64
004D2D5F  |. E8 C0F4FFFF    CALL SM6.004D2224                          生成8位資料code2(即D盤卷標值)
004D2D64  |. FF75 EC        PUSH DWORD PTR SS:[EBP-14]
004D2D67  |. 68 BC2E4D00    PUSH SM6.004D2EBC
004D2D6C  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
004D2D6F  |. BA 05000000    MOV EDX,5
004D2D74  |. E8 3F20F3FF    CALL SM6.00404DB8                          按"S6L"+code1+'J'+code2+'L'形式進行連線形成機器碼
004D2D79  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
004D2D7C  |. E8 771FF3FF    CALL SM6.00404CF8                          大概是取機器碼的長度
004D2D81  |. 8BD8           MOV EBX,EAX
004D2D83  |. 85DB           TEST EBX,EBX
004D2D85  |. 7E 64          JLE SHORT SM6.004D2DEB
004D2D87  |. BE 01000000    MOV ESI,1
004D2D8C  |> 8D45 E8        /LEA EAX,DWORD PTR SS:[EBP-18]
004D2D8F  |. 50             |PUSH EAX
004D2D90  |. 68 A42E4D00    |PUSH SM6.004D2EA4                         ASCII "S6L"
004D2D95  |. 8D55 E0        |LEA EDX,DWORD PTR SS:[EBP-20]
004D2D98  |. B0 63          |MOV AL,63
004D2D9A  |. E8 85F4FFFF    |CALL SM6.004D2224                         取code1
004D2D9F  |. FF75 E0        |PUSH DWORD PTR SS:[EBP-20]
004D2DA2  |. 68 B02E4D00    |PUSH SM6.004D2EB0
004D2DA7  |. 8D55 DC        |LEA EDX,DWORD PTR SS:[EBP-24]
004D2DAA  |. B0 64          |MOV AL,64
004D2DAC  |. E8 73F4FFFF    |CALL SM6.004D2224                         取code2
004D2DB1  |. FF75 DC        |PUSH DWORD PTR SS:[EBP-24]
004D2DB4  |. 68 BC2E4D00    |PUSH SM6.004D2EBC
004D2DB9  |. 8D45 E4        |LEA EAX,DWORD PTR SS:[EBP-1C]
004D2DBC  |. BA 05000000    |MOV EDX,5
004D2DC1  |. E8 F21FF3FF    |CALL SM6.00404DB8
004D2DC6  |. 8B45 E4        |MOV EAX,DWORD PTR SS:[EBP-1C]
004D2DC9  |. B9 01000000    |MOV ECX,1
004D2DCE  |. 8BD6           |MOV EDX,ESI
004D2DD0  |. E8 7B21F3FF    |CALL SM6.00404F50
004D2DD5  |. 8B45 E8        |MOV EAX,DWORD PTR SS:[EBP-18]
004D2DD8  |. E8 1321F3FF    |CALL SM6.00404EF0
004D2DDD  |. 8A00           |MOV AL,BYTE PTR DS:[EAX]
004D2DDF  |. 25 FF000000    |AND EAX,0FF
004D2DE4  |. 0145 FC        |ADD DWORD PTR SS:[EBP-4],EAX
004D2DE7  |. 46             |INC ESI
004D2DE8  |. 4B             |DEC EBX
004D2DE9  |.^75 A1          \JNZ SHORT SM6.004D2D8C
004D2DEB  |> 68 C82E4D00    PUSH SM6.004D2EC8                          ASCII "L6A"
004D2DF0  |. 8D55 D4        LEA EDX,DWORD PTR SS:[EBP-2C]
004D2DF3  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004D2DF6  |. 8D0440         LEA EAX,DWORD PTR DS:[EAX+EAX*2]
004D2DF9  |. E8 8A63F3FF    CALL SM6.00409188
004D2DFE  |. FF75 D4        PUSH DWORD PTR SS:[EBP-2C]                 第一部分註冊碼M1
004D2E01  |. 68 D42E4D00    PUSH SM6.004D2ED4                          ASCII "1213"
004D2E06  |. 68 E42E4D00    PUSH SM6.004D2EE4                          ASCII "XU"
004D2E0B  |. 8D55 D0        LEA EDX,DWORD PTR SS:[EBP-30]
004D2E0E  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004D2E11  |. 03C0           ADD EAX,EAX
004D2E13  |. E8 7063F3FF    CALL SM6.00409188
004D2E18  |. FF75 D0        PUSH DWORD PTR SS:[EBP-30]                 第二部分註冊碼M2
004D2E1B  |. 68 F02E4D00    PUSH SM6.004D2EF0                          ASCII "721"
004D2E20  |. 8D45 D8        LEA EAX,DWORD PTR SS:[EBP-28]
004D2E23  |. BA 06000000    MOV EDX,6
004D2E28  |. E8 8B1FF3FF    CALL SM6.00404DB8                          啟動時最後生成真註冊碼的call,註冊碼形式就是L6A+M1+1213XU+M2+721
004D2E2D  |. 8B55 D8        MOV EDX,DWORD PTR SS:[EBP-28]
004D2E30  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004D2E33  |. E8 0420F3FF    CALL SM6.00404E3C                          啟動時真假註冊碼比較的call
004D2E38     75 04          JNZ SHORT SM6.004D2E3E                     *****註冊碼正確,不能跳*****

計算註冊碼演算法細節部分:
004D07FC  |. E8 1B4BF7FF    CALL SM6.0044531C                                取機器碼的call
004D0801  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]                     機器碼裝入eax
004D0804  |. E8 EF44F3FF    CALL SM6.00404CF8
004D0809  |. 8BD8           MOV EBX,EAX
004D080B  |. 85DB           TEST EBX,EBX
004D080D  |. 7E 3F          JLE SHORT SM6.004D084E
004D080F  |. BE 01000000    MOV ESI,1
004D0814  |> 8D45 F0        /LEA EAX,DWORD PTR SS:[EBP-10]
004D0817  |. 50             |PUSH EAX
004D0818  |. 8D55 EC        |LEA EDX,DWORD PTR SS:[EBP-14]
004D081B  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
004D081E  |. 8B80 0C030000  |MOV EAX,DWORD PTR DS:[EAX+30C]
004D0824  |. E8 F34AF7FF    |CALL SM6.0044531C
004D0829  |. 8B45 EC        |MOV EAX,DWORD PTR SS:[EBP-14]                   機器碼裝入eax
004D082C  |. B9 01000000    |MOV ECX,1
004D0831  |. 8BD6           |MOV EDX,ESI
004D0833  |. E8 1847F3FF    |CALL SM6.00404F50
004D0838  |. 8B45 F0        |MOV EAX,DWORD PTR SS:[EBP-10]
004D083B  |. E8 B046F3FF    |CALL SM6.00404EF0
004D0840  |. 8A00           |MOV AL,BYTE PTR DS:[EAX]
004D0842  |. 25 FF000000    |AND EAX,0FF
004D0847  |. 0145 F8        |ADD DWORD PTR SS:[EBP-8],EAX
004D084A  |. 46             |INC ESI
004D084B  |. 4B             |DEC EBX
004D084C  |.^75 C6          \JNZ SHORT SM6.004D0814                          此迴圈是計算機器碼的位元組和
004D084E  |> 8D55 E8        LEA EDX,DWORD PTR SS:[EBP-18]
004D0851  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004D0854  |. 8B80 10030000  MOV EAX,DWORD PTR DS:[EAX+310]
004D085A  |. E8 BD4AF7FF    CALL SM6.0044531C                                撥出假碼
004D085F  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]                    假碼裝入eax
004D0862  |. 50             PUSH EAX
004D0863  |. 68 F8084D00    PUSH SM6.004D08F8                                ASCII "L6A"
004D0868  |. 8D55 E0        LEA EDX,DWORD PTR SS:[EBP-20]                    機器碼的位元組和(sum)
004D086B  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]                     M1-參算碼=機器碼的位元組和*3
004D086E  |. 8D0440         LEA EAX,DWORD PTR DS:[EAX+EAX*2]
004D0871  |. E8 1289F3FF    CALL SM6.00409188                                生成M1
004D0876  |. FF75 E0        PUSH DWORD PTR SS:[EBP-20]
004D0879  |. 68 04094D00    PUSH SM6.004D0904                                ASCII "1213"
004D087E  |. 68 14094D00    PUSH SM6.004D0914                                ASCII "XU"
004D0883  |. 8D55 DC        LEA EDX,DWORD PTR SS:[EBP-24]
004D0886  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]                     機器碼的位元組和(sum)
004D0889  |. 03C0           ADD EAX,EAX                                      M2-參算碼=機器碼的位元組和*2
004D088B  |. E8 F888F3FF    CALL SM6.00409188                                生成M2
004D0890  |. FF75 DC        PUSH DWORD PTR SS:[EBP-24]
004D0893  |. 68 20094D00    PUSH SM6.004D0920                                ASCII "721"
004D0898  |. 8D45 E4        LEA EAX,DWORD PTR SS:[EBP-1C]
004D089B  |. BA 06000000    MOV EDX,6
004D08A0  |. E8 1345F3FF    CALL SM6.00404DB8                                計算組裝註冊碼的call
004D08A5  |. 8B55 E4        MOV EDX,DWORD PTR SS:[EBP-1C]
004D08A8  |. 58             POP EAX
004D08A9  |. E8 8E45F3FF    CALL SM6.00404E3C                                關鍵註冊碼比較call
004D08AE  |. 75 04          JNZ SHORT SM6.004D08B4


五、【序號產生器和演算法】:
機器碼="S6L"+變code1+'J'+變code2+'L'(21位)
註冊碼="L6A"+M1+"1213XU"+M2+"721"
認證碼=code+"0381"
Sum=機器碼的位元組和
M1-參算碼=sum*3
M2-參算碼=sum*2
code1=(C盤卷標值)
M1、M2和(code1每位)都是參與計算註冊碼和認證碼的部分

公共計算參算碼的程式碼部分:
省略大量程式碼。。。跟蹤算碼部分來到這個關鍵地方。。。
eax裝入參算碼(被除數)
00409DEE  |$ B9 0A000000    MOV ECX,0A                                 置除數Ah
00409DF3  |> 8D75 9F        LEA ESI,DWORD PTR SS:[EBP-61]
00409DF6  |> 31D2           /XOR EDX,EDX                               餘數位置清零
00409DF8  |. F7F1           |DIV ECX                                   eax/A
00409DFA  |. 80C2 30        |ADD DL,30                                 餘數+30h
00409DFD  |. 80FA 3A        |CMP DL,3A
00409E00  |. 72 03          |JB SHORT SM6.00409E05                     >=3Ah,dl+7h
00409E02  |. 80C2 07        |ADD DL,7                                
00409E05  |> 4E             |DEC ESI
00409E06  |. 8816           |MOV BYTE PTR DS:[ESI],DL                  結果放入預定位置(注意:順序為倒序)
00409E08  |. 09C0           |OR EAX,EAX
00409E0A  |.^75 EA          \JNZ SHORT SM6.00409DF6                    被除數為0就結束


下面是我在Turbo C下勉強透過的演算法序號產生器:歡迎指正(語病、精簡、更好的便徑)
#include 
#include 

unsigned int r,i;
unsigned char q[20];
unsigned int f(int n)
{i=0;
 while(n!=0)
   {r=n%0xa+0x30;
    n=n/0xa;
    if(r>=0x3A)
    {r+=7;}
    q[i]=r;
    i+=1;
   }
 return(q[0]);
}

main()
{unsigned int code_len,sum=0,r,i,j,n,m1,m2,temp;
unsigned char code[21],x,y,z,resn[8];
start: printf("\n");
         printf(" *************************************************************\n");
         printf("*            XXXX網頁特效精靈6.0 XP特別版 KeyGen              *\n");
         printf("*                    Code by NewHand[BCG]                     *\n");
         printf("*   Copyright-2003 [BCG] All Rights Reserved    2003-10-30    *\n");
         printf(" *************************************************************\n");
printf("提示:\n註冊碼在主程式sm6.exe註冊框輸入!\n認證碼在sm6reg.exe認證框輸入!\n\n");
printf("請輸入你的機器碼:");
gets(code);
printf("\n");
code_len=strlen(code);
if(code_len!=21)
{
printf("\n你輸入的機器碼不對!\n\n");
goto start;
}
else
{for(i=0;i<=code_len;i++)
sum=sum+code[i];
m1=sum*3;
m2=sum*2;

printf("\n你的認證碼是:");
for(i=0;i<=7;i++)
{resn[i]=code[3+i];
z=f(resn[i]);
printf("%c%c",q[1],q[0]);
}
printf("0381\n");

x=f(m1);
for(j=0;j<=strlen(q)/2;j++)
{temp=q[j];q[j]=q[strlen(q)-1-j];q[strlen(q)-1-j]=temp;
}
printf("\n你的註冊碼是:L6A");
printf("%s",q);
printf("1213XU");

y=f(m2);
for(j=0;j<=strlen(q)/2;j++)
{temp=q[j];q[j]=q[strlen(q)-1-j];q[strlen(q)-1-j]=temp;
}
printf("%s",q);
printf("721");
         printf("\n\n\n");
printf("              _/_/_/   _/_/_/   _/_/_/ \n");
printf("              _/  _/ _/     _/        \n");
printf("             _/_/_/  _/     _/ _/_/   \n");
printf("             _/  _/ _/     _/  _/    \n");
printf("            _/_/_/   _/_/_/   _/_/_/     \n");
}
}

相關文章