CuteSnail 发表于 2007-12-26 12:20:24

一个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]
查看完整版本: 一个CNCG的CrackMe注册分析