CuteSnail 发表于 2007-12-26 12:21:33

一个 [UBC]crackme #1 的算法分析

【文章标题】: 一个 crackme #1 的算法分析
【文章作者】: CuteSnail
【作者QQ号】: 121567771
【作者声明】: 只是感兴趣的自娱自乐,没有其他目的。失误之处还要敬请诸位大侠赐教!
-------------------------------------------------------------------------------
【详细过程】

使用OD载入该程序后运行它,然后输入 假的注册名: 1 和 假的注册码: 2, 然后通过字符串参考'You cracked the UBC Cra
ckMe#1 ! Please send your solution to ubcrackers@hotmail.com !'来到注册相关的地方:


00458800/.55                push    ebp                         ;从这里开始分析:
00458801|.8BEC            mov   ebp, esp
00458803|.6A 00             push    0
00458805|.53                push    ebx
00458806|.8BD8            mov   ebx, eax
00458808|.33C0            xor   eax, eax
0045880A|.55                push    ebp
0045880B|.68 74884500       push    cra.00458874
00458810|.64:FF30         push    dword ptr fs:
00458813|.64:8920         mov   dword ptr fs:, esp
00458816|.E8 45FFFFFF       call    cra.00458760         ;由 注册名 产生结果,需要跟进分析
0045881B|.8D55 FC         lea   edx, dword ptr
0045881E|.8B83 D0020000   mov   eax, dword ptr
00458824|.E8 97CDFCFF       call    cra.004255C0         ;得到注册码
00458829|.8B45 FC         mov   eax, dword ptr       ;地址送 eax
0045882C|.E8 43EFFAFF       call    cra.00407774         ;将注册码转为16进制数, 放 eax 中
00458831|.3B05 44B84500   cmp   eax, dword ptr    ;比较两者是否相同
00458837      75 1B             jnz   short cra.00458854   ;不相同,跳走,失败
00458839|.B8 88884500       mov   eax, cra.00458888      ;You cracked the UBC CrackMe#1 !
0045883E|.E8 29C1FEFF       call    cra.0044496C
00458843|.BA E8884500       mov   edx, cra.004588E8      ;CRACKED
00458848|.A1 3CB84500       mov   eax, dword ptr
0045884D|.E8 9ECDFCFF       call    cra.004255F0
00458852|.EB 0A             jmp   short cra.0045885E
00458854|>B8 F8884500       mov   eax, cra.004588F8      ;Try Again !
00458859|.E8 0EC1FEFF       call    cra.0044496C
0045885E|>33C0            xor   eax, eax


进入到: 00458816 的关键 call 中后:


00458760/$55                push    ebp
00458761|.8BEC            mov   ebp, esp
00458763|.6A 00             push    0
00458765|.53                push    ebx
00458766|.56                push    esi
00458767|.57                push    edi
00458768|.BB 44B84500       mov   ebx, cra.0045B844
0045876D|.BE 48B84500       mov   esi, cra.0045B848
00458772|.BF 40B84500       mov   edi, cra.0045B840      ;ASCII "淜?
00458777|.33C0            xor   eax, eax
00458779|.55                push    ebp
0045877A|.68 F3874500       push    cra.004587F3
0045877F|.64:FF30         push    dword ptr fs:
00458782|.64:8920         mov   dword ptr fs:, esp
00458785|.8D55 FC         lea   edx, dword ptr
00458788|.A1 3CB84500       mov   eax, dword ptr
0045878D|.8B80 CC020000   mov   eax, dword ptr
00458793|.E8 28CEFCFF       call    cra.004255C0         ;得到注册名长度
00458798|.8B55 FC         mov   edx, dword ptr
0045879B|.8BC7            mov   eax, edi
0045879D|.E8 9AB0FAFF       call    cra.0040383C
004587A2|.33C0            xor   eax, eax
004587A4|.8903            mov   dword ptr , eax
004587A6|.8B07            mov   eax, dword ptr
004587A8|.E8 B7B2FAFF       call    cra.00403A64         ;得到注册名长度
004587AD|.85C0            test    eax, eax                  ;是否为空
004587AF|.7E 19             jle   short cra.004587CA   ;为空,跳走
004587B1|.C706 01000000   mov   dword ptr , 1
004587B7|>8B17            /mov   edx, dword ptr        ;注册名
004587B9|.8B0E            |mov   ecx, dword ptr        ;计数加1
004587BB|.0FB6540A FF       |movzx   edx, byte ptr ;依次取注册名的ASCII码值
004587C0|.C1E2 03         |shl   edx, 3                     ;左移3位
004587C3|.0113            |add   dword ptr , edx       ;结果送变量 累加
004587C5|.FF06            |inc   dword ptr             ;计数增加1
004587C7|.48                |dec   eax                        ;注册名长度减去1
004587C8|.^ 75 ED             \jnz   short cra.004587B7    ;注册名长度是否被减为0了,是则跳出循环
004587CA|>8B07            mov   eax, dword ptr
004587CC|.E8 93B2FAFF       call    cra.00403A64         ;得到注册名长度
004587D1|.C1E0 03         shl   eax, 3                      ;然后左移3位
004587D4|.0103            add   dword ptr , eax      ;再与上面循环结果 相加
004587D6|.8B03            mov   eax, dword ptr       ;回送 eax
004587D8|.C1E0 02         shl   eax, 2                      ;再左移2位
004587DB|.8903            mov   dword ptr , eax      ;得到最终结果
004587DD|.33C0            xor   eax, eax                  ;eax 清零
004587DF|.5A                pop   edx
004587E0|.59                pop   ecx
004587E1|.59                pop   ecx
004587E2|.64:8910         mov   dword ptr fs:, edx
004587E5|.68 FA874500       push    cra.004587FA
004587EA|>8D45 FC         lea   eax, dword ptr
004587ED|.E8 F6AFFAFF       call    cra.004037E8
004587F2\.C3                retn


从上面,便知道这个程序的运算就是: 以注册名的长度为循环次数,依次取注册名的每一位字符的ASCII码值并左移3位,得到其
结果依次累加后,放入到变量处; 再取注册名的长度并将长度左移3位,再和前面循环得到的结果相加,最后将相加后的结
果再左移2位,便得到了一个最终结果; 然后再读入注册码的数据,并转换为16进制数,然后两者比较,相等,便注册成功了,那么
当我的注册名是: 1 时,我的正确注册码就是: 1600 了, 哈哈 ^_^
         
成功的注册信息:
         
注册名: 1
注册码: 1600

-----------------------------------------------------------------------------------
【版权声明】: 本文由 CuteSnail 原创, 转载请注明作者并保持文章的完整性, 谢谢! 再见!!

ert4e 发表于 2008-1-9 20:47:07

没了人顶吗,顶下,适合新手
/:001 /:001
页: [1]
查看完整版本: 一个 [UBC]crackme #1 的算法分析