本帖最后由 springwillow 于 2017-5-4 21:04 编辑
新手小白一枚,第一次发贴。
通过消息断点,确定按钮的单击事件。
简单的小程序如下:
注册名密码正确会弹出正确的对话框,错误会弹出错误的对话框。
首先来看一下源码:
[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窗口,如下图:
找到确定按钮右键
选择消息断点,弹出如下界面
选择WM_LBUTTONUP.确定。切换到程序窗口界面随便输入用户名和密码,点确定。
我们会断到下面的位置
点击m模块
在代码段下断点
F9跑起来,来到这里断下了
下面是关键的地方了,我们来看ESP寄存器和堆栈,画过堆栈图的人都应该知道,现在ESP所指的是函数返回的地址,[ESP+4]为DialogProc的第一个参数,即对话框的句柄,[ESP+8]是第二个参数即消息类型uMsg,只有uMsg为WM_COMMAND,即为0x0111的时候才是我们要拦截的消息,所以我们在这下条件断点。
下好断点后,我们再让程序跑起来。被断下来的我们看esp+8的位置是不是0x0111。
这个就是我们要跟踪的按钮事件了。好我了我们单步跟踪,我们一直跟到这个地方,就是关键跳了,直接nop掉就搞定了。
好了就说到这个了。新人求赏币啊。
Resouce.rar
(12.44 KB, 下载次数: 68)
|