飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3582|回复: 5

[原创] 对happytown的“一个适合初学者的crackme ”的简单分析

[复制链接]
  • TA的每日心情
    开心
    2023-2-21 15:52
  • 签到天数: 30 天

    [LV.5]常住居民I

    发表于 2007-3-13 22:22:47 | 显示全部楼层 |阅读模式
    【文章标题】: 对happytown的“一个适合初学者的crackme ”的简单分析
    【文章作者】: 水中花
    【下载地址】: 自己搜索下载
    【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
    --------------------------------------------------------------------------------
    【详细过程】
      可以用字符串下断,断在此处
      0040112C   .  50            push    eax
      0040112D   .  53            push    ebx
      0040112E   .  55            push    ebp
      0040112F   .  68 00020000   push    200                              ; /Count = 200 (512.)
      00401134   .  68 49634000   push    crackme.00406349                 ; |Buffer = crackme.00406349
      00401139   .  68 EA030000   push    3EA                              ; |ControlID = 3EA (1002.)
      0040113E   .  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
      00401141   .  E8 4A020000   call    <jmp.&user32.GetDlgItemTextA>    ; \GetDlgItemTextA  获取用户名的长度
      00401146   .  83F8 03       cmp     eax, 3              必须大于3位
      00401149   .  77 18         ja      short crackme.00401163
      0040114B   .  6A 10         push    10                               ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
      0040114D   .  68 06634000   push    crackme.00406306                 ; |bad boy...
      00401152   .  68 0A624000   push    crackme.0040620A                 ; |Text = "Username must have at least 4 chars..."
      00401157   .  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
      0040115A   .  E8 3D020000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA  
      0040115F   .  C9            leave
      00401160   .  C2 1000       retn    10
      00401163   >  8D15 49634000 lea     edx, dword ptr [406349]
      00401169   .  52            push    edx                              ; /String => "j与zi>"
      0040116A   .  E8 8D020000   call    <jmp.&kernel32.lstrlenA>         ; \lstrlenA   去除用户名的第一位字符,该串设了A
      0040116F   .  8BE8          mov     ebp, eax
      00401171   .  B9 05000000   mov     ecx, 5                           ;  循环计数器
      00401176   .  33F6          xor     esi, esi
      00401178   .  33C0          xor     eax, eax
      0040117A   >  8A0C16        mov     cl, byte ptr [esi+edx]           ; 以下是将A的各个字符按顺序与AA,89,C4,FE,46(超过5位的,分别A串的前面字符)相异或,所得串设为B
      0040117D   .  8AD9          mov     bl, cl
      0040117F   .  3298 28634000 xor     bl, byte ptr [eax+406328]    相异或
      00401185   .  40            inc     eax
      00401186   .  83F8 05       cmp     eax, 5
      00401189   .  881C32        mov     byte ptr [edx+esi], bl      存入[edx+esi]中
      0040118C   .  8888 27634000 mov     byte ptr [eax+406327], cl
      00401192   .  75 02         jnz     short crackme.00401196
      00401194   .  33C0          xor     eax, eax
      00401196   >  46            inc     esi
      00401197   .  3BF5          cmp     esi, ebp
      00401199   .^ 72 DF         jb      short crackme.0040117A
      0040119B   .  33FF          xor     edi, edi
      0040119D   .  33C9          xor     ecx, ecx
      0040119F   .  85ED          test    ebp, ebp
      004011A1   .  76 26         jbe     short crackme.004011C9
      004011A3   >  8A9F 2D634000 mov     bl, byte ptr [edi+40632D]        ;  以下是将B串反取按顺序与78 F0 D0 03 E7(超过5位的与B串的反取字符)相异或,所得串设以C
      004011A9   .  8BF5          mov     esi, ebp
      004011AB   .  2BF1          sub     esi, ecx
      004011AD   .  4E            dec     esi
      004011AE   .  8A0432        mov     al, byte ptr [edx+esi]
      004011B1   .  32D8          xor     bl, al             异或
      004011B3   .  47            inc     edi
      004011B4   .  881C32        mov     byte ptr [edx+esi], bl
      004011B7   .  8887 2C634000 mov     byte ptr [edi+40632C], al
      004011BD   .  83FF 05       cmp     edi, 5
      004011C0   .  75 02         jnz     short crackme.004011C4
      004011C2   .  33FF          xor     edi, edi
      004011C4   >  41            inc     ecx
      004011C5   .  3BCD          cmp     ecx, ebp
      004011C7   .^ 72 DA         jb      short crackme.004011A3
      004011C9   >  33F6          xor     esi, esi
      004011CB   .  33FF          xor     edi, edi
      004011CD   .  85ED          test    ebp, ebp
      004011CF   .  76 21         jbe     short crackme.004011F2
      004011D1   >  8A043A        mov     al, byte ptr [edx+edi]    以下是将C串反取按顺序与F7 FD F4 E7 B9(超过5位的与C串的反取字符)相异或,所得串设以D
      004011D4   .  8A8E 32634000 mov     cl, byte ptr [esi+406332]
      004011DA   .  32C8          xor     cl, al            异或
      004011DC   .  46            inc     esi
      004011DD   .  880C3A        mov     byte ptr [edx+edi], cl
      004011E0   .  8886 31634000 mov     byte ptr [esi+406331], al
      004011E6   .  83FE 05       cmp     esi, 5
      004011E9   .  75 02         jnz     short crackme.004011ED
      004011EB   .  33F6          xor     esi, esi
      004011ED   >  47            inc     edi
      004011EE   .  3BFD          cmp     edi, ebp
      004011F0   .^ 72 DF         jb      short crackme.004011D1
      004011F2   >  33FF          xor     edi, edi
      004011F4   .  33C9          xor     ecx, ecx
      004011F6   .  85ED          test    ebp, ebp
      004011F8   .  76 26         jbe     short crackme.00401220
      004011FA   >  8A9F 37634000 mov     bl, byte ptr [edi+406337]  以下是将D串反取按顺序与B5 1B C9 50 73(超过5位的与D串的反取字符)相异或,所得串设为E
      00401200   .  8BF5          mov     esi, ebp
      00401202   .  2BF1          sub     esi, ecx
      00401204   .  4E            dec     esi
      00401205   .  8A0432        mov     al, byte ptr [edx+esi]
      00401208   .  32D8          xor     bl, al             异或
      0040120A   .  47            inc     edi
      0040120B   .  881C32        mov     byte ptr [edx+esi], bl
      0040120E   .  8887 36634000 mov     byte ptr [edi+406336], al
      00401214   .  83FF 05       cmp     edi, 5
      00401217   .  75 02         jnz     short crackme.0040121B
      00401219   .  33FF          xor     edi, edi
      0040121B   >  41            inc     ecx
      0040121C   .  3BCD          cmp     ecx, ebp
      0040121E   .^ 72 DA         jb      short crackme.004011FA
      00401220   >  8D3D 45634000 lea     edi, dword ptr [406345]
      00401226   .  33C0          xor     eax, eax
      00401228   .  85ED          test    ebp, ebp
      0040122A   .  C705 45634000>mov     dword ptr [406345], 0
      00401234   .  76 17         jbe     short crackme.0040124D
      00401236   >  8BC8          mov     ecx, eax     以下是将E串反取按顺序与00,00,00,00,(超过5位的与E串的反取字符)相add,超过4位有E串的反取相add
      00401238   .  83E1 03       and     ecx, 3
      0040123B   .  8A1C0F        mov     bl, byte ptr [edi+ecx]
      0040123E   .  8D340F        lea     esi, dword ptr [edi+ecx]
      00401241   .  8A0C02        mov     cl, byte ptr [edx+eax]
      00401244   .  02D9          add     bl, cl      相add
      00401246   .  40            inc     eax
      00401247   .  3BC5          cmp     eax, ebp
      00401249   .  881E          mov     byte ptr [esi], bl       存入[esi]中
      0040124B   .^ 72 E9         jb      short crackme.00401236
      0040124D   >  5D            pop     ebp
      0040124E   .  B9 0A000000   mov     ecx, 0A                   ecx赋值为A,十进制10
      00401253   .  A1 45634000   mov     eax, dword ptr [406345]  将[406345](为[esi])中的内容取出
      00401258   .  33DB          xor     ebx, ebx
      0040125A   >  33D2          xor     edx, edx
      0040125C   .  F7F1          div     ecx           除A
      0040125E   .  80C2 30       add     dl, 30          低位与30相add
      00401261   .  8893 49654000 mov     byte ptr [ebx+406549], dl  存入[ebx+406549]中
      00401267   .  43            inc     ebx
      00401268   .  85C0          test    eax, eax
      0040126A   .^ 75 EE         jnz     short crackme.0040125A
      0040126C   .  68 49654000   push    crackme.00406549                 ; /String = ""  此为上面计算所得的值,设为F
      00401271   .  E8 86010000   call    <jmp.&kernel32.lstrlenA>         ; \lstrlenA
      00401276   .  33DB          xor     ebx, ebx
      00401278   >  8A88 48654000 mov     cl, byte ptr [eax+406548]    将F串反取,即为注册码
      0040127E   .  888B 49674000 mov     byte ptr [ebx+406749], cl
      00401284   .  43            inc     ebx
      00401285   .  48            dec     eax
      00401286   .^ 75 F0         jnz     short crackme.00401278
      00401288   .  68 49674000   push    crackme.00406749                 ; /String2 = ""  此处出现真码
      0040128D   .  68 49654000   push    crackme.00406549                 ; |String1 = crackme.00406549
      00401292   .  E8 5F010000   call    <jmp.&kernel32.lstrcpyA>         ; \lstrcpyA
      00401297   .  68 00020000   push    200                              ; /Count = 200 (512.)
      0040129C   .  68 49694000   push    crackme.00406949                 ; |Buffer = crackme.00406949
      004012A1   .  6A 64         push    64                               ; |ControlID = 64 (100.)
      004012A3   .  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
      004012A6   .  E8 E5000000   call    <jmp.&user32.GetDlgItemTextA>    ; \GetDlgItemTextA
      004012AB   .  68 49654000   push    crackme.00406549                 ; /String2 = ""
      004012B0   .  68 49694000   push    crackme.00406949                 ; |String1 = "123456"
      004012B5   .  E8 36010000   call    <jmp.&kernel32.lstrcmpA>         ; \lstrcmpA  真假码比较
      004012BA   .  0BC0          or      eax, eax
      004012BC   .  75 16         jnz     short crackme.004012D4       跳向出错处
      004012BE   .  6A 40         push    40                               ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
      004012C0   .  68 DB624000   push    crackme.004062DB                 ; |good boy...nope, thats not it!\n\ntry againbad boy...
      004012C5   .  68 AC624000   push    crackme.004062AC                 ; |yep, thats the right code!\n\ngo write a KeyGen!good boy...nope, thats not it!\n\ntry againbad boy...
      004012CA   .  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
      004012CD   .  E8 CA000000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
      004012D2   .  EB 14         jmp     short crackme.004012E8
      004012D4   >  6A 10         push    10                               ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
      004012D6   .  68 06634000   push    crackme.00406306                 ; |bad boy...
      004012DB   .  68 E7624000   push    crackme.004062E7                 ; |nope, thats not it!\n\ntry againbad boy...
      004012E0   .  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
      004012E3   .  E8 B4000000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
      004012E8   >  68 00020000   push    200                              ; /Length = 200 (512.)
      004012ED   .  68 49654000   push    crackme.00406549                 ; |Destination = crackme.00406549
      004012F2   .  E8 ED000000   call    <jmp.&kernel32.RtlZeroMemory>    ; \RtlZeroMemory
      004012F7   .  68 00020000   push    200                              ; /Length = 200 (512.)
      004012FC   .  68 49634000   push    crackme.00406349                 ; |Destination = crackme.00406349
      00401301   .  E8 DE000000   call    <jmp.&kernel32.RtlZeroMemory>    ; \RtlZeroMemory
      00401306   .  68 00020000   push    200                              ; /Length = 200 (512.)
      0040130B   .  68 49674000   push    crackme.00406749                 ; |Destination = crackme.00406749
      00401310   .  E8 CF000000   call    <jmp.&kernel32.RtlZeroMemory>    ; \RtlZeroMemory
      00401315   .  B9 16000000   mov     ecx, 16
      
    --------------------------------------------------------------------------------
    【经验总结】
      我是初手,也是第一次写这种破文,不好和不对之处,请大家多多指教!
      算法总结:
      1、去除用户名的第一位字符,设为A,将A按顺序分别与AA 89 C4  FE 46(超过5位的,分别取A串的前面字符)相异或,设
      所得结果为B
      2、将B串反取按顺序与78 F0 D0 03 E7(超过5位的与B串的反取字符)相异或,所得串设以C
      3、将C串反取按顺序与F7 FD F4 E7 B9(超过5位的与C串的反取字符)相异或,所得串设以D
      4、将D串反取按顺序与B5 1B C9 50 73(超过5位的与D串的反取字符)相异或,所得串设为E
      5、将E串反取按顺序与00,00,00,00,(超过5位的与E串的反取字符)相add,超过4位有E串的反取相add ,所得设为F   
      6、将F div A 余数+30,化为数字,所得值设为G
      7、将G反取就为正确注册码
                     
      
    --------------------------------------------------------------------------------
                                                           2007年03月13日 22:12:48

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-13 23:48:52 | 显示全部楼层
    这个是比较简单的 CM ,支持一下
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-14 18:20:50 | 显示全部楼层
    /fad 我怎么没有看明白啊
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-7-29 08:48:13 | 显示全部楼层

    凑个热闹

    我也发一个成功截图,不过楼上的分析的挺详细

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-9-3 23:05
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    发表于 2008-7-29 10:42:54 | 显示全部楼层
    我也来耍耍

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-9-3 23:05
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    发表于 2008-7-29 10:45:25 | 显示全部楼层
    我的注册码就是1696244835


    我就是这点水平拉,哈哈!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表