用KEYMAKE製作記憶體序號產生器特殊一例 (11千字)

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

用KEYMAKE製作記憶體序號產生器特殊一例

軟體名稱:鼠×××3.0(國產軟體)
未註冊版限制:1、每次啟動時出現註冊窗體;
            2、儲存的圖示、點陣圖可能被隨機加上一些雜點。
破解工具:pe-scan 3.12、W32DASM 8.93漢化版、OllyDbg v1.07b。
破解人:飛鷹[BCG]
E-mail:flithawk@163.com
網址:http://flithawk.longcity.net
破解步驟:用 pe-scan 檢測可以知道軟體被 ASPack1.07b 加了殼,先找個自動脫殼工具脫殼。脫殼後啟動軟體,首先跳出一個註冊窗體,在這個窗體的註冊碼框中輸入20位的註冊碼後,軟體要求重啟校驗註冊碼。這時,你會發現軟體所在的目錄下生成了一個 sign.ini 檔案,該檔案中存放的就是你剛才所輸入的註冊碼,註冊碼的形式為*****-*****,其中用“-”符號把你輸入的註冊碼分為前半部分和後半部分。下面,我們就從 sign.ini 檔案入手開始破解,用 W32DASM 反編譯後查詢“sign.ini”,共可找到下面兩處地方:

查詢到的第一處:

* Possible StringData Ref from Data Obj ->"註冊"
                                  |
:00404D1C 6820224100              push 00412220

* Possible StringData Ref from Data Obj ->"程式需要關閉以更新設定,再次啟動後即可知道註冊是否成功"
                                  |
:00404D21 68E8214100              push 004121E8
:00404D26 50                      push eax

* Reference To: USER32.MessageBoxA, Ord:01BEh
                                  |
:00404D27 FF15C4014100            Call dword ptr [004101C4]

* Possible StringData Ref from Data Obj ->"wb"
                                  |
:00404D2D 6834214100              push 00412134

* Possible StringData Ref from Data Obj ->"sign.ini"
                                  |
:00404D32 68DC214100              push 004121DC
:00404D37 E8E8220000              call 00407024
:00404D3C 83C408                  add esp, 00000008
:00404D3F 8D4C240C                lea ecx, dword ptr [esp+0C]
:00404D43 8BF0                    mov esi, eax
:00404D45 6800010000              push 00000100
:00404D4A 51                      push ecx
:00404D4B 8B8FE8000000            mov ecx, dword ptr [edi+000000E8]
:00404D51 E8EAC3FFFF              call 00401140
:00404D56 8D54240C                lea edx, dword ptr [esp+0C]
:00404D5A 56                      push esi
:00404D5B 52                      push edx
:00404D5C E845240000              call 004071A6
:00404D61 8B4604                  mov eax, dword ptr [esi+04]
:00404D64 83C408                  add esp, 00000008
:00404D67 48                      dec eax
:00404D68 894604                  mov dword ptr [esi+04], eax
:00404D6B 780C                    js 00404D79
:00404D6D 8B06                    mov eax, dword ptr [esi]
:00404D6F C6002D                  mov byte ptr [eax], 2D
:00404D72 8B06                    mov eax, dword ptr [esi]
:00404D74 40                      inc eax
:00404D75 8906                    mov dword ptr [esi], eax
:00404D77 EB0B                    jmp 00404D84
..................................................省
..................................................略

這裡是把你輸入的註冊碼寫入到 sign.ini 檔案中後,並重新啟動軟體。

查詢到的第二處:

* Referenced by a CALL at Addresses:
|:00401C17  , :00405381 
|
:00405770 A004394100              mov al, byte ptr [00413904]
:00405775 81EC94010000            sub esp, 00000194
:0040577B 84C0                    test al, al
:0040577D 56                      push esi
:0040577E 0F8511010000            jne 00405895

* Possible StringData Ref from Data Obj ->"rb"
                                  |
:00405784 68B0204100              push 004120B0

* Possible StringData Ref from Data Obj ->"sign.ini"
                                  |
:00405789 68DC214100              push 004121DC
:0040578E E891180000              call 00407024
:00405793 8BF0                    mov esi, eax
:00405795 83C408                  add esp, 00000008
:00405798 85F6                    test esi, esi
:0040579A 7511                    jne 004057AD
:0040579C C6050439410001          mov byte ptr [00413904], 01
:004057A3 32C0                    xor al, al
:004057A5 5E                      pop esi
:004057A6 81C494010000            add esp, 00000194
:004057AC C3                      ret
..................................................省
..................................................略
:00405885 51                      push ecx
:00405886 52                      push edx
:00405887 E824FCFFFF              call 004054B0==>比較註冊碼,進入此Call繼續跟蹤
:0040588C 83C418                  add esp, 00000018
:0040588F A205394100              mov byte ptr [00413905], al
:00405894 5F                      pop edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040577E(C)
|
:00405895 A005394100              mov al, byte ptr [00413905]
:0040589A C6050439410001          mov byte ptr [00413904], 01
:004058A1 5E                      pop esi
:004058A2 81C494010000            add esp, 00000194
:004058A8 C3                      ret

這裡是軟體啟動時判斷從 sign.ini 檔案中讀取的註冊碼是否正確。

進入 004054B0 後,來到下面這裡:

設:(1) code1=你輸入的假註冊碼前半部分,code2=真註冊碼前半部分,code3=你輸入的假註冊碼後半部分,code2=真註冊碼後半部分;(2) 初始狀態時 x1=code1的第一位,y1=code2的第一位,x3=code3的第一位,y3=code4的第一位;(3) 動態變數 x2,y2,x4,y4。

004054B0  /$ 83EC 18        SUB ESP,18
004054B3  |. 53            PUSH EBX
004054B4  |. 56            PUSH ESI
004054B5  |. 57            PUSH EDI
004054B6  |. E8 C5FFFFFF    CALL 鼠×××.00405480
004054BB  |. 8BF8          MOV EDI,EAX
004054BD  |. 8D4424 0C      LEA EAX,DWORD PTR SS:[ESP+C]
004054C1  |. 81F7 17108519  XOR EDI,19851017
004054C7  |. 6A 24          PUSH 24                                  ; /Arg3 = 00000024
004054C9  |. 50            PUSH EAX                                ; |Arg2
004054CA  |. 57            PUSH EDI                                ; |Arg1
004054CB  |. E8 CFA70000    CALL 鼠×××.0040FC9F                  ; \鼠×××.0040FC9FFC9F
004054D0  |. 8B4424 34      MOV EAX,DWORD PTR SS:[ESP+34]==>這裡 d eax 可以看到真註冊碼前半部分
004054D4  |. 83C4 0C        ADD ESP,0C
004054D7  |. 8D7424 0C      LEA ESI,DWORD PTR SS:[ESP+C]
**********************************開始比較前半部分註冊碼****************************************
004054DB  |> 8A10          /MOV DL,BYTE PTR DS:[EAX]          //x2=x1;dl=x2
004054DD  |. 8A1E          |MOV BL,BYTE PTR DS:[ESI]          //y2=y1;bl=y2
004054DF  |. 8ACA          |MOV CL,DL                          //cl=dl
004054E1  |. 3AD3          |CMP DL,BL                          //比較dl是否等於bl
004054E3    75 1E          JNZ SHORT 鼠×××.00405503        //不相等跳轉則註冊失敗
004054E5    84C9          TEST CL,CL                          //判斷code1中是否還有值需要比較
004054E7    74 16          JE SHORT 鼠到擒來.004054FF          //相等跳轉則說明code1中已無值
004054E9  |. 8A50 01        |MOV DL,BYTE PTR DS:[EAX+1]        //x2=x2+1;dl=x2
004054EC  |. 8A5E 01        |MOV BL,BYTE PTR DS:[ESI+1]        //y2=y2+1;bl=y2
004054EF  |. 8ACA          |MOV CL,DL                          //cl=dl
004054F1  |. 3AD3          |CMP DL,BL                          //比較dl是否等於bl
004054F3    75 0E          JNZ SHORT 鼠×××.00405503        //不相等跳轉則註冊失敗
004054F5  |. 83C0 02        |ADD EAX,2                          //x1=x1+2;eax=x1
004054F8  |. 83C6 02        |ADD ESI,2                          //y1=y1+2;esi=y1
004054FB  |. 84C9          |TEST CL,CL                        //判斷code1中是否還有值需要比較
004054FD  |.^75 DC          \JNZ SHORT 鼠×××.004054DB        //跳轉說明code1中還有值,迴圈比較
**********************************結束比較前半部分註冊碼****************************************
004054FF  |> 33C0          XOR EAX,EAX
00405501  |. EB 05          JMP SHORT 鼠×××.00405508
00405503  |> 1BC0          SBB EAX,EAX
00405505  |. 83D8 FF        SBB EAX,-1
00405508  |> 85C0          TEST EAX,EAX
0040550A    75 6B          JNZ SHORT 鼠×××.00405577
0040550C  |. B8 01000000    MOV EAX,1
00405511  |> 8BC8          /MOV ECX,EAX
00405513  |. 0FAFF9        |IMUL EDI,ECX
00405516  |. 40            |INC EAX
00405517  |. 83F8 0A        |CMP EAX,0A
0040551A  |.^7C F5          \JL SHORT 鼠×××.00405511
0040551C  |. 8D5424 18      LEA EDX,DWORD PTR SS:[ESP+18]
00405520  |. 6A 24          PUSH 24                                  ; /Arg3 = 00000024
00405522  |. 52            PUSH EDX                                ; |Arg2
00405523  |. 57            PUSH EDI                                ; |Arg1
00405524  |. E8 76A70000    CALL 鼠×××.0040FC9F                  ; \鼠×××.0040FC9FFC9F
00405529  |. 8B4424 38      MOV EAX,DWORD PTR SS:[ESP+38]==>這裡 d eax 可以看到真註冊碼後半部分
0040552D  |. 83C4 0C        ADD ESP,0C
00405530  |. 8D7424 18      LEA ESI,DWORD PTR SS:[ESP+18]
**********************************開始比較後半部分註冊碼****************************************
00405534  |> 8A10          /MOV DL,BYTE PTR DS:[EAX]          //x4=x3;dl=x4
00405536  |. 8A1E          |MOV BL,BYTE PTR DS:[ESI]          //y4=y3;bl=y4
00405538  |. 8ACA          |MOV CL,DL                          //cl=dl
0040553A  |. 3AD3          |CMP DL,BL                          //比較dl是否等於bl
0040553C  |. 75 28          |JNZ SHORT 鼠×××.00405566        //不相等跳轉則註冊失敗
0040553E  |. 84C9          |TEST CL,CL                        //判斷code3中是否還有值需要比較
00405540  |. 74 16          |JE SHORT 鼠×××.00405558        //相等跳轉則說明code3中已無值
00405542  |. 8A50 01        |MOV DL,BYTE PTR DS:[EAX+1]        //x4=x4+1;dl=x4
00405545  |. 8A5E 01        |MOV BL,BYTE PTR DS:[ESI+1]        //y4=y4+1;bl=y4
00405548  |. 8ACA          |MOV CL,DL                          //cl=dl
0040554A  |. 3AD3          |CMP DL,BL                          //比較dl是否等於bl
0040554C  |. 75 18          |JNZ SHORT 鼠×××.00405566        //不相等跳轉則註冊失敗
0040554E  |. 83C0 02        |ADD EAX,2                          //x3=x3+2;eax=x3
00405551  |. 83C6 02        |ADD ESI,2                          //y3=y3+2;esi=y3
00405554  |. 84C9          |TEST CL,CL                        //判斷code3中是否還有值需要比較
00405556  |.^75 DC          \JNZ SHORT 鼠×××.00405534        //跳轉說明code3中還有值,迴圈比較
**********************************結束比較後半部分註冊碼****************************************
00405558  |> 33C0          XOR EAX,EAX
0040555A  |. 5F            POP EDI
0040555B  |. 85C0          TEST EAX,EAX
0040555D  |. 5E            POP ESI
0040555E  |. 5B            POP EBX
0040555F  |. 0F94C0        SETE AL
00405562  |. 83C4 18        ADD ESP,18
00405565  |. C3            RETN

如果想分析註冊演算法,寫註冊器的話,可以進入 CALL 鼠×××.0040FC9F 就知道真註冊碼是如何算出來的了。但我彙編功力有限,對該軟體的註冊演算法沒有研究清楚,所以就先用KEYMAKE製作一個記憶體序號產生器吧!

通過上面的分析,我們可以看出該軟體比較註冊碼分為前後兩個部分,如果前半部分的註冊碼錯誤,用記憶體序號產生器就只能得到前半部分的真註冊碼,無法得到後半部分的真註冊碼。所以,在製作記憶體序號產生器時,需要把該軟體記憶體地址 004054E3 處的 751E 修改為 7527,即把JNZ SHORT 鼠×××.00405503 改為 JNZ SHORT 鼠×××.0040550C,這樣當使用者輸入錯誤註冊碼時就可以從記憶體中直接取得真註冊碼前後兩部分的值了。

我用的KEYMAKE版本號為1.69,要使用1.40以上的版本才具有修改記憶體的功能。設定如下:

1、中斷地址:405529-->中斷次數:1-->第一個位元組:8B-->指令長度:4;
2、選中“儲存下列資訊為註冊碼”-->選擇“記憶體方式”-->記憶體地址:68F428(真註冊碼前半部分的存放地址)-->在結尾處插入字元:-(真註冊碼前後部分的分隔符);
3、主介面上選擇“修改記憶體”-->修改地址:4054E4-->修改長度:1-->原始指令:1E-->修改指令:27;
4、主介面上的註冊碼方式選擇“記憶體方式”-->暫存器:EAX(真註冊碼後半部分的存放地址)。

經過這四步以後,執行製作出來的記憶體序號產生器就可以完全正確顯示出真的註冊碼了,顯示出來的註冊碼格式為:*****-*****。至此,記憶體序號產生器制作完成。

僅以此篇獻給我們的BCG組織,也算是自己的一次Crack練習吧!


                                          Crack by 飛鷹[BCG]  flithawk@163.com  2002.8.15
                                          歡迎光臨漢化新世紀: http://www.hanzify.org

相關文章