一个 [UBC]crackme #1 的算法分析
【文章标题】: 一个 crackme #1 的算法分析【文章作者】: CuteSnail
【作者QQ号】: 121567771
【作者声明】: 只是感兴趣的自娱自乐,没有其他目的。失误之处还要敬请诸位大侠赐教!
-------------------------------------------------------------------------------
【详细过程】
使用OD载入该程序后运行它,然后输入 假的注册名: 1 和 假的注册码: 2, 然后通过字符串参考'You cracked the UBC Cra
ckMe#1 ! Please send your solution to [email protected] !'来到注册相关的地方:
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 原创, 转载请注明作者并保持文章的完整性, 谢谢! 再见!! 没了人顶吗,顶下,适合新手
/:001 /:001
页:
[1]