消息断点时条件断点的一种,可以用来查找窗口函数。
下面来看一看消息断点的使用
找到正确的账户和密码。
先将程序拖入OD中,由于消息断点是在程序中运行时使用的,所以先让程序运行
点击上方的W按钮,查看程序的窗口
选择登录按钮的那一行,右击,选择在ClassProc上设置消息断点
这时候我们需要消息的类型,因为登录是一个按钮,所以这里有两个选项WM_BUTTONDOWN和WM_BUTTONUP,我们启动程序,单击左键不放时,没有窗口弹出,松开时,error弹出,所以应该要选择WM_BUTTONUP.
这是我们在OD弹出的窗口中左击登录按钮,就自动停在了按钮的窗口函数中。
因为当按钮的窗口函数处理完类型为WM_BUTTONUP的消息时,会发送新的消息给我们自己定义的窗口函数,而我们的窗口函数位于代码段,我们我们只需要在代码段中设置断点,按F9就可以停在我们的窗口函数处。、
点击上方的M按钮,找到.text,并设置内存访问断点
根据窗口函数的参数和调用约定,我们可以看到esp+8的位置处时uMsg,即消息类型,此时的消息类型并不是WM_COMMAND,所以我们需要在执行一次,
等到uMsg为WM_COMMAND.
此时的消息类型就是我们所需要的。
这是时跟进主函数
0040105C |. 8D7C24 0C lea edi, dword ptr [esp+C] edi指向字符串的首地址
00401060 |. 83C9 FF or ecx, FFFFFFFF ecx==FFFFFFFF
00401063 |. 33C0 xor eax, eax eax==0
00401065 |. F2:AE repne scas byte ptr es:[edi] 在字符串中查找al的值,此时al=0;因为是rep循环,所以ecx--,edi++;
00401067 |. F7D1 not ecx ecx等于字符串长度,包括了空字符
00401069 |. 49 dec ecx ecx-1 此时ecx等于字符串长度
这里的两端代码是判断字符串长度是否等于3和5,是的话eax=1,不是的话eax=0.
回到回调函数
test eax,对eax进行与运算,所以当eax=1时,zf=0;当eax=0时,zf=1,进行跳转,所以OK的条件就是字符串长度为3和5.
原文:https://www.cnblogs.com/yanmo/p/14603525.html