CuteSnail 发表于 2007-12-26 12:16:54

一个BCG的CrackMe注册分析

【文章标题】: 一个BCG的CrackMe注册分析
【文章作者】: CuteSnail
【作者QQ号】: 121567771
【作者声明】: 只是感兴趣的自娱自乐,没有其他目的。失误之处还要敬请诸位大侠赐教!
-------------------------------------------------------------------------------
【详细过程】

    使用OD载入该程序后运行它,然后输入假的注册名: 11111(因为程序提示了:注册名必须在4个字符以上) 和 注册码: 12345, 然后下断点:
GetWindowTextA 后再按确定按钮,这时程序就被断下了,然后按Alt+F9键返回到程序处,向下看,来到了这里:
   
   
00401085   .6A 66             push    66                           ; /ControlID = 66 (102.)
00401087   .53                push    ebx                            ; |hWnd
00401088   .E8 159C0000       call    <jmp.&USER32.GetDlgItem>       ; \GetDlgItem
0040108D   .6A 64             push    64                           ; /Count = 64 (100.)
0040108F   .8D95 48FFFFFF   lea   edx, dword ptr       ; |
00401095   .52                push    edx                            ; |Buffer
00401096   .50                push    eax                            ; |hWnd
00401097   .E8 129C0000       call    <jmp.&USER32.GetWindowTextA>   ; \得到注册名; 最初就被断在了这里!!!
0040109C   .6A 68             push    68                           ; /ControlID = 68 (104.)
0040109E   .53                push    ebx                            ; |hWnd
0040109F   .E8 FE9B0000       call    <jmp.&USER32.GetDlgItem>       ; \GetDlgItem
004010A4   .6A 64             push    64                           ; /Count = 64 (100.)
004010A6   .8D8D E4FEFFFF   lea   ecx, dword ptr        ; |
004010AC   .51                push    ecx                            ; |Buffer
004010AD   .50                push    eax                            ; |hWnd
004010AE   .E8 FB9B0000       call    <jmp.&USER32.GetWindowTextA>   ; \得到注册码
004010B3   .6A 67             push    67                           ; /ControlID = 67 (103.)
004010B5   .53                push    ebx                            ; |hWnd
004010B6   .E8 E79B0000       call    <jmp.&USER32.GetDlgItem>       ; \GetDlgItem
004010BB   .8BF0            mov   esi, eax
004010BD   .8D85 48FFFFFF   lea   eax, dword ptr       ;注册名
004010C3   .50                push    eax
004010C4   .E8 67050000       call    BCG.00401630                   ;得到注册名长度
004010C9   .59                pop   ecx
004010CA   .8945 D8         mov   dword ptr , eax
004010CD   .8D95 E4FEFFFF   lea   edx, dword ptr        ;注册码
004010D3   .52                push    edx
004010D4   .E8 57050000       call    BCG.00401630                   ;得到注册码长度
004010D9   .59                pop   ecx
004010DA   .68 EAB04000       push    BCG.0040B0EA
004010DF   .E8 4C050000       call    BCG.00401630
004010E4   .59                pop   ecx
004010E5   .68 0EB14000       push    BCG.0040B10E
004010EA   .E8 41050000       call    BCG.00401630
004010EF   .59                pop   ecx
004010F0   .837D D8 03      cmp   dword ptr , 3          ;注册名长度 与3 比较
004010F4   .7E 7B             jle   short BCG.00401171             ;小于等于,跳走
004010F6   .33C9            xor   ecx, ecx                     ;ecx 置 0
004010F8   .33D2            xor   edx, edx                     ;edx 置 0
004010FA   .33DB            xor   ebx, ebx                     ;ebx 置 0
004010FC   .33C0            xor   eax, eax                     ;eax 置 0
004010FE   .837D D8 32      cmp   dword ptr , 32         ;注册名长度 与50 比较
00401102   .7D 69             jge   short BCG.0040116D             ;大于等于,跳走
00401104   >0FBE840D 48FFFFFF movsx   eax, byte ptr    ;依次取注册名的ASCII码值 送 eax 中
0040110C   .41                inc   ecx                            ;ecx依次加1
0040110D   .33C1            xor   eax, ecx                     ;eax 与 ecx 异或
0040110F   .03D8            add   ebx, eax                     ;ebx 与 eax 相加
00401111   .3B4D D8         cmp   ecx, dword ptr       ;比较是否结束循环
00401114   .^ 75 EE             jnz   short BCG.00401104             ;不等,继续循环
00401116   .69C0 56030000   imul    eax, eax, 356                  ;eax 乘以 854
0040111C   .C1E3 08         shl   ebx, 8                         ;ebx 左移 8 位
0040111F   .C1E8 08         shr   eax, 8                         ;eax 右移 8 位
00401122   .90                nop
00401123   .90                nop
00401124   .03C3            add   eax, ebx                     ;eax 与 ebx 相加
00401126   .8945 C8         mov   dword ptr , eax      ;最终结果 送 处
00401129   .FF75 C8         push    dword ptr              ; /压入处的数值
0040112C   .68 38B44000       push    BCG.0040B438                   ; |Arg2 = 0040B438 ASCII "%lX"
00401131   .8D8D 80FEFFFF   lea   ecx, dword ptr        ; |
00401137   .51                push    ecx                            ; |Arg1
00401138   .E8 873D0000       call    BCG.00404EC4                   ; \16进制数值转换为字符串
0040113D   .83C4 0C         add   esp, 0C
00401140   .8D85 80FEFFFF   lea   eax, dword ptr        ;字符串 到 eax
00401146   .50                push    eax                            ; /压入这个结果
00401147   .8D95 E4FEFFFF   lea   edx, dword ptr        ; |注册码
0040114D   .52                push    edx                            ; |再压入注册码
0040114E   .E8 339C0000       call    <jmp.&KERNEL32.lstrcmpA>       ; \比较 输入的注册码 与 转换为字符串的运算结果
00401153   .85C0            test    eax, eax                     ;相等,则eax返回0,成功
00401155   .75 0D             jnz   short BCG.00401164             ;不为0,则跳走
00401157   .68 3CB44000       push    BCG.0040B43C                   ; /Text = ""B8,"锩?讶",BB,"成?,A6,",加入BCG后",B8,"?
枧",AC,"?,A6," ^_^"
0040115C   .56                push    esi                            ; |hWnd
0040115D   .E8 289B0000       call    <jmp.&USER32.SetWindowTextA>   ; \SetWindowTextA
00401162   .EB 18             jmp   short BCG.0040117C
00401164   >68 90B44000       push    BCG.0040B490

      
    上面的运算就是:按照注册名的长度依次取注册名的ASCII码值与 依次增加1的ecx 作异或运算,然后结果和ebx相加,得到循环后结果再乘
以854后,将eax中的结果右移8位,再将ebx的结果左移8位,然后将这两个数值相加,得到最终结果,并将其按16进制数的格式转换为字符串,再读
入注册码,与这个字符串比较,相等,就注册成功了,那么当我的注册名是: 11111 时,我的正确注册码就是: FEAD 了, 哈哈 ^_^
      
成功的注册信息:
      
注册名: 11111
注册码: FEAD

-----------------------------------------------------------------------------------
【版权声明】: 本文由 CuteSnail 原创, 转载请注明作者并保持文章的完整性, 谢谢! 再见!!

ert4e 发表于 2008-1-9 20:54:42

学习,收集资料中~~/:001

jsj731 发表于 2008-6-24 08:16:14

谢谢了,学习学习,我是菜鸟!

lixy8888 发表于 2008-7-25 16:28:29

成功

自己做了一下 ,感觉挺简单,大家不要看教程,自己独立作
页: [1]
查看完整版本: 一个BCG的CrackMe注册分析