首页
社区
课程
招聘
[原创]HappyTowns的第四个CrackMe分析
发表于: 2007-5-13 11:06 5169

[原创]HappyTowns的第四个CrackMe分析

2007-5-13 11:06
5169
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
穷举出所以的注册码

***************************************
新手上路,多多关照

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好文章 ,学习
2007-5-13 13:12
0
雪    币: 211
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
能不能说下LZ是怎么写穷举代码的???就是怎么写出来的?
2007-5-19 09:46
0
游客
登录 | 注册 方可回帖
返回
//