OllyDbg破解系列学习笔记(三)

来源:互联网 发布:淘宝客联盟我的舞台 编辑:程序博客网 时间:2024/04/28 05:00

第十二章  消息断点


在程序检测CC断点的情况,使用消息断点的效果会更好。我们知道Windows窗口程序至少有一个消息循环,消息循环有特定的API函数构成,最常见的是GetMessage和DispatchMessage函数,有的消息循环也会用到其他的API函数。

实验:

1、普通CC断点获取文本
加载我们的测试CrackMe,在反汇编窗口中右键选择-Search—Name(label) in current module,可以查看当前模块的导入函数名称表,获取编辑框文本常用的API是GetDlgItemTextA(W)或者GetWindowTextA(W)。我们在列表中可以看到GetDlgItemTextA,但并不意味这个函数就是用来读取用户输入的用户名和序列号的,可能是获取用户输入的其他字段,也有可能是作者故意添加来误导我们。还有就是该API函数可以通过不同的方式来动态加载,不一定通过导入表。我们可以通过如下两个方式设置断点:


下断后,运行程序,输入用户名和序列号点击OK程序会断在我们下断API的汇编代码的第一句处,此时我们注意堆栈


我们在菜单栏选择调试-执行到返回,我们看数据区0x0040218E,用户名已经存在缓冲区里了,F9运行会再次断在GetDlgItemTextA函数处,此时是获取密码框的。
很多有经验的程序员不使用API函数来获取编辑框中文本,而是直接通过发送消息获取编辑框中的文本。

2、消息断点
首先我们单击工具栏中的B删除之前所有CC断点。消息断点与普通CC断点的区别在于,普通CC断点在程序启动之前就可以设置,但是对于消息断点来说,只有在窗口创建之后才能设置以及拦截消息。
F9让程序运行起来,点击工具栏中的W打开窗口列表:


找到Class(类名)为Button,Title(标题)为OK的窗口,在此行单击右键选择--Message Breakpoint on ClassProc(在classProc上设置消息断点),按如下设置:


在Message(消息)下拉列表中选择202 WM_LBUTTONUP,并且选择Break on any Window(当前程序任何窗口接收到该消息都中断),以及Pause program(中断程序),并且选中Log WinProc argument(记录消息过程函数的参数)。设置完毕后点击确定,可以看到OK和cancel按钮都被设置了断点:


下面我们输入用户名和密码并点击OK,程序断了下来:


可以看到程序断在一段不属于主程序的代码中,要回到主程序的代码处也很容易,我们知道主程序的代码是401000开头的这个区段,我们打开内存映射窗口,在地址为401000的区段设置内存访问断点,F9运行,程序会断在主程序代码段中。因为在开头为401000的区段设置了内存 访问断点,所以这时F9实际上是一直的单步执行。这样如果程序不是通过API函数来获取用户输入的序列号的话,我们可以通过消息断点来定位,这是消息断点的优点。
我们还可以给消息断点设置条件记录

可以bp TranslateMessage,并且设置条件记录,记录表达式为MSG,程序不中断,这样我们可以在记录中找到消息记录,并挑选感兴趣的消息。
0 0
原创粉丝点击