【破解作者】 落魄浪子
【使用工具】 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下运行通过。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!