飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3100|回复: 3

[原创] 一个BCG的CrackMe注册分析

[复制链接]

该用户从未签到

发表于 2007-12-26 12:16:54 | 显示全部楼层 |阅读模式
【文章标题】: 一个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 [ebp-B8]        ; |
  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 [ebp-11C]       ; |
  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 [ebp-B8]        ;  注册名
  004010C3   .  50                push    eax
  004010C4   .  E8 67050000       call    BCG.00401630                   ;  得到注册名长度
  004010C9   .  59                pop     ecx
  004010CA   .  8945 D8           mov     dword ptr [ebp-28], eax
  004010CD   .  8D95 E4FEFFFF     lea     edx, dword ptr [ebp-11C]       ;  注册码
  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 [ebp-28], 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 [ebp-28], 32         ;  注册名长度 与50 比较
  00401102   .  7D 69             jge     short BCG.0040116D             ;  大于等于,跳走
  00401104   >  0FBE840D 48FFFFFF movsx   eax, byte ptr [ebp+ecx-B8]     ;  依次取注册名的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 [ebp-28]        ;  比较是否结束循环
  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 [ebp-38], eax        ;  最终结果 送 [ebp-38]处
  00401129   .  FF75 C8           push    dword ptr [ebp-38]             ; /压入[ebp-38]处的数值
  0040112C   .  68 38B44000       push    BCG.0040B438                   ; |Arg2 = 0040B438 ASCII "%lX"
  00401131   .  8D8D 80FEFFFF     lea     ecx, dword ptr [ebp-180]       ; |
  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 [ebp-180]       ;  字符串 到 eax
  00401146   .  50                push    eax                            ; /压入这个结果
  00401147   .  8D95 E4FEFFFF     lea     edx, dword ptr [ebp-11C]       ; |注册码
  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 原创, 转载请注明作者并保持文章的完整性, 谢谢! 再见!!

本帖子中包含更多资源

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

x
PYG19周年生日快乐!

该用户从未签到

发表于 2008-1-9 20:54:42 | 显示全部楼层
学习,收集资料中~~/:001
PYG19周年生日快乐!

该用户从未签到

发表于 2008-6-24 08:16:14 | 显示全部楼层
谢谢了,学习学习,我是菜鸟!
PYG19周年生日快乐!

该用户从未签到

发表于 2008-7-25 16:28:29 | 显示全部楼层

成功

自己做了一下 ,感觉挺简单,大家不要看教程,自己独立作

本帖子中包含更多资源

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

x
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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