【文章标题】: CrackMe分析1.11.12.28
【文章作者】: HcyRcer
【作者邮箱】: 421458119@qq.com
【作者主页】: http://hi.baidu.com/kao4ni/home
【作者QQ号】: 421458119
【加壳方式】: 无
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这是 CrackMe的第三关,难度5,好怕怕!!!感觉应该不好弄!!! 但后来证明我 大错特错!!
不是太难了,,而是太容易了!!后面再告诉你!!!
开始!
看到这个 CrackMe 一大堆 复选框!!心形的!!不用输入任何字符串!! 怎么Crack呢?很疑惑,
第一次见这种模式! 管他呢,直接点 [CHECK] ,弹出一个错误对话框!!
那我们就打开OD下 MessageBoxA 断点!! 结果无法断下!! 然后我又下了 很多类似对话框的断点
例如: ENDDLG DIALOGBOX cratewindow....等很多,,均无法断下!!很是疑惑!既然不能从对话框
入手,我们就换个方法吧,不浪费时间了(如果有高人知道 为什么 MessageBox无法下,请告诉我,谢谢)。 我们仍旧 DEDE!!!嘿嘿 !!!毫无疑问。就是它了 SpeedButton3Click 0044C7F4!!!
OD重载后,对此地址下断!!
直接点击[CHECK],程序在 0044C7F4 断下!!断下后,我们F8单步走!!走到第一个 判断处
0044C812 call dword ptr ds:[edx+B8]
0044C818 test al,al
0044C81A je CrackMe_.0044C8ED ; 跳就错
发现 只要跳到 0044C8ED 地址程序就会结束并提示错误!!所以不能让它跳,如果才能不让它跳呢?
我们发现 0044C81A je CrackMe_.0044C8ED 的上一句 0044C818 test al,al 是判断是否跳转的 语句!! //test al,al 联合下句 JE 的意思为: AL为 0跳!!!
我们进入这个 0044C812 call dword ptr ds:[edx+B8] 看看。为什么AL的 会为0!!
大家有没有感觉到这个 CALL很奇怪,这个CALL 函数地址是个变量!!可以看出 [edx+B8]是一个 函数
指针!!F8单步后,发现 是一大片,差不多的函数!! 只是常量稍微变下!!如下图
可以感觉到!!程序是不是在用指针 取变量!拿出其中一个看下
0044C820 mov eax,dword ptr ds:[ebx+328] //每次只是这个 328常量改变下,其他都一样
0044C826 mov edx,dword ptr ds:[eax]
0044C828 call dword ptr ds:[edx+B8]
0044C82E test al,al
0044C830 je CrackMe_.0044C8ED ; 跳就错
0044C836 mov eax,dword ptr ds:[ebx+32C] //每次只是这个 328常量改变下,其他都一样
0044C83C mov edx,dword ptr ds:[eax]
0044C83E call dword ptr ds:[edx+B8]
0044C844 test al,al
0044C846 je CrackMe_.0044C8ED ; 跳就错
每次到 F8到 call dword ptr ds:[edx+B8]时,发现 EDX始终为 0041E398!
所以 call dword ptr ds:[edx+B8] 每次都在调用同一个函数!!!//因为EDX值相同
我们进入 call dword ptr ds:[edx+B8] 这个大量调用的CALL看看!!F7进入!
发现 影响跳转的 AL值 是根据 cmp byte ptr ds:[eax+1F2],1 !根据EAX来的!!
我们跳出CALL,向上追EAX的值 !EAX来源于 不同地址的值!
0044C836 mov eax,dword ptr ds:[ebx+变量]
0044C83C mov edx,dword ptr ds:[eax]
0044C83E call dword ptr ds:[edx+B8]
0044C844 test al,al
0044C846 je CrackMe_.0044C8ED
难点来了!! CALL 中的 EAX的值 与 EAX有关,EAX来自 [ebx+变量] !!感觉 [ebx+变量] 应该是一个地址表!!没错,它就一个地址表!!
难点是什么? 1.CALL是 指针,不是固定值
2.eax既能影响 CALL的地址,又能影响 cmp byte ptr ds:[eax+1F2],1 返回值
结果导致,看到满大片 都是 指针,与 指向指针的指针, 函数指针!!!!立刻晕倒!!!
我心想,这作者挺厉害的 整那么多 指针,也弄不错!!
继续我们的 追 mov eax,dword ptr ds:[ebx+变量]中 EAX的来源 !!EAX与 [ebx+变量]有关!
我们 找EBX ,晕倒,向上找到 按钮过程的起点,竟然没EBX的来源!!于是就不追了!!
反正就一个 劲的 F8,向下跟 ,遇到调就 不让它跳,竟然 弹出 正确的 对话框!!!!!!
到此结束!!晕倒!!! 竟然没算法!!
究竟是怎么判断的呢? 然后我在想 是什么影响了 [ebx+变量]的值!!
看到CHECK上的 选择框 !!心想是不是它呢? 于是就把所有的 勾打上,点击[CHECK] 竟然成功了!! 当即晕倒!!!
【经验总结】
感觉像 开了一个玩笑,竟然被这个小小的 CRACKME 忽悠了好几个小时!!
主要原因还是:它CALL 的是 变量值。。。让我搞不懂。。
现在总算明白了!!不是 CRACKME的作者 对指针 熟练度高,而是 DEPHIL 优化的结果!!
破解方法:
把 心上 所有的 勾,选上即可!!!!!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2011年12月28日 6:36:55
CrackMe_7.rar