首页
社区
课程
招聘
偶对一个CrackMe的分析,不过到一半就遇到了问题
发表于: 2007-2-5 16:44 4906

偶对一个CrackMe的分析,不过到一半就遇到了问题

2007-2-5 16:44
4906
下面这个连接下的CrackMe
http://bbs.pediy.com/showthread.php?threadid=12375
后面有偶的一些分析后遇到的问题.

首先运行CrackMe.exe

填写注册名:rageliu,密码:12345,点ok。

提示“注册码错误”,看来使用参考字符串的方式很容易就能找到下断的地方,不过这里我们使用另一种方式:函数断点,顺便说说函数调用压栈的问题,及从函数调用堆栈看返回地址从而回到用户程序空间。

OD加载CrackMe.exe后F9运行,前面我们看到注册码错误有消息框提示,我们想到下MessageBoxA函数断点,在OD输入命令:bp MessageBoxA后回车,这样就对MessageBox()函数下了断点,只要有对MessageBox()函数的调用,就会中断在MessageBox()函数的入口处(注意这里,是中断在入口处,后面会有说明)。

下好函数断点后我们填写注册名:rageliu,密码:12345,点ok。OD弹出,显示中断在77D504EA处。这里注意OD标题显示,当前在系统的USER32空间,这就是前面说注意中断在MessageBox()函数的入口处的原因,MessageBox()函数的入口就是在USER32空间,所以这是正常的。

在USER32空间对我们分析来说没有什么意义,所以我们要想办法返回到我们感兴趣的CrackMe.exe空间,这里也有很多方式,今天我们通过分析堆栈来看返回地址,先看中断处的代码:

77D504EA >  8BFF            MOV EDI,EDI                //中断在这里
77D504EC    55              PUSH EBP       
77D504ED    8BEC            MOV EBP,ESP

我们知道MessageBox()是标准的API调用,所以堆栈里面应该有返回地址的记录,我们观察堆栈如下:

0012F830   73D8DE23  /调用到 MessageBoxA from MFC42.73D8DE1D                        //当前esp在这里
0012F834   00150602  |hOwner = 00150602 ('CrackMe',class='#32770')
0012F838   00373C68  |Text = "注册码错误"
0012F83C   00372770  |Title = "CrackMe"
0012F840   00000000  \Style = MB_OK|MB_APPLMODAL
0012F844   0012FE88
0012F848   00401606  RETURN to CrackMe.00401606 from <JMP.&MFC42.#4224>

注意最后一句:
0012F848   00401606  RETURN to CrackMe.00401606 from <JMP.&MFC42.#4224>
这里的CrackMe.00401606应该就是我们返回CrackMe.exe的地址吧??那后面的from <JMP.&MFC42.#4224>是什么意思呢??很明显是说从MFC42的空间返回的CrackMe.exe的空间,慢着,我们目前不是在USER32的空间吗??怎么会是MFC42的空间返回呢???

上面的疑问说明什么呢?说明是从CrackMe.exe进入的MFC42的空间,再从MFC42的空间进入了当前这个USER32的空间,这样返回当然就是先从当前的Uesr32空间到MFC42的空间,再从MFC42的空间返回CrackMe.exe的空间,下面偶们验证一下是不是这样:

按一下F8,注意到堆栈的变换了吗?多了下面这句:

0012F830   73D8DE23  RETURN to MFC42.73D8DE23 from USER32.MessageBoxA

哈哈,很明显和我们前面想的一样,先要从USER32空间返回到MFC42的空间。

接下来按Ctrl+F9,弹出了错误提示框“注册码错误”,点击“确定”后,到了这里:
77D50530    C2 1000         RETN 10
函数调用结束,按下F8,哈哈,看到了吗?OD标题,真的是返回到了MFC42的空间。后面我们就不罗嗦了,接着Ctrl+F9到RETN后按F8,就来到我们希望的CrackMe.exe空间:
004015FF   .  8BCE          MOV ECX,ESI
00401601   .  E8 0C070000   CALL <JMP.&MFC42.#4224>
00401606   .  68 EC404000   PUSH CrackMe.004040EC   //返回在这里
0040160B   .  8D4C24 14     LEA ECX,DWORD PTR SS:[ESP+14]

接着都对上面的004015FF   .  8BCE          MOV ECX,ESI下断,这就出了问题,一按F9运行,程序出来一下就自动退出了,为什么啊?????

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
ALT +F9返回程序领空
点确定按钮
断下
你要找的就是那里了
++++++++++


可能我是错的
我经常出错
不知道为什么
2007-2-5 17:19
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
3
发贴的不是说了有ANTI么,所以就这么退出了啊.用IsDebugPresent插件隐藏就可以.
2007-2-5 18:06
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
感觉有内存CRC……
2007-2-5 18:15
0
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
谢谢楼上朋友们的热心回答,anti和crc什么的偶都不知道是什么,不过知道原因就好了,我去研究研究,等明白了的看能不能写出它的注册机
2007-2-6 13:07
0
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
偶去下了原作者的说明资料,里面有这样的说明"在源代码/Release 里面有个CrackMe的EXE文件,上面已经经过处理的了,如果直接编译的话生成的EXE文件肯定是不能运行的,因为文件的CRC代码还要在EXE编译后再自己手动添加的."

楼上厉害哦,原来真的有CRC
2007-2-6 13:12
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
7
实在是太容易了,给你一个正确答案
上传的附件:
2007-2-6 17:49
0
游客
登录 | 注册 方可回帖
返回
//