首页
社区
课程
招聘
对happytown的“一个适合初学者的crackme ”的简单分析
2007-3-13 22:25 6003

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

2007-3-13 22:25
6003
刚才好像看不到文章的内容啊!呵呵
【文章标题】: 对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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 7
打赏
分享
最新回复 (3)
雪    币: 297
活跃值: (21)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
dewar 8 2007-3-14 08:05
2
0
很清楚,支持一下
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天使无痕 2007-3-15 21:19
3
0
虽然当初得到了这个的注册码,却只是看到数字抱着试试的态度弄的,
现在看了才知道原因,谢谢楼主了。
雪    币: 214
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhousi 2007-6-20 09:04
4
0
0040116A   .  E8 8D020000   call    <jmp.&kernel32.lstrlenA>         ; \lstrlenA   去除用户名的第一位字符,该串设了A

没看明白,“该串设了A”是什么意思,为什么lstrlena会去除用户名的第一位字符
游客
登录 | 注册 方可回帖
返回