下面这个连接下的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运行,程序出来一下就自动退出了,为什么啊?????
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课