【文章标题】: 一个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:[eax]
00466F03 |. 64:8920 mov dword ptr fs:[eax], esp
00466F06 |. 8D55 FC lea edx, dword ptr [ebp-4]
00466F09 |. 8B83 F8020000 mov eax, dword ptr [ebx+2F8]
00466F0F |. E8 543EFDFF call CNCG.0043AD68 ; 得到注册名的长度
00466F14 |. 837D FC 00 cmp dword ptr [ebp-4], 0 ; 比较是否为空
00466F18 |. 75 12 jnz short CNCG.00466F2C ; 不为空,跳走
00466F1A |. BA 7C6F4600 mov edx, CNCG.00466F7C ; 请输入用户名或注册码
00466F1F |. 8B83 28030000 mov eax, dword ptr [ebx+328]
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 [ebp-4], eax
00466C8A |. 33C0 xor eax, eax
00466C8C |. 55 push ebp
00466C8D |. 68 076E4600 push CNCG.00466E07
00466C92 |. 64:FF30 push dword ptr fs:[eax]
00466C95 |. 64:8920 mov dword ptr fs:[eax], esp
00466C98 |. 33C0 xor eax, eax
00466C9A |. 8945 F4 mov dword ptr [ebp-C], eax ; 初始化dword ptr [ebp-C]变量
00466C9D |. 68 206E4600 push CNCG.00466E20 ; 'The CNCG Crackme CrackED BY '
00466CA2 |. 8D55 EC lea edx, dword ptr [ebp-14]
00466CA5 |. 8B45 FC mov eax, dword ptr [ebp-4]
00466CA8 |. 8B80 F8020000 mov eax, dword ptr [eax+2F8]
00466CAE |. E8 B540FDFF call CNCG.0043AD68
00466CB3 |. FF75 EC push dword ptr [ebp-14]
00466CB6 |. 68 486E4600 push CNCG.00466E48 ; ' [CNCG]'
00466CBB |. 8D45 F8 lea eax, dword ptr [ebp-8]
00466CBE |. BA 03000000 mov edx, 3
00466CC3 |. E8 08D9F9FF call CNCG.004045D0 ; 'The CNCG Crackme CrackED BY ' + 注册名 + ' [CNCG]'
00466CC8 |. 8B45 F8 mov eax, dword ptr [ebp-8] ; 连接后的字符串地址 送到 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 [ebp-18]
00466CDE |. 50 |push eax
00466CDF |. B9 01000000 |mov ecx, 1
00466CE4 |. 8BD3 |mov edx, ebx
00466CE6 |. 8B45 F8 |mov eax, dword ptr [ebp-8] ; 上面连接后的新字符串
00466CE9 |. E8 7ADAF9FF |call CNCG.00404768
00466CEE |. 8B45 E8 |mov eax, dword ptr [ebp-18]
00466CF1 |. E8 12DAF9FF |call CNCG.00404708
00466CF6 |. 8A00 |mov al, byte ptr [eax] ; 依次取新字符串得每一位字符码 送 al
00466CF8 |. 25 FF000000 |and eax, 0FF ; 与 0xFF 作 与 运算
00466CFD |. 0145 F4 |add dword ptr [ebp-C], 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 [ebp-10] ; 我这里[ebp-C]的结果:0ABE(注册名为:1时)
00466D0E |. 8B45 FC mov eax, dword ptr [ebp-4]
00466D11 |. 8B80 FC020000 mov eax, dword ptr [eax+2FC]
00466D17 |. E8 4C40FDFF call CNCG.0043AD68
00466D1C |. 8D55 E4 lea edx, dword ptr [ebp-1C]
00466D1F |. 8B45 FC mov eax, dword ptr [ebp-4]
00466D22 |. 8B80 FC020000 mov eax, dword ptr [eax+2FC]
00466D28 |. E8 3B40FDFF call CNCG.0043AD68 ; 读入注册码
00466D2D |. 8B45 E4 mov eax, dword ptr [ebp-1C] ; 地址送 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 [ebp-10] ; 注册码
00466D51 |. 4B |dec ebx
00466D52 |. 85C0 |test eax, eax ; 注册码是否为空
00466D54 |. 74 05 |je short CNCG.00466D5B ; 为空,跳走
00466D56 |. 3B58 FC |cmp ebx, dword ptr [eax-4] ; 注册码长度是否为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 [eax+ebx-1] ; 依次取注册名码值 送 al
00466D65 |. 3C 30 |cmp al, 30 ; 与0比较
00466D67 |. 0F92C0 |setb al ; 小于,出错
00466D6A |. 8B55 F0 |mov edx, dword ptr [ebp-10]
00466D6D |. 4B |dec ebx
00466D6E |. 85D2 |test edx, edx
00466D70 |. 74 05 |je short CNCG.00466D77
00466D72 |. 3B5A FC |cmp ebx, dword ptr [edx-4] ; 注册码长度是否为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 [edx+ebx-1] ; 依次取注册名码值 送 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 [ebp-20]
00466D96 |. 8B45 FC mov eax, dword ptr [ebp-4]
00466D99 |. 8B80 FC020000 mov eax, dword ptr [eax+2FC]
00466D9F |. E8 C43FFDFF call CNCG.0043AD68
00466DA4 |. 8B45 E0 mov eax, dword ptr [ebp-20]
00466DA7 |. E8 A01AFAFF call CNCG.0040884C ; 这个call将注册码的字符串转为了16进制数值 送 eax
00466DAC |. 3B45 F4 cmp eax, dword ptr [ebp-C] ; 比较注册名的运算结果 和 注册码
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 [ebp-8]
00466DBB |. E8 ECD4F9FF call CNCG.004042AC
00466DC0 |. 8B45 F4 mov eax, dword ptr [ebp-C]
00466DC3 |. A3 5CAC4600 mov dword ptr [46AC5C], eax
00466DC8 |. EB 02 jmp short CNCG.00466DCC
00466DCA |> 33DB xor ebx, ebx
00466DCC |> 33C0 xor eax, eax
从上面,便知道这个程序的运算就是:
将 字符串'The CNCG Crackme CrackED BY ' 连接上 (注册名) 再连接上 字符串' [CNCG]' 后,得到一个新的字符串,然后依次取这个字符串的ASCII码值,循环累加后得到一个数值,放入到[ebp-C]所指的变量处,然后读入注册码,如果注册码的大小与这个数值相等,就注册成功了,那么当我的注册名是1时,我的正确注册码就是: 2750 了, 哈哈 ^_^
成功的注册信息:
注册名: 1
注册码: 2750
-----------------------------------------------------------------------------------
【版权声明】: 本文由 CuteSnail 原创, 转载请注明作者并保持文章的完整性, 谢谢! 再见!!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!