吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11242|回复: 29
收起左侧

[原创] 消息断点的应用

[复制链接]
springwillow 发表于 2017-5-4 11:50
本帖最后由 springwillow 于 2017-5-4 21:04 编辑

新手小白一枚,第一次发贴。
通过消息断点,确定按钮的单击事件。
简单的小程序如下:
QQ图片20170504102209.png
注册名密码正确会弹出正确的对话框,错误会弹出错误的对话框。
首先来看一下源码:
[C++] 纯文本查看 复制代码
#include "stdafx.h"
#include "resource.h"
BOOL CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
)
{
        HWND hEditUser=NULL;
        HWND hEditPass=NULL;
        switch(uMsg)
        {
        case WM_COMMAND:
                {
                        switch(LOWORD(wParam))
                        {
                        case IDOK: 
                                {
                                        TCHAR szUserBuffer[0x50];
                                        TCHAR szPassBuffer[0x50];
                                        hEditUser=GetDlgItem(hwndDlg,IDC_EDIT_UserName);
                                        hEditPass=GetDlgItem(hwndDlg,IDC_EDIT_PassWord);
                                        GetWindowText(hEditUser,szUserBuffer,0x50);
                                        GetWindowText(hEditPass,szPassBuffer,0x50);
                                        if ((strcmp(szUserBuffer,"") !=NULL)&&(strcmp("",szPassBuffer) !=NULL))
                                        {
                                                if (strcmp(strcat(szUserBuffer,TEXT("abc")),szPassBuffer) ==NULL)
                                                {
                                                        MessageBox(NULL,TEXT("恭喜密码正确"),TEXT("正确"),MB_OK);
                                                }
                                                else
                                                {
                                                        MessageBox(NULL,TEXT("密码错误"),TEXT("错误"),MB_OK);
                                                }
                                        }
                                        else
                                                MessageBox(NULL,TEXT("用户名密码不能为空"),TEXT("错误"),MB_OK);
                                        return true;
                                }
                        case IDCANCEL: 
                                {
//                                        MessageBox(NULL,TEXT("IDC_Button_CANCEL"),TEXT("取消"),MB_OKCANCEL);
                                        DestroyWindow(hwndDlg);
                                        return false;
                                }
                        }
                }
        }
        return false;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
         // TODO: Place code here.
        DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);
        return 0;
}

Windows是基于消息驱动的,我们就是要通过拦截消息来确定按钮的事件,通过上面的源码我们可以看出,鼠标左键的消息是通过WM_COMMAND消息传递的,而WM_COMMAND宏对应的十六进制为0x0111。
打开OD载入,F9跑起来,点开W窗口,如下图:
QQ图片20170504102209.png
找到确定按钮右键
QQ图片20170504102209.png
选择消息断点,弹出如下界面
QQ图片20170504102209.png
选择WM_LBUTTONUP.确定。切换到程序窗口界面随便输入用户名和密码,点确定。
QQ图片20170504102209.png
我们会断到下面的位置
QQ图片20170504102209.png
点击m模块
QQ图片20170504102209.png
在代码段下断点
QQ图片20170504102209.png
F9跑起来,来到这里断下了
QQ图片20170504102209.png
下面是关键的地方了,我们来看ESP寄存器和堆栈,画过堆栈图的人都应该知道,现在ESP所指的是函数返回的地址,[ESP+4]为DialogProc的第一个参数,即对话框的句柄,[ESP+8]是第二个参数即消息类型uMsg,只有uMsg为WM_COMMAND,即为0x0111的时候才是我们要拦截的消息,所以我们在这下条件断点。
QQ图片20170504102209.png
QQ图片20170504102209.png
下好断点后,我们再让程序跑起来。被断下来的我们看esp+8的位置是不是0x0111。
QQ图片20170504102209.png
这个就是我们要跟踪的按钮事件了。好我了我们单步跟踪,我们一直跟到这个地方,就是关键跳了,直接nop掉就搞定了。
QQ图片20170504102209.png
好了就说到这个了。新人求赏币啊。
Resouce.rar (12.44 KB, 下载次数: 68)

免费评分

参与人数 18威望 +2 吾爱币 +28 热心值 +17 收起 理由
jsfq444 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
iCHJ95 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
Gnod + 2 + 1 我很赞同!
610100 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
cr4ck + 1 + 1 优秀文章
Hmily + 2 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yo44444 + 1 感谢分享,消息断点一直不知道怎么用
qaz003 + 1 用心讨论,共获提升!
海天一色001 + 1 + 1 谢谢@Thanks!
s3233431 + 2 + 1 谢谢一直都想要这样的教程,可惜没找到谢谢楼主
xiawan + 1 + 1 我很赞同!
Toky_TM + 1 + 1 我很赞同!
wangxp + 1 + 1 谢谢@Thanks!
ArrayList + 1 + 1 我很赞同!
若然 + 1 + 1 软件为何不丢出来呢?
gunxsword + 1 + 1 热心回复!
xinchen + 1 + 1 谢谢@Thanks!
as614001 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

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

 楼主| springwillow 发表于 2018-7-5 08:37
2016wapjpc 发表于 2018-7-5 00:01
有的vc程序在按钮上下消息断点断不下来怎么办呢

我觉得会有几个原因拦截不到消息:
1、拦截的消息不正确,不是程序调用的消息,单击一般是wm_Lbuttonclickup,但他也可能是用的别的消息比如wm_Lbuttonclickdown。这个需要自己试试
2、程序控件可能是自画的,做了加密处理。
3、确认你下断点的控件没错。
 楼主| springwillow 发表于 2018-7-9 08:28
.Net_破解 发表于 2018-7-8 15:49
你好想问一下 ,第一次下断点之后,为什么要去代码段下断点

因为你下消息断点的位置是在系统领空,如果你学过C编程就会知道,消息会调用消息处理函数,这个消息处理函数就是在我们的代码段里,我们所要拦截的也是这个消息处理函数,所在要在代码段下断点以到达消息处理函数。
as614001 发表于 2017-5-4 19:06
xinchen 发表于 2017-5-4 19:56
又学到了
byh3025 发表于 2017-5-4 21:05
这个也太复杂了,不懂编程的感觉好吃力
 楼主| springwillow 发表于 2017-5-4 21:14
byh3025 发表于 2017-5-4 21:05
这个也太复杂了,不懂编程的感觉好吃力

嗯的确是复杂了点,比MessageBox断点法复杂,但是更能体现Windows的本质,也更根本!如果想走的远一点基础知识还是需要的!
xiawan 发表于 2017-5-5 11:00
非常不错的小文,支持~
cqiongwei 发表于 2017-5-5 11:22
多谢分享,学习到了!
peterq521 发表于 2017-5-5 12:25
很详细 看起来好高大上的感觉啊
李思贤 发表于 2017-5-5 16:42
感觉高大上,佩服
摩尼菲格 发表于 2017-5-5 16:51
又学到了一些东西
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-15 13:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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