程序名称:黑马多媒体电子教室精简版
原版下载:http://www.softreg.com.cn/shareware_view.asp?id=/F4957B23-10B4-4F6B-9BBD-BA34DC283465/
破解作者:北极熊[DFCG]
破解工具:TRW2000,VB6.0
下万能断点:bpx hmemcpy
慢慢跟踪到如下关键(都是高手,菜熊就不多献丑了),看算法如下:
0167:00427697 E874FCFFFF CALL 00427310
0167:0042769C 83C404 ADD
ESP,BYTE +04
0167:0042769F 8D4C2414 LEA
ECX,[ESP+14]
0167:004276A3 51
PUSH ECX
0167:004276A4 E8D7C6FEFF
CALL 00413D80 //F8进入算法CALL
0167:004276A9
8B00 MOV EAX,[EAX]
0167:004276AB 8B542414 MOV
EDX,[ESP+14]
0167:004276AF 50
PUSH EAX
0167:004276B0 52
PUSH EDX
0167:004276B1 FFD7
CALL EDI
0167:004276B3 83C410
ADD ESP,BYTE +10
0167:004276B6 8D4C2410
LEA ECX,[ESP+10]
0167:004276BA 85C0
TEST EAX,EAX
0167:004276BC 0F95C3 SETNZ
BL 设置标志
0167:004276BF E894380100
CALL `MFC42!ord_00000320`
0167:004276C4 84DB
TEST BL,BL
0167:004276C6
7412 JZ 004276DA
跳至出错处
0167:004276C8 6A00
PUSH BYTE +00
--------------------//算法CALL//
0167:00413DCE B80A0A0A0A MOV EAX,0A0A0A0A
//这是一个关键的字符串
0167:00413DD3 33D2
XOR EDX,EDX
0167:00413DD5 89442414
MOV [ESP+14],EAX
0167:00413DD9
89442418 MOV [ESP+18],EAX
0167:00413DDD 8944241C MOV [ESP+1C],EAX
0167:00413DE1 89442420 MOV
[ESP+20],EAX
0167:00413DE5 85F6
TEST ESI,ESI
0167:00413DE7 89442424
MOV [ESP+24],EAX 设置上面ESP+14-->ESP+27 都是"0A"
0167:00413DEB 7E1C JNG
00413E09
0167:00413DED 8D4C2414 LEA
ECX,[ESP+14] 取出机器码
0167:00413DF1 2BF9
SUB EDI,ECX
0167:00413DF3 8D4C1414 LEA
ECX,[ESP+EDX+14]
0167:00413DF7 8A040F
MOV AL,[EDI+ECX]
0167:00413DFA 84C0
TEST AL,AL
0167:00413DFC 8801
MOV [ECX],AL
0167:00413DFE
7D04 JNL 00413E04
0167:00413E00 F6D8 NEG
AL
0167:00413E02 8801 MOV
[ECX],AL
0167:00413E04 42
INC EDX
0167:00413E05 3BD6
CMP EDX,ESI
0167:00413E07
7CEA JL 00413DF3
上面是把机器码放入ESP+14开始的空间
0167:00413E09 33F6
XOR ESI,ESI
//开始计算,(以下是一个多重循环)
0167:00413E0B 33C9
XOR ECX,ECX
0167:00413E0D 8A543414
MOV DL,[ESP+ESI+14] 取机器码第一位,ESI是外循环因子
0167:00413E11 8A440C14 MOV
AL,[ESP+ECX+14] 取机器码第一位,ECX是内循环因子
0167:00413E15 02C2
ADD AL,DL
加起来
0167:00413E17 3C39
CMP AL,39 和$39比较
0167:00413E19 88440C14 MOV
[ESP+ECX+14],AL 放回第一位
0167:00413E1D 7E0F
JNG 00413E2E 小于等于就跳
0167:00413E1F 0FBEC0 MOVSX
EAX,AL 大于就存到EAX
0167:00413E22 99
CDQ
0167:00413E23
BF3C000000 MOV EDI,3C
EDI=$EC
0167:00413E28 F7FF
IDIV EDI EAX除EDI
0167:00413E2A 88540C14 MOV
[ESP+ECX+14],DL 取余数放到EDX
0167:00413E2E 41
INC ECX
内循环因子加1
0167:00413E2F 83F914
CMP ECX,BYTE +14 比较是否够20位
0167:00413E32
7CD9 JL 00413E0D
小于就跳回继续
0167:00413E34 46
INC ESI
内循环结束后继续外循环,ESI=ESI+1
0167:00413E35 83FE14
CMP ESI,BYTE +14 比较是否够20位
0167:00413E38 7CD1 JL
00413E0B 小于就跳回继续,(结束全部循环)
0167:00413E3A 33C9
XOR ECX,ECX
0167:00413E3C
8A440C14 MOV AL,[ESP+ECX+14]
逐位取计算的ascii码
0167:00413E40 3C30
CMP AL,30 和&30比较
0167:00413E42 7C04 JL
00413E48 小于就跳
0167:00413E44 3C39
CMP AL,39
和&39比较
0167:00413E46 7E12
JNG 00413E5A
不大于就跳,该字符不变
0167:00413E48 0FBEC0 MOVSX
EAX,AL
0167:00413E4B 99
CDQ
0167:00413E4C BE0A000000
MOV ESI,0A 和$A取余
0167:00413E51 F7FE IDIV
ESI
0167:00413E53 80C230 ADD
DL,30 结果加&30变成数字
0167:00413E56
88540C14 MOV [ESP+ECX+14],DL
放回去
0167:00413E5A 41 INC
ECX
0167:00413E5B 83F914
CMP ECX,BYTE +14
0167:00413E5E 7CDC
JL 00413E3C
循环
0167:00413E60 807C241634 CMP BYTE
[ESP+16],34 第3位ascii码和$34比较
0167:00413E65 7E16
JNG 00413E7D
不大于就跳
0167:00413E67 8A442414 MOV
AL,[ESP+14] 取第1位到al
0167:00413E6B 8A4C2425
MOV CL,[ESP+25] 取第18位到CL
0167:00413E6F 88442428 MOV
[ESP+28],AL 第1位放到第21位
0167:00413E73 884C2414
MOV [ESP+14],CL 第18位放到第1位
0167:00413E77 88442425 MOV
[ESP+25],AL 第1位放到第18位
0167:00413E7B EB14
JMP SHORT 00413E91 //以上是几个字符互换
0167:00413E7D 8A442417 MOV
AL,[ESP+17] 取第4位到al
0167:00413E81 8A542423
MOV DL,[ESP+23] 取第16位到CL
0167:00413E85 88442428 MOV
[ESP+28],AL 第4位放到第21位
0167:00413E89 88542417
MOV [ESP+17],DL 第16位放到第4位
0167:00413E8D 88442423 MOV
[ESP+23],AL 第4位放到第16位
0167:00413E91 B02D
MOV AL,2D
"-"
0167:00413E93 8D4C2408
LEA ECX,[ESP+08]
0167:00413E97 88442418
MOV [ESP+18],AL 第5位变为"-"
0167:00413E9B 8844241D MOV
[ESP+1D],AL 第10变为"-"
0167:00413E9F 88442422
MOV [ESP+22],AL 第15位变为"-"
0167:00413EA3 8D442414 LEA
EAX,[ESP+14] 注册码,然后取前18位就是真注册码了!
0167:00413EA7 50
PUSH EAX
VB也刚学,注册机代码写的不精练,如下
Private Sub Image1_Click()
Dim aa As String, bb As String
Dim aa1,
i, j, z
Dim eax, ebx, ecx
Dim tt, zzz, code
Dim code4, code16,
code18
Dim sn As String
aa = Text1.Text
bb = "1010101010101010101010101010101010101010"
If Len(aa) < 15 Then
msg = MsgBox("请填写机器码,谢谢!", 1, "错误")
ElseIf
aa = "1111-2222-3333-4444" Then
Text2.Text = "这是北极熊自用版"
Else
'连接为20位
For i = 1 To Len(aa)
aa1 = Asc(Mid(aa, i, 1))
bb = Left(bb, i *
2 - 2) & aa1 & Right(bb, 40 - i * 2)
Next
For j = 1 To
20
For z = 1 To 20
eax = Val(Mid(bb, j * 2 - 1, 2))
ecx = Val(Mid(bb,
z * 2 - 1, 2))
ebx = eax + ecx
bb = Left(bb, z * 2 - 2) & ebx &
Right(bb, 40 - z * 2)
If ebx < &H39 Then
If ebx < 10
Then
ebx = "0" & ebx
Else
ebx = ebx
End If
Else
ebx = ebx Mod &H3C
If ebx < 10
Then
ebx = "0" & ebx
Else
ebx = ebx
End If
End If
bb = Left(bb, z * 2 - 2) & ebx & Right(bb,
40 - z * 2)
Next z
Next j
For i = 1 To 40 Step 2
tt =
Val(Mid(bb, i, 2))
If tt < &H30 Or tt > &H39 Then
zzz = Chr((Val(Mid(bb,
i, 2)) Mod &HA) + &H30)
Else
zzz = Chr(tt)
End If
code = code & zzz
Next
If Asc(Mid(code, 3, 1)) < &H34
Then
code4 = Mid(code, 4, 1)
code16 = Mid(code, 16, 1)
code = Left(code,
15) & code4 & Right(code, Len(code) - 16)
code = Left(code, 20) &
code4
code = Left(code, 3) & code16 & Right(code, Len(code) - 4)
Else
code1 = Mid(code, 1, 1)
code18 = Mid(code, 18, 1)
code
= Left(code, 17) & code1 & Right(code, Len(code) - 18)
code = Left(code,
20) & code1
code = code18 & Right(code, Len(code) - 1)
End If
'加上"-"
code = Left(code, 4) & "-" & Right(code, Len(code)
- 5)
code = Left(code, 9) & "-" & Right(code, Len(code) - 10)
code = Left(code, 14) & "-" & Right(code, Len(code) - 15)
'取前18位
code = Left(code, 18)
Text2.Text = code
End If
End Sub
Private Sub Image2_Click()
msg = MsgBox("支持国产正版软件,请向作者注册!", 1, "谢谢")
End
End Sub
作者:北极熊[DFCG]
时间:2003年3月6日
- 标 题:黑马多媒体电子教室精简版简单算法分析 (8千字)
- 作 者:北极熊[DFCG]
- 时 间:2003-4-15
16:06:37
- 链 接:http://bbs.pediy.com