消息断点

  消息断点时条件断点的一种,可以用来查找窗口函数。

  下面来看一看消息断点的使用

  

 

  找到正确的账户和密码。

  先将程序拖入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.

 

posted @ 2021-03-31 20:17  Yanmo  阅读(340)  评论(0)    收藏  举报