一个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 原创, 转载请注明作者并保持文章的完整性, 谢谢! 再见!! 学习,收集资料中~~/:001 谢谢了,学习学习,我是菜鸟!
成功
自己做了一下 ,感觉挺简单,大家不要看教程,自己独立作
页:
[1]