【暑假活动后续】"最后的CM"破解超详细解析 追码爆破+文图说明+演示教程
本帖最后由 Peace 于 2011-8-5 14:59 编辑【暑假活动后续】"最后的CM"详细解析(追码+爆破)CM的破解探讨
作者:Kris
感谢指导:qaz大大,小生吾怕怕大大
帖子链接:http://bbs.52pojie.cn/thread-101488-1-1.html
废话不多说,俺是菜菜,第一次写破文,写的不对的地方还请大大指教!
如果觉得做得好,求加分!!!!!!!!!!!!!!!!~~~~
首先,我们打开CM看一下
看到这个CM的界面以后,可以明确2点:
1.该CM应该的单机单号,有机器码和注册码,也就是说在点注册按钮的时候应该会计算出真码
2.该CM存在按钮,应该是按下按钮以后才会检测Key是否正确,而不是在输入Key的时候就检测或者用其他方式检测的
明确了这2点后,把CM放到E-Debug中运行,并点击按钮,E-Debug告诉我们按钮事件的位置为004026B7
为什么有那么多个事件,却说按钮事件为004026B7呢?因为我们只点击了一次按钮,在这些事件中只有一次的就只有
事件发生: 00401A11
事件发生: 004026B7
注意,事件发生: 00401A11是在窗体创建的时候就已经发生的事件,而不是在我们点击按钮之后才发生的,因此,按钮事件就为004026B7了
得到了按钮事件的地址,我们可以关闭掉E-Debug了,现在打开今天的主角OD,把CM拖入OD后运行,在按钮事件004026B7处下断点,然后点击按钮,就中断住了
F7单步跟踪,跟到0044F223的时候发现关键代码
调用CreateThread创建线程,堆栈窗口信息如下
线程的地址是40340A,我们在40340A处下断,然后继续让程序运行,很快,OD就中断在40340A了,F8继续跟踪,执行完
00403438 E8 0AF3FFFF call 00402747
出现了可疑字符串,有可能是真码
因此,我们把断点清除一下,然后在00403438处下断,重新载入运行并点击按钮,然后会中断在00403438,这个时候我们F7跟进这个CALL
发现了一大堆算法指令,果断无视它们,写注册机以我的水平简直就是天方夜谭,况且这个CM还是qaz大大写的,因此我们不研究算法,只研究追码和爆破
在算法指令跑完之后,好像没有发现什么可疑的判断真码和假码是否相同的代码,但是在算法结束后,发现了这样一句指令
004028A4 C705 1CFE4A00 01000000mov dword ptr ds:,0x1
把4AFE1C这个位置赋值为1,至于为什么要这样做,程序里面肯定有用到这个的地方,
因此,我们执行这一句指令的时候,在004AFE1C处下内存访问断点,然后点运行按钮,继续让程序运行
不久后OD中断在
00401F4B 833D 1CFE4A00 01 cmp dword ptr ds:,0x1
00401F52 0F85 4A000000 jnz 00401FA2
这两句的作用是用与1作比较,如果不同则跳,
我们知道,在执行完刚才的生成真码的函数以后这里才会变为1,否则这里一直是为0的,因此这里判断它是否为1,很可能就是判断是否已经产生了真码,
也就是说这里很可能将会对真码和假码做比较,看是否相同,所以我们这里继续F7单步步入,不久后又看到了关键代码
以下回复可见
**** Hidden Message *****如果觉得做得好,求加分!!!!!!!!!!!!!!!!~~~~
{:1_932:}膜拜K大牛,第一名是你的了。
膜拜一下!学习思路 {:1_908:}楼主太厉害了,又学到了东西了 膜拜..你懂的. 还没看完呢。。 怎么成了回复可见了 膜拜第一名 sb123456 来看教程咯~~