一个气象软件的算法跟踪:
【软件限制】:无功能限制,但启动时跳出注册窗口
【作者声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请各大侠赐教!
【破解工具】:Ollydbg1.09 中文版、W32Dasm8.93黄金版
—————————————————————————————
【过
程】:
呵呵,我们开工吧!唉!^-^^-^
我的水平很低,许多地方表达的有问题,烦请各位老师指教!
为了保护国人软件,软件信息不贴了,要的发个消息.
这个软件的注册是先输入试验码,然后加密放在软件目录下的REG.KEY
中,那么关键点的查找就从REG.KEY关键
值开始,用W32Dasm8.93黄金版反汇编它,然后查找reg.key关键字.
==========================================================
00402596
|. 68 34B74000 PUSH tqyb.0040B734
; ASCII "register.key"
0040259B |. C64424 3C 03 MOV BYTE PTR SS:[ESP+3C],
3
004025A0 |. E8 F1430000 CALL <JMP.&MFC42.#5186>
004025A5
|. 85C0 TEST EAX, EAX
004025A7
|. 75 41 JNZ SHORT tqyb.004025EA
**********************************************************
然后用Ollydbg1.09
中文版加载它,下中断在:
00402596 |. 68 34B74000 PUSH tqyb.0040B734 ; ASCII "register.key"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
运行程序,中断后不久就到了核心部分,来看看:
这里应该是计算部分1
00402900
/$ 8A41 37 MOV AL, BYTE PTR DS:[ECX+37]
; AL <== DS:[041E0BB]= 78
00402903 |. 8A51
3E MOV DL, BYTE PTR DS:[ECX+3E] ;
DL <== DS:[0041E0C2]=94
00402906 |. 8881 33040000 MOV
BYTE PTR DS:[ECX+433], AL
; 然后把得到的值==>DS:[0041E4B7]
0040290C
|. 8A41 4C MOV AL, BYTE PTR DS:[ECX+4C]
; 这说明输入的试验码是二个一组分开存放在reg.key中,这段程序就是解码
0040290F
|. 8891 32040000 MOV BYTE PTR DS:[ECX+432], DL
00402915
|. 8A51 61 MOV DL, BYTE PTR DS:[ECX+61]
00402918
|. 8881 2F040000 MOV BYTE PTR DS:[ECX+42F], AL
0040291E
|. 8A41 76 MOV AL, BYTE PTR DS:[ECX+76]
00402921
|. 8891 30040000 MOV BYTE PTR DS:[ECX+430], DL
00402927
|. BA DCFBFFFF MOV EDX, -424
0040292C |.
8881 31040000 MOV BYTE PTR DS:[ECX+431], AL
;
连接后就是输入的数字5612309478
00402932 |. 53
PUSH EBX
; 原来就是这样读出输入的数字的
00402933
|. 8D81 24040000 LEA EAX, DWORD PTR DS:[ECX+424]
00402939
|. 2BD1 SUB EDX, ECX
0040293B
|> 8A88 F4FBFFFF /MOV CL, BYTE PTR DS:[EAX-40C]
;
CL <== DS:[0041E09C] =36 ,这个地址内是机器码存放的地方,按照顺序放的
00402941 |.
8A58 0B |MOV BL, BYTE PTR DS:[EAX+B]
; BL <== DS:[0041E4B3] = 56 ,这个地址是输入的数字的存放的地方,顺序是从34521
00402944
|. 32CB |XOR CL, BL
;
CL= 36 XOR 56 =60
00402946 |. 8A18
|MOV BL, BYTE PTR DS:[EAX]
; BL
<== DS:[0041E4A8]=11 这个地址中是常数存放的地方
00402948 |. 32CB
|XOR CL, BL
; CL= 60 XOR 11 =71
0040294A
|. 75 10 |JNZ SHORT tqyb.0040295C
; 注册码关键比较的地方,即条件是56 xor 36 =11
0040294C
|. 40 |INC
EAX
; 关键的比较,实际上就是比较是不是相同
0040294D |. 8D0C02
|LEA ECX, DWORD PTR DS:[EDX+EAX>
00402950
|. 83F9 05 |CMP ECX, 5
; 这里是前10位的计算和比较部分
00402953
|.^ 7C E6 \JL SHORT tqyb.0040293B
00402955
|. B8 01000000 MOV EAX, 1
0040295A |.
5B POP EBX
0040295B
|. C3 RETN
0040295C |>
33C0 XOR EAX, EAX
0040295E
|. 5B POP EBX
0040295F
\. C3 RETN
-----------------------------------------------------
这里应该是计算部分2
00402960
/$ 8A81 8B000000 MOV AL, BYTE PTR DS:[ECX+8B]
; AL <== DS:[0041E10F]=12 (
00402966 |.
8A91 F4000000 MOV DL, BYTE PTR DS:[ECX+F4]
0040296C |.
8881 2F040000 MOV BYTE PTR DS:[ECX+42F], AL
00402972 |.
8A81 F9000000 MOV AL, BYTE PTR DS:[ECX+F9]
00402978 |.
8891 30040000 MOV BYTE PTR DS:[ECX+430], DL
0040297E |.
8A91 09010000 MOV DL, BYTE PTR DS:[ECX+109]
00402984 |.
8881 31040000 MOV BYTE PTR DS:[ECX+431], AL
0040298A |.
8A81 DB010000 MOV AL, BYTE PTR DS:[ECX+1DB]
00402990 |.
8891 32040000 MOV BYTE PTR DS:[ECX+432], DL
;
这说明输入的试验码是二个一组分开存放在reg.key中,这段程序就是解码
00402996 |. BA D7FBFFFF
MOV EDX, -429
0040299B |. 8881 33040000 MOV
BYTE PTR DS:[ECX+433], AL
; 第二次把输入的试验码的后10位安顺序放在DS:[0041E4B3]中
004029A1
|. 53 PUSH EBX
004029A2
|. 8D81 29040000 LEA EAX, DWORD PTR DS:[ECX+429]
004029A8
|. 2BD1 SUB EDX, ECX
004029AA
|> 8A88 F4FBFFFF /MOV CL, BYTE PTR DS:[EAX-40C]
;
CL <== DS:[0041E0A1] =21 ,这个地址内是机器码后10位存放的地方,按照顺序放的
004029B0 |.
8A58 06 |MOV BL, BYTE PTR DS:[EAX+6]
; BL <== DS:[0041E4B3] = 12 ,这个地址是输入的数字的后10位存放的地方,顺序
004029B3
|. 32CB |XOR CL, BL
004029B5
|. 8A18 |MOV BL, BYTE
PTR DS:[EAX]
; BL <== DS:[0041E4AD] = AA
(常数的地址)
004029B7 |. 32CB |XOR
CL, BL
004029B9 |. 75 10
|JNZ SHORT tqyb.004029CB
; 关键的比较,实际上就是比较是不是相同
004029BB
|. 40 |INC
EAX
004029BC |. 8D0C02 |LEA
ECX, DWORD PTR DS:[EDX+EAX>
004029BF |. 83F9 05
|CMP ECX, 5
; 这里是后10位的计算和比较部分
004029C2 |.^ 7C
E6 \JL SHORT tqyb.004029AA
004029C4
|. B8 01000000 MOV EAX, 1
004029C9 |.
5B POP EBX
004029CA
|. C3 RETN
===================================================
以下是内存中的关键数据:
0041E4A8
11 33 55 77 99 AA CC BB 3Uw櫔袒 <==参数
0041E4B0 EE
FF
56 12 30
94 78 ?.V0攛 <== 输入的数字 (分两次调入,每次10位)
0041E098
36 B5 44 13 @4.6礑
<==机器码存放的地方
0041E0A0 12 21 3B 40 58 6D !;@Xm.
=========================================================================================
到此注册码计算的分析完成,下面来总结注册码的计算方法:
条件: 注册码的长度为20位 , 因为是两个一组,现在我们用一个字符来表示一组.
机器码我们也用同样的方法表示.
设:
1.机器码 = M0
M1 M2 M3 M4 M5 M6 M7 M8 M9
2.注册码 = N0 N1 N2 N3 N4 N5
N6 N7 N8 N9
注册码的计算方法: N0 = M4 XOR 11
N1 = M3 XOR 33
N2 = M0
XOR 55
N3 = M1 XOR 77
N4 = M2 XOR 99
N5 = M5 XOR AA
N6
= M6 XOR CC
N7 = M7 XOR BB
N8 = M8 XOR EE
N9 = M9 XOR FF
fxyang
2003.2.27