一个CNCG的CrackMe注册分析
【文章标题】: 一个CNCG的CrackMe注册分析【文章作者】: CuteSnail
【作者QQ号】: 121567771
【作者声明】: 只是感兴趣的自娱自乐,没有其他目的。失误之处还要敬请诸位大侠赐教!
-------------------------------------------------------------------------------
【详细过程】
使用OD载入该程序后运行它,然后输入假的 注册名: 1 和 注册码: 2, 然后字符串参考: '请输入用户名或注册码'后,来到了这里:
00466EF0/.55 push ebp
00466EF1|.8BEC mov ebp, esp
00466EF3|.6A 00 push 0
00466EF5|.53 push ebx
00466EF6|.8BD8 mov ebx, eax
00466EF8|.33C0 xor eax, eax
00466EFA|.55 push ebp
00466EFB|.68 666F4600 push CNCG.00466F66
00466F00|.64:FF30 push dword ptr fs:
00466F03|.64:8920 mov dword ptr fs:, esp
00466F06|.8D55 FC lea edx, dword ptr
00466F09|.8B83 F8020000 mov eax, dword ptr
00466F0F|.E8 543EFDFF call CNCG.0043AD68 ;得到注册名的长度
00466F14|.837D FC 00 cmp dword ptr , 0 ;比较是否为空
00466F18|.75 12 jnz short CNCG.00466F2C ;不为空,跳走
00466F1A|.BA 7C6F4600 mov edx, CNCG.00466F7C ;请输入用户名或注册码
00466F1F|.8B83 28030000 mov eax, dword ptr
00466F25|.E8 7E3EFDFF call CNCG.0043ADA8
00466F2A|.EB 24 jmp short CNCG.00466F50
00466F2C|>8BC3 mov eax, ebx
00466F2E|.E8 45FDFFFF call CNCG.00466C78 ;关键算法,需要进入
00466F33|.84C0 test al, al ;al and al 的结果是否为0
00466F35|.74 09 je short CNCG.00466F40 ;为0,跳走,不成功
00466F37|.8BC3 mov eax, ebx
00466F39|.E8 C2FBFFFF call CNCG.00466B00 ;注册成功信息
00466F3E|.EB 10 jmp short CNCG.00466F50
进入到: 00466F2E 的关键 call 中后:
00466C78/$55 push ebp
00466C79|.8BEC mov ebp, esp
00466C7B|.33C9 xor ecx, ecx
00466C7D|.51 push ecx
00466C7E|.51 push ecx
00466C7F|.51 push ecx
00466C80|.51 push ecx
00466C81|.51 push ecx
00466C82|.51 push ecx
00466C83|.51 push ecx
00466C84|.51 push ecx
00466C85|.53 push ebx
00466C86|.56 push esi
00466C87|.8945 FC mov dword ptr , eax
00466C8A|.33C0 xor eax, eax
00466C8C|.55 push ebp
00466C8D|.68 076E4600 push CNCG.00466E07
00466C92|.64:FF30 push dword ptr fs:
00466C95|.64:8920 mov dword ptr fs:, esp
00466C98|.33C0 xor eax, eax
00466C9A|.8945 F4 mov dword ptr , eax ;初始化dword ptr 变量
00466C9D|.68 206E4600 push CNCG.00466E20 ;'The CNCG Crackme CrackED BY '
00466CA2|.8D55 EC lea edx, dword ptr
00466CA5|.8B45 FC mov eax, dword ptr
00466CA8|.8B80 F8020000 mov eax, dword ptr
00466CAE|.E8 B540FDFF call CNCG.0043AD68
00466CB3|.FF75 EC push dword ptr
00466CB6|.68 486E4600 push CNCG.00466E48 ;' '
00466CBB|.8D45 F8 lea eax, dword ptr
00466CBE|.BA 03000000 mov edx, 3
00466CC3|.E8 08D9F9FF call CNCG.004045D0 ;'The CNCG Crackme CrackED BY ' + 注册名 + ' '
00466CC8|.8B45 F8 mov eax, dword ptr ;连接后的字符串地址 送到 eax
00466CCB|.E8 40D8F9FF call CNCG.00404510
00466CD0|.8BF0 mov esi, eax
00466CD2|.85F6 test esi, esi
00466CD4|.7E 35 jle short CNCG.00466D0B
00466CD6|.BB 01000000 mov ebx, 1 ;计数初始化
00466CDB|>8D45 E8 /lea eax, dword ptr
00466CDE|.50 |push eax
00466CDF|.B9 01000000 |mov ecx, 1
00466CE4|.8BD3 |mov edx, ebx
00466CE6|.8B45 F8 |mov eax, dword ptr ;上面连接后的新字符串
00466CE9|.E8 7ADAF9FF |call CNCG.00404768
00466CEE|.8B45 E8 |mov eax, dword ptr
00466CF1|.E8 12DAF9FF |call CNCG.00404708
00466CF6|.8A00 |mov al, byte ptr ;依次取新字符串得每一位字符码 送 al
00466CF8|.25 FF000000 |and eax, 0FF ;与 0xFF 作 与 运算
00466CFD|.0145 F4 |add dword ptr , eax ;依次累加到变量中
00466D00|.71 05 |jno short CNCG.00466D07 ;不溢出,跳走
00466D02|.E8 25C7F9FF |call CNCG.0040342C
00466D07|>43 |inc ebx ;指向新字符串的下一字符
00466D08|.4E |dec esi ;计数减少1
00466D09|.^ 75 D0 \jnz short CNCG.00466CDB
00466D0B|>8D55 F0 lea edx, dword ptr ;我这里的结果:0ABE(注册名为:1时)
00466D0E|.8B45 FC mov eax, dword ptr
00466D11|.8B80 FC020000 mov eax, dword ptr
00466D17|.E8 4C40FDFF call CNCG.0043AD68
00466D1C|.8D55 E4 lea edx, dword ptr
00466D1F|.8B45 FC mov eax, dword ptr
00466D22|.8B80 FC020000 mov eax, dword ptr
00466D28|.E8 3B40FDFF call CNCG.0043AD68 ;读入注册码
00466D2D|.8B45 E4 mov eax, dword ptr ;地址送 eax
00466D30|.E8 D3D9F9FF call CNCG.00404708
00466D35|.E8 461FFAFF call CNCG.00408C80 ;得到注册码长度
00466D3A|.85C0 test eax, eax
00466D3C|.79 05 jns short CNCG.00466D43 ;注册码长度是否为空
00466D3E|.E8 E1C6F9FF call CNCG.00403424
00466D43|>8BF0 mov esi, eax
00466D45|.85F6 test esi, esi
00466D47|.7E 4A jle short CNCG.00466D93 ;为空,跳走
00466D49|.BB 01000000 mov ebx, 1 ;计数初始化
00466D4E|>8B45 F0 /mov eax, dword ptr ;注册码
00466D51|.4B |dec ebx
00466D52|.85C0 |test eax, eax ;注册码是否为空
00466D54|.74 05 |je short CNCG.00466D5B ;为空,跳走
00466D56|.3B58 FC |cmp ebx, dword ptr ;注册码长度是否为0
00466D59|.72 05 |jb short CNCG.00466D60 ;不为0,跳走
00466D5B|>E8 C4C6F9FF |call CNCG.00403424
00466D60|>43 |inc ebx ;ebx 增加1
00466D61|.8A4418 FF |mov al, byte ptr ;依次取注册名码值 送 al
00466D65|.3C 30 |cmp al, 30 ;与0比较
00466D67|.0F92C0 |setb al ;小于,出错
00466D6A|.8B55 F0 |mov edx, dword ptr
00466D6D|.4B |dec ebx
00466D6E|.85D2 |test edx, edx
00466D70|.74 05 |je short CNCG.00466D77
00466D72|.3B5A FC |cmp ebx, dword ptr ;注册码长度是否为0
00466D75|.72 05 |jb short CNCG.00466D7C ;不为0,跳走
00466D77|>E8 A8C6F9FF |call CNCG.00403424
00466D7C|>43 |inc ebx ;ebx 增加1
00466D7D|.8A541A FF |mov dl, byte ptr ;依次取注册名码值 送 al
00466D81|.80FA 39 |cmp dl, 39 ;与9比较
00466D84|.0F97C2 |seta dl ;大于,出错
00466D87|.0AC2 |or al, dl
00466D89|.74 04 |je short CNCG.00466D8F
00466D8B|.33DB |xor ebx, ebx
00466D8D|.EB 3D |jmp short CNCG.00466DCC
00466D8F|>43 |inc ebx
00466D90|.4E |dec esi
00466D91|.^ 75 BB \jnz short CNCG.00466D4E ;这个循环是要注册码必须是0~9之间的字符
00466D93|>8D55 E0 lea edx, dword ptr
00466D96|.8B45 FC mov eax, dword ptr
00466D99|.8B80 FC020000 mov eax, dword ptr
00466D9F|.E8 C43FFDFF call CNCG.0043AD68
00466DA4|.8B45 E0 mov eax, dword ptr
00466DA7|.E8 A01AFAFF call CNCG.0040884C ;这个call将注册码的字符串转为了16进制数值 送 eax
00466DAC|.3B45 F4 cmp eax, dword ptr ;比较注册名的运算结果 和 注册码
00466DAF 75 19 jnz short CNCG.00466DCA ;相等,不跳,成功
00466DB1|.B3 01 mov bl, 1
00466DB3|.B8 58AC4600 mov eax, CNCG.0046AC58
00466DB8|.8B55 F8 mov edx, dword ptr
00466DBB|.E8 ECD4F9FF call CNCG.004042AC
00466DC0|.8B45 F4 mov eax, dword ptr
00466DC3|.A3 5CAC4600 mov dword ptr , eax
00466DC8|.EB 02 jmp short CNCG.00466DCC
00466DCA|>33DB xor ebx, ebx
00466DCC|>33C0 xor eax, eax
从上面,便知道这个程序的运算就是:
将 字符串'The CNCG Crackme CrackED BY ' 连接上 (注册名) 再连接上 字符串' ' 后,得到一个新的字符串,然后依次取这个字符串的ASCII码值,循环累加后得到一个数值,放入到所指的变量处,然后读入注册码,如果注册码的大小与这个数值相等,就注册成功了,那么当我的注册名是1时,我的正确注册码就是: 2750 了, 哈哈 ^_^
成功的注册信息:
注册名: 1
注册码: 2750
-----------------------------------------------------------------------------------
【版权声明】: 本文由 CuteSnail 原创, 转载请注明作者并保持文章的完整性, 谢谢! 再见!!
页:
[1]