用KEYMAKE製作記憶體序號產生器特殊一例 (11千字)
用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
相關文章
- 如何製作VB程式記憶體序號產生器--國內某軟體的序號產生器(隱去軟體資訊)
(14千字)2002-08-04記憶體
- 用keymake制序號產生器實戰~高手莫入~~ (1千字)2001-09-30
- 軟體採用非明碼比較的KEYMAKE記憶體序號產生器制作
(754字)2015-11-15記憶體
- 製作自己的記憶體序號產生器--------檔案隱藏精靈註冊碼獲取 (4千字)2015-11-15記憶體
- 製作mIRC6.02序號產生器(給別人寫的初學者序號產生器教材) (14千字)2015-11-15
- 一個CrackMe的破解以及序號產生器的製作
(4千字)2001-08-16
- EditPlus 2.01b 序號產生器的製作 (22千字)2001-09-10
- winzip序號產生器 (1千字)2001-04-12
- 美萍安全衛士V8.45序號產生器制作分析過程,及序號產生器! (11千字)2001-10-28
- 序號產生器制分析: (1千字)2001-11-19
- MP3 explorer 破解和序號產生器的製作2015-11-15
- winzip的通用序號產生器 (2千字)2001-12-10
- 註冊FreeRes.exe V0.94,並用Keymake 1.33版本做它的序號產生器! (6千字)2002-01-05
- 橋牌軟體Deep Finesse的序號產生器 (1千字)2015-11-15
- 破解accoustica
2.21(帶序號產生器)----讓高手見笑了:) (11千字)2002-03-31
- 序號產生器合集2024-03-17
- Gif2Swf Ver 2.1 TC20序號產生器 && MASM32序號產生器 (4千字)2001-12-10ASM
- 序號產生器寫作教學。奉賢給想加入CCG和BCG的朋友。 (11千字)2001-10-21
- 《淺談利用RSA演算法防止非法序號產生器的製作》2004-05-20演算法
- supercapture3.0的版序號產生器!
(4千字)2002-04-23APT
- IrfanView 序號產生器分析(初級版)
(13千字)2015-11-15View
- Kalua Cocktails 1.1完全破解,內附彙編序號產生器(用序號產生器編寫器,並有它的使用教程)
(22千字)2002-02-27AI
- 2D動畫製作軟體:Moho Pro 14 for Mac 附序號產生器v14.1啟用版2023-11-23動畫Mac
- 影音神探V2.02 bY E語言 (註冊碼與爆破附記憶體序號產生器) (8千字)2015-11-15記憶體
- EmEditor V3.29和它的序號產生器 (12千字)2015-11-15
- 《DesktopX v1.0》PJ 記錄 + 序號產生器原始碼 (13千字)2015-11-15原始碼
- Myeclipse 6.5 序號產生器2020-04-06Eclipse
- 【獻寶】利用DebugAPI做一些原先手工完成的動作,我用這種方法做過記憶體補丁,記憶體序號產生器等,完全VC編譯
(6千字)2002-12-27API記憶體編譯
- Navicat Premiumx64 使用序號產生器啟用2018-11-12REM
- 2D動畫製作軟體:Moho Pro 14 for Mac 附序號產生器 圖文完整破解教程2023-11-27動畫Mac
- HappyIcon序號產生器TC原始碼 (1千字)2001-04-08APP原始碼
- NetTalk破解與序號產生器(高手勿進) (10千字)2001-09-20
- 分享一個navicat序號產生器2024-04-02
- Lc3&Lc4
註冊演算法分析及序號產生器的製作2004-06-18演算法
- win10如何執行序號產生器_win10怎麼執行序號產生器2020-08-28Win10
- Audio compositor註冊碼及序號產生器 (5千字)2002-04-06
- NewsReactor 1.0 Build 5009的序號產生器制分析 (16千字)2001-08-07ReactUI
- 另類序號產生器(一MFC程式的改造心得) (3千字)2001-09-10C程式