吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6662|回复: 9
收起左侧

[调试逆向] 详谈消息断点

  [复制链接]
镇北看雪 发表于 2020-2-7 13:40
本帖最后由 镇北看雪 于 2020-3-5 15:20 编辑

   
前两天看了加密与解密第四版的消息断点部分似懂非懂(怪我太菜!),在网上查找了一些资料后又结合实例琢磨了好长时间才把消息断点搞明白,
想着总结一下希望能帮助到需要帮助的人(我要有理解不对的地方还请路过的大佬们指点一二:))。(本文经过了2次订正,中间有几次错误现在为最终版本)

了解Windows编程的人都知道windows是消息驱动的。对于标准窗口来说我们每点击一下按钮,每移动一次鼠标windows都会产生一个消息,这些消息最终会由消息处理函数(Wndproc函数)处理。但是程序一般都是用一个对话框来实现注册,而这个对话框是基于标准窗口的,但是其又有着不同。
不同在于标准窗口消息都通过我们自己写的WndProc函数处理,而对于对话框而言系统会给其维护一个对话框管理器,消息先经过对话框管理器,再由对话框管理器把消息传给我们自己写的WndProc函数。
首先我们要知道我们设置消息断点的目的是为了找到在Wndproc函数(回调函数)中处理此消息的代码,从而分析其具体做了什么操作。

下面我们以看雪加密与解密(第四版)第五章拆解时间限制的程序为例讲解消息断点(主要是了解消息断点)。
我们先运行一下程序其弹出一个对话框,然后我们来分析有关消息断点的几个问题。

%DOMQL9IHASGHT~06V_851L.png

  • 消息断点的基本原理
    我们用OD运行程序后点击查看-》窗口,会显示出程序的各个窗口和控件的信息。

    R_X@_0IK1QN53YWPR~4K[KG.png


如果我们想捕获某个按钮或控件所产生的的消息就在相关按钮或控件处右击-》在ClassProc上设置消息断点, 其会弹出一个窗口然后我们选择我们想要捕获的消息。
假如这里我们需要捕获点击Exit按钮所产生的的消息(即松开鼠标右键WM_LBUTTONUP),
我们在Exit控件那一列右击-》在ClassProc上设置消息断点,弹出一个窗口,我们设置捕获的消息WM_LBUTTONUP。
NG6PK~410MH8%~`H0}SCYUX.png


然后我们发下所有的**按钮控件**都被设置了消息断点,这是因为window系统为相同种类的控件(这里是Button按钮控件,实际控件就是一种特殊的窗口)构造了一个系统消息处理函数ClassProc(也就是按钮类所对应的窗口回调过程),所有对话框所产生的消息都要先经过对话框管理器然后其判断是哪种控件产生的消息然后先送到对应的控件消息处理函数(ClassProc),再把消息送到我们自己编写的消息处理函数(Wndproc回调函数)。
即消息产生后并不是直接就被送到WndProc函数处理,其要先经过对话框管理器送到对应的控件类的消息处理过程中后再送到我们自己编写的WndProc(回调函数)进行处理。


MJF3~7I77G%9Q%W8CWDND.png


因为相同控件类系统为其准备了消息处理函数ClassProc,所以在Exit按钮的ClassProc函数处设置断点其他的按钮类也会同时设置。其按钮类的ClassProc函数在截获WM_LDUPPONUT消息


我们这里用OD来验证一遍上面的过程。
刚才我们已经对Exit按钮处产生的WM_LDUPPONUT下了消息断点,我们点击Exit按钮后程序被暂停在ClassProc函数的头部,在user.dll模块中(即刚完成图4.4的过程4)。



YN))AK3{R8NAD~95S@MA(78.png


然后我们在反汇编窗口中查看其(ClassProc函数)调用处,并在此处下断点再次运行程序(有可能要运行多次)发现程序停在此处并试图调用一个主模块的函数。

I(AOIH(}DMR8K7)GPSG_`YG.png


我们F7跟踪进入这个函数发现正好所编写的消息处理函数(WndProc函数),即图4.4的过程5

5NS_P__$QAF}`U3`W[LY`TX.png
紧接着我们就可以找到Exit按钮所产生的WM_LDUPPONUT消息的处理代码了(上述验证过程也可以采用在代码段设置内存访问断点来完成)。

    2. 如何正确的设置消息断点

①消息断点和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消息)

)W)ZMQ4QVLPPKT]T9AZ$J@F.png


所以可以看出消息断点实际上就是以ClassProc函数的uMsg参数的值([esp+8])为判断条件的条件断点



由上述消息断点的判断条件我们可以得知,其只能在特定控件类的ClassProc函数处把所有这类控件所产生的WM_LBUTTONUP消息给拦截下来(即只要是这种控件产生的WM_LBUTTONUP消息其都会拦下来),
所以就不能确定是不是我们想要的那个控件所产生的的WM_LBUTTONUP消息。

我们需要在被拦截下来之后观察ClassProc的**hWnd参数**来确定是哪个控件所产生的WM_LBUTTONUP。
如果不是我们想要的那个按钮产生的WM_LBUTTONUP我们就需要反复运行到此处直到ClassProc的hWnd参数显示为我们想要的按钮后,
我们在利用内存访问断点在主模块的代码块设置在访问上设置断点来到达我们自己编写的WndProc(回调函数)的WM_LBUTTONUP消息处理处分析其具体操作。





免费评分

参与人数 6吾爱币 +11 热心值 +4 收起 理由
Hmily + 6 + 1 用心讨论,共获提升!
生有涯知无涯 + 1 用心讨论,共获提升!
carrot2017 + 1 + 1 我很赞同!
天空藍 + 1 + 1 谢谢@Thanks!
不苦小和尚 + 1 + 1 我很赞同!
小菜鸟一枚 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

  • · 好帖|主题: 549, 订阅: 87

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Christophernt 发表于 2020-2-7 15:00
一直在搞java开发,学习了windows底层消息机制
q28312582 发表于 2020-2-8 16:18
 楼主| 镇北看雪 发表于 2020-2-8 17:25
生有涯知无涯 发表于 2020-2-8 21:08
“我们需要在被拦截下来之后观察ClassProc的**hWnd参数**来确定是哪个控件所产生的WM_LBUTTONUP。
如果不是我们想要的那个按钮产生的WM_LBUTTONUP我们就需要反复运行到此处直到ClassProc的hWnd参数显示为我们想要的按钮”,对于这句话,是不是选择“仅中断在当前窗口(下一时间无效)”后就不用人工反复运行那么麻烦了?
1581167132(1).jpg
Sendige 发表于 2020-2-8 22:08
楼主能不能发个demo出来给大伙研究下
 楼主| 镇北看雪 发表于 2020-2-8 23:38
生有涯知无涯 发表于 2020-2-8 21:08
“我们需要在被拦截下来之后观察ClassProc的**hWnd参数**来确定是哪个控件所产生的WM_LBUTTONUP。
如果不 ...

这个我还真没试过,回头我试试
 楼主| 镇北看雪 发表于 2020-2-8 23:45
Sendige 发表于 2020-2-8 22:08
楼主能不能发个demo出来给大伙研究下

链接:https://pan.baidu.com/s/1kRoSWvZGr9QAmD5WMquY-A
提取码:bt50
小叶子152 发表于 2020-2-17 22:59
谢谢分享
intel286 发表于 2020-2-22 00:06
这个好教材,试试看
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-23 18:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表