- UID
- 42390
注册时间2007-12-21
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
【文章标题】: 一个 [UBC]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 [UBC]cra.00458874
00458810 |. 64:FF30 push dword ptr fs:[eax]
00458813 |. 64:8920 mov dword ptr fs:[eax], esp
00458816 |. E8 45FFFFFF call [UBC]cra.00458760 ; 由 注册名 产生结果,需要跟进分析
0045881B |. 8D55 FC lea edx, dword ptr [ebp-4]
0045881E |. 8B83 D0020000 mov eax, dword ptr [ebx+2D0]
00458824 |. E8 97CDFCFF call [UBC]cra.004255C0 ; 得到注册码
00458829 |. 8B45 FC mov eax, dword ptr [ebp-4] ; 地址送 eax
0045882C |. E8 43EFFAFF call [UBC]cra.00407774 ; 将注册码转为16进制数, 放 eax 中
00458831 |. 3B05 44B84500 cmp eax, dword ptr [45B844] ; 比较两者是否相同
00458837 75 1B jnz short [UBC]cra.00458854 ; 不相同,跳走,失败
00458839 |. B8 88884500 mov eax, [UBC]cra.00458888 ; You cracked the UBC CrackMe#1 !
0045883E |. E8 29C1FEFF call [UBC]cra.0044496C
00458843 |. BA E8884500 mov edx, [UBC]cra.004588E8 ; CRACKED
00458848 |. A1 3CB84500 mov eax, dword ptr [45B83C]
0045884D |. E8 9ECDFCFF call [UBC]cra.004255F0
00458852 |. EB 0A jmp short [UBC]cra.0045885E
00458854 |> B8 F8884500 mov eax, [UBC]cra.004588F8 ; Try Again !
00458859 |. E8 0EC1FEFF call [UBC]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, [UBC]cra.0045B844
0045876D |. BE 48B84500 mov esi, [UBC]cra.0045B848
00458772 |. BF 40B84500 mov edi, [UBC]cra.0045B840 ; ASCII "淜?
00458777 |. 33C0 xor eax, eax
00458779 |. 55 push ebp
0045877A |. 68 F3874500 push [UBC]cra.004587F3
0045877F |. 64:FF30 push dword ptr fs:[eax]
00458782 |. 64:8920 mov dword ptr fs:[eax], esp
00458785 |. 8D55 FC lea edx, dword ptr [ebp-4]
00458788 |. A1 3CB84500 mov eax, dword ptr [45B83C]
0045878D |. 8B80 CC020000 mov eax, dword ptr [eax+2CC]
00458793 |. E8 28CEFCFF call [UBC]cra.004255C0 ; 得到注册名长度
00458798 |. 8B55 FC mov edx, dword ptr [ebp-4]
0045879B |. 8BC7 mov eax, edi
0045879D |. E8 9AB0FAFF call [UBC]cra.0040383C
004587A2 |. 33C0 xor eax, eax
004587A4 |. 8903 mov dword ptr [ebx], eax
004587A6 |. 8B07 mov eax, dword ptr [edi]
004587A8 |. E8 B7B2FAFF call [UBC]cra.00403A64 ; 得到注册名长度
004587AD |. 85C0 test eax, eax ; 是否为空
004587AF |. 7E 19 jle short [UBC]cra.004587CA ; 为空,跳走
004587B1 |. C706 01000000 mov dword ptr [esi], 1
004587B7 |> 8B17 /mov edx, dword ptr [edi] ; 注册名
004587B9 |. 8B0E |mov ecx, dword ptr [esi] ; 计数加1
004587BB |. 0FB6540A FF |movzx edx, byte ptr [edx+ecx-1] ; 依次取注册名的ASCII码值
004587C0 |. C1E2 03 |shl edx, 3 ; 左移3位
004587C3 |. 0113 |add dword ptr [ebx], edx ; 结果送变量 累加
004587C5 |. FF06 |inc dword ptr [esi] ; 计数增加1
004587C7 |. 48 |dec eax ; 注册名长度减去1
004587C8 |.^ 75 ED \jnz short [UBC]cra.004587B7 ; 注册名长度是否被减为0了,是则跳出循环
004587CA |> 8B07 mov eax, dword ptr [edi]
004587CC |. E8 93B2FAFF call [UBC]cra.00403A64 ; 得到注册名长度
004587D1 |. C1E0 03 shl eax, 3 ; 然后左移3位
004587D4 |. 0103 add dword ptr [ebx], eax ; 再与上面循环结果 相加
004587D6 |. 8B03 mov eax, dword ptr [ebx] ; 回送 eax
004587D8 |. C1E0 02 shl eax, 2 ; 再左移2位
004587DB |. 8903 mov dword ptr [ebx], 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:[eax], edx
004587E5 |. 68 FA874500 push [UBC]cra.004587FA
004587EA |> 8D45 FC lea eax, dword ptr [ebp-4]
004587ED |. E8 F6AFFAFF call [UBC]cra.004037E8
004587F2 \. C3 retn
从上面,便知道这个程序的运算就是: 以注册名的长度为循环次数,依次取注册名的每一位字符的ASCII码值并左移3位,得到其
结果依次累加后,放入到变量[ebx]处; 再取注册名的长度并将长度左移3位,再和前面循环得到的结果相加,最后将相加后的结
果再左移2位,便得到了一个最终结果; 然后再读入注册码的数据,并转换为16进制数,然后两者比较,相等,便注册成功了,那么
当我的注册名是: 1 时,我的正确注册码就是: 1600 了, 哈哈 ^_^
成功的注册信息:
注册名: 1
注册码: 1600
-----------------------------------------------------------------------------------
【版权声明】: 本文由 CuteSnail 原创, 转载请注明作者并保持文章的完整性, 谢谢! 再见!! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
|