• 标 题:黑马多媒体电子教室精简版简单算法分析   (8千字)
  • 作 者:北极熊[DFCG]
  • 时 间:2003-4-15 16:06:37
  • 链 接:http://bbs.pediy.com

程序名称:黑马多媒体电子教室精简版
原版下载: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日