【破解作者】 落魄浪子
【使用工具】 FlyOD1.1
【破解平台】 Win9x/NT/2000/XP
【软件名称】 DELPHI编程宝典0402
【下载地址】 用BAIDU找
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】

软件没有加壳,是由友益文书生成的。友益文书是一个很好的电子书制作软件,呵呵,离题了。软件在你阅读后
面几篇文章时会要你输入阅读密码,也就是要你注册。OK,用OD搞定它。

找到出错字符串,向上看看是哪里跳来的。一步步找到关键点下断。

004AACF0   |.  E8 D791F5FF       call Delphi编.00403ECC      断在这里
004AACF5   |.  0F85 73010000     jnz Delphi编.004AAE6E
004AACFB   |.  8D45 FC           lea eax,dword ptr ss:[ebp-4]
004AACFE   |.  8B93 F0370200     mov edx,dword ptr ds:[ebx+237F0]  预置数“wsy54321`”
004AAD04   |.  E8 CB8EF5FF       call Delphi编.00403BD4
004AAD09   |.  80BB 21350200 C7  cmp byte ptr ds:[ebx+23521],0C7
004AAD10   |.  76 28             jbe short Delphi编.004AAD3A
004AAD12   |.  8D45 FC           lea eax,dword ptr ss:[ebp-4]    
004AAD15   |.  50                push eax
004AAD16   |.  8D95 E8FDFFFF     lea edx,dword ptr ss:[ebp-218]
004AAD1C   |.  8B83 1C380200     mov eax,dword ptr ds:[ebx+2381C]  
004AAD22   |.  E8 15DEF5FF       call Delphi编.00408B3C
004AAD27   |.  8B8D E8FDFFFF     mov ecx,dword ptr ss:[ebp-218]     机器码入ECX
004AAD2D   |.  8B93 F0370200     mov edx,dword ptr ds:[ebx+237F0]    预置数入EDX
004AAD33   |.  8BC3              mov eax,ebx
004AAD35   |.  E8 4A20FFFF       call Delphi编.0049CD84    进入看看

0049CD84   /$  55                push ebp       进入后来到这里
0049CD85   |.  8BEC              mov ebp,esp
0049CD87   |.  83C4 E4           add esp,-1C
0049CD8A   |.  53                push ebx
0049CD8B   |.  56                push esi
0049CD8C   |.  57                push edi
0049CD8D   |.  33DB              xor ebx,ebx
0049CD8F   |.  895D E4           mov dword ptr ss:[ebp-1C],ebx
0049CD92   |.  895D E8           mov dword ptr ss:[ebp-18],ebx
0049CD95   |.  894D F8           mov dword ptr ss:[ebp-8],ecx   机器码
0049CD98   |.  8955 FC           mov dword ptr ss:[ebp-4],edx   预置数
0049CD9B   |.  8B45 FC           mov eax,dword ptr ss:[ebp-4]   预置数入EAX
0049CD9E   |.  E8 CD71F6FF       call Delphi编.00403F70
0049CDA3   |.  8B45 F8           mov eax,dword ptr ss:[ebp-8]
0049CDA6   |.  E8 C571F6FF       call Delphi编.00403F70
0049CDAB   |.  33C0              xor eax,eax
0049CDAD   |.  55                push ebp
0049CDAE   |.  68 2DCF4900       push Delphi编.0049CF2D
0049CDB3   |.  64:FF30           push dword ptr fs:[eax]
0049CDB6   |.  64:8920           mov dword ptr fs:[eax],esp
0049CDB9   |.  C745 EC 44000000  mov dword ptr ss:[ebp-14],44    44记为B1
0049CDC0   |.  33C0              xor eax,eax
0049CDC2   |.  8945 F4           mov dword ptr ss:[ebp-C],eax
0049CDC5   |.  8D45 E8           lea eax,dword ptr ss:[ebp-18]
0049CDC8   |.  E8 6F6DF6FF       call Delphi编.00403B3C
0049CDCD   |.  8B45 F8           mov eax,dword ptr ss:[ebp-8]  机器码入EAX
0049CDD0   |.  E8 E76FF6FF       call Delphi编.00403DBC        取机器码的长度
0049CDD5   |.  8BF0              mov esi,eax                   长度入ESI
0049CDD7   |.  85F6              test esi,esi
0049CDD9   |.  7E 14             jle short Delphi编.0049CDEF
0049CDDB   |.  BB 01000000       mov ebx,1                      初绐计数器
0049CDE0   |>  8B45 F8           /mov eax,dword ptr ss:[ebp-8]  机器码入EAX
0049CDE3   |.  0FB64418 FF       |movzx eax,byte ptr ds:[eax+ebx-1] 取机器码的一位的十六进制
0049CDE8   |.  0145 F4           |add dword ptr ss:[ebp-C],eax     累加
0049CDEB   |.  43                |inc ebx                          计数器加1
0049CDEC   |.  4E                |dec esi                          长度减一
0049CDED   |.^ 75 F1             \jnz short Delphi编.0049CDE0      是否计算完,没有则继续。
0049CDEF   |>  33C0              xor eax,eax
0049CDF1   |.  8945 F0           mov dword ptr ss:[ebp-10],eax
0049CDF4   |.  8B45 FC           mov eax,dword ptr ss:[ebp-4]     预置数入EAX  
0049CDF7   |.  E8 C06FF6FF       call Delphi编.00403DBC           取预置数的长度
0049CDFC   |.  8BF0              mov esi,eax                      长度入ESI
0049CDFE   |.  85F6              test esi,esi
0049CE00   |.  7E 14             jle short Delphi编.0049CE16
0049CE02   |.  BB 01000000       mov ebx,1                        初绐计数器
0049CE07   |>  8B45 FC           /mov eax,dword ptr ss:[ebp-4]    预置数入EAX
0049CE0A   |.  0FB64418 FF       |movzx eax,byte ptr ds:[eax+ebx-1] 取预置数的一位的十六进制
0049CE0F   |.  0145 F0           |add dword ptr ss:[ebp-10],eax     累加
0049CE12   |.  43                |inc ebx                           计数器加一
0049CE13   |.  4E                |dec esi                           长度减一
0049CE14   |.^ 75 F1             \jnz short Delphi编.0049CE07       是否计算完,没有则继续。
0049CE16   |>  8B45 FC           mov eax,dword ptr ss:[ebp-4]        预置数入EAX
0049CE19   |.  E8 9E6FF6FF       call Delphi编.00403DBC              取预置数的长度
0049CE1E   |.  8BF0              mov esi,eax                          长度入ESI
0049CE20   |.  85F6              test esi,esi
0049CE22   |.  0F8E D2000000     jle Delphi编.0049CEFA
0049CE28   |.  BB 01000000       mov ebx,1                             初绐计数器记为N1
0049CE2D   |>  8B45 F8           /mov eax,dword ptr ss:[ebp-8]     机器码入EAX
0049CE30   |.  E8 876FF6FF       |call Delphi编.00403DBC           取长度
0049CE35   |.  83E8 06           |sub eax,6                        长度减6
0049CE38   |.  3BD8              |cmp ebx,eax
0049CE3A   |.  7D 4D             |jge short Delphi编.0049CE89
0049CE3C   |.  8D43 05           |lea eax,dword ptr ds:[ebx+5]      N1+5记为S1
0049CE3F   |.  8B55 FC           |mov edx,dword ptr ss:[ebp-4]      预置数入EAX
0049CE42   |.  0FB6541A FF       |movzx edx,byte ptr ds:[edx+ebx-1] 取预置数的一位的十六进制记为S2
0049CE47   |.  F7EA              |imul edx                          S1*S2结果记为S3
0049CE49   |.  03C3              |add eax,ebx                       S3+N1记为S4
0049CE4B   |.  8B55 F8           |mov edx,dword ptr ss:[ebp-8]      机器码入EDX
0049CE4E   |.  0FB6541A 03       |movzx edx,byte ptr ds:[edx+ebx+3] 取机器码的一位的十六进制记为A1
0049CE53   |.  F7EA              |imul edx                          S4*A1结果记为S5
0049CE55   |.  8BCB              |mov ecx,ebx
0049CE57   |.  03C9              |add ecx,ecx                       N1+N1结果记为S6
0049CE59   |.  8BD1              |mov edx,ecx                       S6入EDX
0049CE5B   |.  0FAF55 EC         |imul edx,dword ptr ss:[ebp-14]    S6*B1结果记为S7
0049CE5F   |.  03C2              |add eax,edx                       S5+S7结果记为S8
0049CE61   |.  0FAFCB            |imul ecx,ebx                      S6*N1结果记为S9
0049CE64   |.  83C1 0D           |add ecx,0D                        S6+0D结果记为S10
0049CE67   |.  0FAF4D F4         |imul ecx,dword ptr ss:[ebp-C]     S10*预置数的累加结果记为S11
0049CE6B   |.  03C1              |add eax,ecx                       S8+S11结果记为S12
0049CE6D   |.  8D145B            |lea edx,dword ptr ds:[ebx+ebx*2]  N1+N1*2结果记为S13
0049CE70   |.  83C2 0C           |add edx,0C                        S13+0C结果记为S14
0049CE73   |.  0FAF55 F0         |imul edx,dword ptr ss:[ebp-10]    S14*机器码的累加结果记为S15
0049CE77   |.  03C2              |add eax,edx                       S12+S15结果记为S16
0049CE79   |.  BA 72000000       |mov edx,72                        72入EDX记为N2
0049CE7E   |.  2BD3              |sub edx,ebx                       N2-N1结果记为S17
0049CE80   |.  8BCA              |mov ecx,edx                       S17入ECX
0049CE82   |.  99                |cdq
0049CE83   |.  F7F9              |idiv ecx                          S16/S17商记为S18,余数记为S19
0049CE85   |.  8BFA              |mov edi,edx                       S19入EDI
0049CE87   |.  EB 49             |jmp short Delphi编.0049CED2
0049CE89   |>  8BCB              |mov ecx,ebx       计算完机器码的6位后到这里继续。N1入ECX
0049CE8B   |.  C1E1 02           |shl ecx,2         N1左移2次记为N3
0049CE8E   |.  8BC1              |mov eax,ecx       N3入EAX
0049CE90   |.  83C0 08           |add eax,8         N3+8结果记为N4
0049CE93   |.  8B55 FC           |mov edx,dword ptr ss:[ebp-4]        预置数入EDX
0049CE96   |.  0FB6541A FF       |movzx edx,byte ptr ds:[edx+ebx-1]   取预置数的一位的十六进制记为D1
0049CE9B   |.  8BFA              |mov edi,edx                         D1入EDI
0049CE9D   |.  C1E2 03           |shl edx,3                           D1左移3次记为D2
0049CEA0   |.  2BD7              |sub edx,edi                         D2-D1结果记为D3
0049CEA2   |.  03C2              |add eax,edx                         N4+D3结果记为D4
0049CEA4   |.  8B55 F4           |mov edx,dword ptr ss:[ebp-C]        预置数的累加结果入EDX记为D5
0049CEA7   |.  C1E2 03           |shl edx,3                           D5左移3次结果记为D6
0049CEAA   |.  03C2              |add eax,edx                         D4+D6结果记为D7
0049CEAC   |.  8B55 F0           |mov edx,dword ptr ss:[ebp-10]       机器码的累加结果入EDX记为D8
0049CEAF   |.  8D14D2            |lea edx,dword ptr ds:[edx+edx*8]    D8+D8*8结果记为D9
0049CEB2   |.  03C2              |add eax,edx                         D7+D9结果记为D10
0049CEB4   |.  8BD3              |mov edx,ebx                         N1入EDX
0049CEB6   |.  0FAFD3            |imul edx,ebx                        N1*N1结果记为D11
0049CEB9   |.  03C2              |add eax,edx                         D10+D11结果记为D12
0049CEBB   |.  0FAF4D EC         |imul ecx,dword ptr ss:[ebp-14]      N3*B1结果记为D13
0049CEBF   |.  83C1 17           |add ecx,17                          D13+17结果记为D14
0049CEC2   |.  F7E9              |imul ecx                            D12*D14结果记为D15
0049CEC4   |.  BA 77000000       |mov edx,77                          77入EDX
0049CEC9   |.  2BD3              |sub edx,ebx                         77-N1结果记为D16
0049CECB   |.  8BCA              |mov ecx,edx
0049CECD   |.  99                |cdq
0049CECE   |.  F7F9              |idiv ecx                            D15/D16商记为D17,余数记为D18
0049CED0   |.  8BFA              |mov edi,edx                         D18入EDI
0049CED2   |>  83FF 23           |cmp edi,23                比较S19是否大于23。比较D18是否大于23
0049CED5   |.  7D 06             |jge short Delphi编.0049CEDD  大于则跳,否则不跳
0049CED7   |.  8D443B 22         |lea eax,dword ptr ds:[ebx+edi+22] N1+S19+22记为S20,N1+D18+22记为D19
0049CEDB   |.  8BF8              |mov edi,eax
0049CEDD   |>  8D45 E4           |lea eax,dword ptr ss:[ebp-1C]
0049CEE0   |.  8BD7              |mov edx,edi
0049CEE2   |.  E8 FD6DF6FF       |call Delphi编.00403CE4
0049CEE7   |.  8B55 E4           |mov edx,dword ptr ss:[ebp-1C]
0049CEEA   |.  8D45 E8           |lea eax,dword ptr ss:[ebp-18]
0049CEED   |.  E8 D26EF6FF       |call Delphi编.00403DC4
0049CEF2   |.  43                |inc ebx                       记数器加一
0049CEF3   |.  4E                |dec esi                        长度减一
0049CEF4   |.^ 0F85 33FFFFFF     \jnz Delphi编.0049CE2D          没有计算完则继续。
0049CEFA   |>  8B45 08           mov eax,dword ptr ss:[ebp+8]
0049CEFD   |.  8B55 E8           mov edx,dword ptr ss:[ebp-18]  最后这里的内存地址存放的就是阅读密码
0049CF00   |.  E8 8B6CF6FF       call Delphi编.00403B90
0049CF05   |.  33C0              xor eax,eax
0049CF07   |.  5A                pop edx
0049CF08   |.  59                pop ecx
0049CF09   |.  59                pop ecx
0049CF0A   |.  64:8910           mov dword ptr fs:[eax],edx
0049CF0D   |.  68 34CF4900       push Delphi编.0049CF34
0049CF12   |>  8D45 E4           lea eax,dword ptr ss:[ebp-1C]
0049CF15   |.  BA 02000000       mov edx,2
0049CF1A   |.  E8 416CF6FF       call Delphi编.00403B60
0049CF1F   |.  8D45 F8           lea eax,dword ptr ss:[ebp-8]
0049CF22   |.  BA 02000000       mov edx,2
0049CF27   |.  E8 346CF6FF       call Delphi编.00403B60
0049CF2C   \.  C3                retn
0049CF2D    .^ E9 A266F6FF       jmp Delphi编.004035D4
0049CF32    .^ EB DE             jmp short Delphi编.0049CF12
0049CF34    .  5F                pop edi
0049CF35    .  5E                pop esi
0049CF36    .  5B                pop ebx
0049CF37    .  8BE5              mov esp,ebp
0049CF39    .  5D                pop ebp
0049CF3A    .  C2 0400           retn 4
--------------------------------------------------------------------------------
【破解总结】
算法挺简单的,呵呵。现附上它的VB注册机源码,高手见笑了。
Private Sub Command1_Click()
Dim A, B, C, D, E, F, G, H, I, J, K
If Text1.Text = "" Or Len(Text1.Text) < 6 Then
MsgBox "sorry!please input the serial"
Exit Sub
End If
For A = 1 To Len(Text1.Text)
B = B + Asc(Mid(Text1.Text, A, 1))
Next A
C = "wsy54321`"
K = Len(C)
For D = 1 To Len(C)
E = E + Asc(Mid(C, D, 1))
Next D
For F = 1 To Len(Text1.Text) - 6
If F = 6 Then
For I = F To Len(C)
H = ((((((I * 4 + 8) + ((Asc(Mid(C, I, 1)) * 8) - Asc(Mid(C, I, 1)))) + (B * 8)) + (E + E * 8)) + (I * I)) * (I * 4 * 68 + 23)) Mod (119 - I)
If H > 23 Then
J = J & Chr(H)
Else
J = J & Chr(I + H + 34)
End If
K = K - 1
If K = 0 Then
Text2.Text = J
Exit Sub
End If
Next I
Else
G = ((((Asc(Mid(Text1.Text, F + 4, 1)) * ((F + 5) * Asc(Mid(C, F, 1)) + F)) + (F * 2 * 68)) + (((F * 2 * F) + 13) * B)) + (((F + F * 2) + 12) * E)) Mod (114 - F)
K = K - 1
If G > 23 Then
J = J & Chr(G)
Else
J = J & Chr(F + G + 34)
End If
End If
Next F
End Sub
本注册机在Windows XP SP2 VB6下运行通过。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!