好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 潜伏者的破解 于 2016-9-20 20:58 编辑
一段登录窗口代码
[C++] 纯文本查看 复制代码 #include "stdafx.h"
#include "resource.h"
#include "Tool.h"
BOOL CALLBACK DialogProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hEditUser = NULL;
HWND hEditPW = NULL;
switch(uMsg)
{
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDC_BUTTON_OK:
{
//第一步:获取输入框的句柄
hEditUser = GetDlgItem(hwndDlg, IDC_EDIT_ACC);
hEditPW = GetDlgItem(hwndDlg, IDC_EDIT_PW);
//第二步:通过句柄获取输入框内容
TCHAR szUserBuff[0x20];
TCHAR szPWBuff[0x20];
GetWindowText(hEditUser,szUserBuff, 0x20);
GetWindowText(hEditUser,szPWBuff, 0x20);
DbgPrintf("%s %s\n", szUserBuff, szPWBuff);
MessageBox(NULL,TEXT("IDC_BUTTON_OK"), TEXT("OK"), MB_OK);
//Dialog的消息回调函数处理和其他窗口有些不同,如果是Dialog处理的消息,
//处理后返回TRUE,如果消息仍给系统处理返回FALSE
return TRUE;
}
case IDC_BUTTON_ERROR:
MessageBox(NULL,TEXT("IDC_BUTTON_ERROR"), TEXT("ERROR"), MB_OK);
EndDialog(hwndDlg, 0);
return TRUE;
}
}
}
return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MIAN), NULL, DialogProc);
return 0;
}
效果
消息断点实质上就是条件断点
用Od打开Dialog程序,F9运行
点击"W", 在弹出的窗口上右击“刷新”,然后就显示出Dialog程序中的所有窗口组件
每个组件都有系统为其定义的事件处理函数,这个函数我们无法更改。实际上组件在响应事件消息时,会先调用系统为其预定义的事件处理函数,执行完后会向父窗口发送WM_COMMAND消息,系统最终再调用父窗口的事件处理函数,也就是上面应用程序当左键单击OK按钮时,系统会先调用系统为该按钮已定义好的事件处理函数,执行完后再调用父窗口的事件处理函数。也就是说最终会调用我们为Dialog指定的事件处理函数DialogProc()。
我们在OK按钮上下左键弹起的消息断点。在Button行右击->在ClassProc上设置消息断点->在消息选择框中选择202 WM_LBUTTONUP消息。(为什么下的是做点弹起消息而不是左键按下消息呢?其实大家可以试一试就知道了,这个程序只有鼠标左键弹起时才会响应事件)
消息断点下好后会发现有两处地方变红,另一个按钮也被下了断点,这实际上是因为系统两个按钮预定义的事件处理函数是同一个函数。
断点下好后,我们在输入框中输入点内容
然后点击OK按钮。程序被断在了系统领域
该处就是系统为OK按钮预定义的事件处理函数,这个函数在系统领域,我们要找的是用户领空中的Dialog事件处理函数,系统是先调用预定义事件处理函数再调用我们为Dialog指定的事件处理函数,所以这个时候在代码段上下内存访问断点,当系统领空的事件处理函数执行完会执行用户领空中的事件处理函数。这个时候会有内存访问,当然系统也就中断下来。这样我们岂不就找到了用户领空中的事件处理函数。
点击“M”按钮,
在代码段上下内存访问断点,然后F9执行
程序断在了0x401000,那这里是不是我们要找的事件处理函数呢?我们知道回调函数 DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)第二个参数是消息类型,按钮响应事件会向Dialog发送WM_COMMAND(0x0111)消息,DialogProc函数采用的是_stdcall调用约定,所以这个时候我们看堆栈,如果现在中断的位置是事件处理函数,那么从栈顶开始往下数第三个地址空间里存放的应该是0x0111,而堆栈实际情况却不是。这是为什么呢?实际上调用系统领空中的事件处理函数完,到执行用户领空中事件处理函数,中间可能执行了其他的操作并且访问到了内存。我们下了内存访问断点,只要有访问内存的操作都会被断下来。这也解释了我们刚才断下来的位置为什么不是用户领空中的事件处理函数。那么我们接下来要怎么做呢?
F8一步一步执行代码,看到执行到某处后又回到了系统领空,我们再按F9(F9的功能就是执行代码,遇到断点停止)
看到程序回到用户领空并且暂停了下来,再看看堆栈情况,从栈顶往下数第三个地址空间里存放的是0x0111.所以可以断定程序现在中断的位置就是我们要找的DialogProc函数。
往下翻看可以看到注释中的函数名称,正是我们在事件处理函数代码中用到的这些函数。这也更验证了这段反汇编代码就是我们找的DialogProc函数
====》》》说原创也算不上原创了,我是看某培训机构的视频,然后根据视频整理的。感觉自己讲的还是不够清楚,望谅解。如有错误请指正,如某处看不懂可讨论。《《《===
Dialog窗口小程序点击下载
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|