282
574
实习版主
前两天看了加密与解密第四版的消息断点部分似懂非懂(怪我太菜!),在网上查找了一些资料后又联合实例琢磨了好长时间才把消息断点搞明白, 想着总结一下希望能资助到需要资助的人(我要有理解不对的地方还请路过的大佬们指点一二:))。(本文经过了2次订正,中间有几次错误现在为终极版本) 相识Windows编程的人都知道windows是消息驱动的。对于标准窗口来说我们每点击一下按钮,每移动一次鼠标windows都会产生一个消息,这些消息终极会由消息处理函数(Wndproc函数)处理。但是程序一样平常都是用一个对话框来实现注册,而这个对话框是基于标准窗口的,但是其又有着差别。 差别在于标准窗口消息都通过我们自己写的WndProc函数处理,而对于对话框而言系统会给其维护一个对话框管理器,消息先经过对话框管理器,再由对话框管理器把消息传给我们自己写的WndProc函数。 首先我们要知道我们设置消息断点的目的是为了找到在Wndproc函数(回调函数)中处理此消息的代码,从而分析其详细做了什么操作。
我们用OD运行程序后点击检察-》窗口,会显示出程序的各个窗口和控件的信息。
假如这里我们需要捕获点击Exit按钮所产生的的消息(即松开鼠标右键WM_LBUTTONUP), 我们在Exit控件那一列右击-》在ClassProc上设置消息断点,弹出一个窗口,我们设置捕获的消息WM_LBUTTONUP。 然后我们发下所有的**按钮控件**都被设置了消息断点,这是由于window系统为相同种类的控件(这里是Button按钮控件,实际控件就是一种特殊的窗口)构造了一个系统消息处理函数ClassProc(也就是按钮类所对应的窗口回调过程),所有对话框所产生的消息都要先经过对话框管理器然后其判断是哪种控件产生的消息然后先送到对应的控件消息处理函数(ClassProc),再把消息送到我们自己编写的消息处理函数(Wndproc回调函数)。 即消息产生后并不是直接就被送到WndProc函数处理,其要先经过对话框管理器送到对应的控件类的消息处理过程中后再送到我们自己编写的WndProc(回调函数)进行处理。 由于相同控件类系统为其预备了消息处理函数ClassProc,以是在Exit按钮的ClassProc函数处设置断点其他的按钮类也会同时设置。其按钮类的ClassProc函数在截获WM_LDUPPONUT消息
紧接着我们就可以找到Exit按钮所产生的WM_LDUPPONUT消息的处理代码了(上述验证过程也可以采用在代码段设置内存访问断点来完成)。
①消息断点和int3断点差别其必须在程序运行后设置(程序不运行是无法得到窗口以及控件的信息的,即不显示下图),而int3可以在程序运行先设置 ②前面我们知道如果要想设置Exit按钮控件所产生的的消息就在Exit那一行右击然后点击在ClassProc函数处设置消息断点,也可以在其他按钮控件上右击设置(由于相同类的控件是同一个ClassProc函数)也就是想设置由哪个控件产生的消息就在恣意一个那一类控件右击设置。 如果想设置WM_TIMER或者是WM_QUIT这些由程序调用API所产生的消息,需要在相应主窗口处右击设置 例如这个程序我们要想清除时间限定就需要去检察WM_TIMER消息的处理代码,我们就需要对WM_TIMER下断点。 由于WM_TIMER是由主程序调用API函数产生的以是我们就应该在主窗口处右击设置消息断点。 3. 消息断点其实就是特殊的条件断点 我们打开断点窗口检察我们刚刚在按钮类ClassProc函数处下的WM_LDUPPONUT消息断点,选中后右击编辑条件。 我们看到其条件断点的条件为[esp 8] == WM_LBUTTONUP(即ClassProc函数的uMsg消息标志参数为WM_LBUTTONUP消息)
由上述消息断点的判断条件我们可以得知,其只能在特定控件类的ClassProc函数处把所有这类控件所产生的WM_LBUTTONUP消息给拦截下来(即只要是这种控件产生的WM_LBUTTONUP消息其都会拦下来), 以是就不能确定是不是我们想要的那个控件所产生的的WM_LBUTTONUP消息。
您需要 登录 才可以下载或查看,没有帐号?立即注册
使用道具 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图
GMT+8, 2024-11-25 05:42 , Processed in 0.078125 second(s), 32 queries .
Powered by Discuz! X3.4
© 2001-2017 Comsenz Inc.