1、用PEid查看KeyGenMe_04,得知它是用Borland Delphi 6.0编写的。
2、因由第一步得知该CrackMe是用Borland Delphi 6.0,因此下面采用DarkDe打开KeyGenMe_04,可以看到btnCheckClick的RVA为0045004C
3、用OD打开KeyGenMe_04,按CTRL+G,输入前面获取的0045004C,转到
0045004C /. 55 push ebp
0045004D |. 8BEC mov ebp, esp
0045004F |. 83C4 DC add esp, -24
00450052 |. 33C9 xor ecx, ecx
00450054 |. 894D F8 mov dword ptr [ebp-8], ecx
00450057 |. 894D F4 mov dword ptr [ebp-C], ecx
0045005A |. 8955 E0 mov dword ptr [ebp-20], edx
0045005D |. 8945 FC mov dword ptr [ebp-4], eax
00450060 |. 33C0 xor eax, eax
00450062 |. 55 push ebp
00450063 |. 68 8D014500 push 0045018D
00450068 |. 64:FF30 push dword ptr fs:[eax]
0045006B |. 64:8920 mov dword ptr fs:[eax], esp
0045006E |. 8D55 F8 lea edx, dword ptr [ebp-8]
00450071 |. 8B45 FC mov eax, dword ptr [ebp-4]
00450074 |. 8B80 00030000 mov eax, dword ptr [eax+300]
0045007A |. E8 D9F2FDFF call 0042F358
0045007F |. 8B45 F8 mov eax, dword ptr [ebp-8]
00450082 |. E8 4940FBFF call 004040D0
***********************************************************
00450087 |. 8945 F0 mov dword ptr [ebp-10], eax
0045008A |. 837D F0 02 cmp dword ptr [ebp-10], 2
0045008E |. 0F8C DE000000 jl 00450172
***********************************************************
前面三行的代码用来判断你输入的name是否大于2,如果不为2,就退出
00450094 |. 8D55 F4 lea edx, dword ptr [ebp-C]
00450097 |. 8B45 FC mov eax, dword ptr [ebp-4]
0045009A |. 8B80 08030000 mov eax, dword ptr [eax+308]
004500A0 |. E8 B3F2FDFF call 0042F358
004500A5 |. 8B45 F4 mov eax, dword ptr [ebp-C]
004500A8 |. E8 2340FBFF call 004040D0 ;获取你输入的序列号的长度
******************************************************************
004500AD |. 8945 EC mov dword ptr [ebp-14], eax
004500B0 |. 837D EC 0A cmp dword ptr [ebp-14], 0A
004500B4 0F85 B8000000 jnz 00450172
******************************************************************
上面三行的代码用来判断你输入的序列号的长度是否为10,如果不为10,则退出。
004500BA |. 8B45 EC mov eax, dword ptr [ebp-14]
004500BD |. 85C0 test eax, eax
004500BF 7E 34 jle short 004500F5
*********************************************************************
004500C1 |. 8945 E4 mov dword ptr [ebp-1C], eax
004500C4 |. C745 E8 01000>mov dword ptr [ebp-18], 1
004500CB |> 8B45 F4 /mov eax, dword ptr [ebp-C]
004500CE |. 8B55 E8 |mov edx, dword ptr [ebp-18]
004500D1 |. 807C10 FF 30 |cmp byte ptr [eax+edx-1], 30
004500D6 0F82 96000000 |jb 00450172
004500DC |. 8B45 F4 |mov eax, dword ptr [ebp-C]
004500DF |. 8B55 E8 |mov edx, dword ptr [ebp-18]
004500E2 |. 807C10 FF 39 |cmp byte ptr [eax+edx-1], 39
004500E7 0F87 85000000 |ja 00450172
004500ED |. FF45 E8 |inc dword ptr [ebp-18]
004500F0 |. FF4D E4 |dec dword ptr [ebp-1C]
004500F3 ^ 75 D6 \jnz short 004500CB
*********************************************************************
星号之间的代码用来判断你在注册码窗口中输入的字符是否是在0-9之间。
004500F5 |> 8B45 F4 mov eax, dword ptr [ebp-C]
004500F8 |. 0FB600 movzx eax, byte ptr [eax] ;这里用来获取第一个数字
004500FB |. 8B55 F4 mov edx, dword ptr [ebp-C]
004500FE |. 0FB652 05 movzx edx, byte ptr [edx+5] ;这里用来获取第六个数字
00450102 |. 03C2 add eax, edx
00450104 |. 83F8 6D cmp eax, 6D ;如果两数字的和为13,则继续下面的比较,否则退出
00450107 75 69 jnz short 00450172 ;此处控制你注册是否成功
00450109 |. 8B45 F4 mov eax, dword ptr [ebp-C] |
0045010C |. 0FB640 01 movzx eax, byte ptr [eax+1] | 这里用来获取第二个数字
00450110 |. 8B55 F4 mov edx, dword ptr [ebp-C] |
00450113 |. 0FB652 06 movzx edx, byte ptr [edx+6] | 这里用来获取第七个数字
00450117 |. 03C2 add eax, edx |如果两个数的和为7,则继续下面的比较,否则退出
00450119 |. 83F8 67 cmp eax, 67 |
0045011C 75 54 jnz short 00450172 ;此处控制你注册是否成功
0045011E |. 8B45 F4 mov eax, dword ptr [ebp-C]
00450121 |. 0FB640 02 movzx eax, byte ptr [eax+2] ;这里用来获取第三个数字
00450125 |. 8B55 F4 mov edx, dword ptr [ebp-C]
00450128 |. 0FB652 07 movzx edx, byte ptr [edx+7] ;这里用来获取第八个数字
0045012C |. 03C2 add eax, edx
0045012E |. 83F8 69 cmp eax, 69 ;若两个数字的和为9,则继续下面的比较,否则退出
00450131 75 3F jnz short 00450172 ;此处控制你注册是否成功
00450133 |. 8B45 F4 mov eax, dword ptr [ebp-C]
00450136 |. 0FB640 03 movzx eax, byte ptr [eax+3]
0045013A |. 8B55 F4 mov edx, dword ptr [ebp-C]
0045013D |. 0FB652 08 movzx edx, byte ptr [edx+8]
00450141 |. 03C2 add eax, edx
00450143 |. 83F8 70 cmp eax, 70 ;将第4个数值和第9个数值相加,如果和为16,则继续下面的比较,否则退出
00450146 75 2A jnz short 00450172 ;此处控制你注册是否成功
00450148 |. 8B45 F4 mov eax, dword ptr [ebp-C]
0045014B |. 0FB640 04 movzx eax, byte ptr [eax+4]
0045014F |. 8B55 F4 mov edx, dword ptr [ebp-C]
00450152 |. 0FB652 09 movzx edx, byte ptr [edx+9]
00450156 |. F7EA imul edx
00450158 |. 3D 8C0A0000 cmp eax, 0A8C ;此处判断第五个数和第10个数的积是否等于2*6,若是就继续下面的比较,否则退出
0045015D 75 13 jnz short 00450172 ;此处控制你注册是否成功
0045015F |. 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00450161 |. 68 98014500 push 00450198 ; |Title = "Congratulations"
00450166 |. 68 A8014500 push 004501A8 ; |Text = "Good job,man!"
0045016B |. 6A 00 push 0 ; |hOwner = NULL
0045016D |. E8 2E63FBFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA ;此处显示注册成功
00450172 |> 33C0 xor eax, eax
00450174 |. 5A pop edx
00450175 |. 59 pop ecx
00450176 |. 59 pop ecx
00450177 |. 64:8910 mov dword ptr fs:[eax], edx
0045017A |. 68 94014500 push 00450194
0045017F |> 8D45 F4 lea eax, dword ptr [ebp-C]
00450182 |. BA 02000000 mov edx, 2
00450187 |. E8 A83CFBFF call 00403E34
0045018C \. C3 retn
对上面的分析可做出如下总结:
1、第一个数字和第六个数字的和必须为13
2、第二个数字和第七个数字的和必须为7
3、第三个数字和第八个数字的和必须为9
4、第四个数字和第九个数字的和必须为16
5、第五个数字必须是2或6和第10个数字必须是6或2
只有满足以上条件时,才能够注册成功
因此可一根据上面的总结可写出注册机
下面我就用VB写出了注册机,代码如下:
Private Sub Command1_Click()
Dim a1, a2, a3, a4, a5, i As Integer
Dim a(3) As Integer
Dim s As String
a(0) = 2
a(1) = 6
For a1 = 4 To 9
For a2 = 0 To 7
For a3 = 0 To 9
For a4 = 7 To 9
For a5 = 0 To 1
List1.AddItem (Trim(Str(a1)) & Trim(Str(a2)) & Trim(Str(a3)) & Trim(Str(a4)) & Trim(a(a5)) & Trim(Str(13 - a1)) & Trim(Str(7 - a2)) & Trim(Str(9 - a3)) & Trim(Str(16 - a4)) & Trim(Str(12 / a(a5))))
Next a5
Next a4
Next a3
Next a2
Next a1
End Sub
穷举出所以的注册码
***************************************
新手上路,多多关照
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!