吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5066|回复: 8
收起左侧

[C&C++ 转载] 利用消息断点找到Dialog的事件处理函数

[复制链接]
潜伏者的破解 发表于 2016-9-20 20:37
本帖最后由 潜伏者的破解 于 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;
}

效果 1.png

消息断点实质上就是条件断点
用Od打开Dialog程序,F9运行
2.png
点击"W", 在弹出的窗口上右击“刷新”,然后就显示出Dialog程序中的所有窗口组件
3.png
每个组件都有系统为其定义的事件处理函数,这个函数我们无法更改。实际上组件在响应事件消息时,会先调用系统为其预定义的事件处理函数,执行完后会向父窗口发送WM_COMMAND消息,系统最终再调用父窗口的事件处理函数,也就是上面应用程序当左键单击OK按钮时,系统会先调用系统为该按钮已定义好的事件处理函数,执行完后再调用父窗口的事件处理函数。也就是说最终会调用我们为Dialog指定的事件处理函数DialogProc()。
们在OK按钮上下左键弹起的消息断点。在Button行右击->在ClassProc上设置消息断点->在消息选择框中选择202 WM_LBUTTONUP消息。(为什么下的是做点弹起消息而不是左键按下消息呢?其实大家可以试一试就知道了,这个程序只有鼠标左键弹起时才会响应事件)
4.png
消息断点下好后会发现有两处地方变红,另一个按钮也被下了断点,这实际上是因为系统两个按钮预定义的事件处理函数是同一个函数。
断点下好后,我们在输入框中输入点内容
5.png
然后点击OK按钮。程序被断在了系统领域
6.png
该处就是系统为OK按钮预定义的事件处理函数,这个函数在系统领域,我们要找的是用户领空中的Dialog事件处理函数,系统是先调用预定义事件处理函数再调用我们为Dialog指定的事件处理函数,所以这个时候在代码段上下内存访问断点,当系统领空的事件处理函数执行完会执行用户领空中的事件处理函数。这个时候会有内存访问,当然系统也就中断下来。这样我们岂不就找到了用户领空中的事件处理函数。
点击“M”按钮,
7.png
在代码段上下内存访问断点,然后F9执行
8.png
程序断在了0x401000,那这里是不是我们要找的事件处理函数呢?我们知道回调函数 DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)第二个参数是消息类型,按钮响应事件会向Dialog发送WM_COMMAND(0x0111)消息,DialogProc函数采用的是_stdcall调用约定,所以这个时候我们看堆栈,如果现在中断的位置是事件处理函数,那么从栈顶开始往下数第三个地址空间里存放的应该是0x0111,而堆栈实际情况却不是。这是为什么呢?实际上调用系统领空中的事件处理函数完,到执行用户领空中事件处理函数,中间可能执行了其他的操作并且访问到了内存。我们下了内存访问断点,只要有访问内存的操作都会被断下来。这也解释了我们刚才断下来的位置为什么不是用户领空中的事件处理函数。那么我们接下来要怎么做呢?
F8一步一步执行代码,看到执行到某处后又回到了系统领空,我们再按F9(F9的功能就是执行代码,遇到断点停止)
9.png
看到程序回到用户领空并且暂停了下来,再看看堆栈情况,从栈顶往下数第三个地址空间里存放的是0x0111.所以可以断定程序现在中断的位置就是我们要找的DialogProc函数。
往下翻看可以看到注释中的函数名称,正是我们在事件处理函数代码中用到的这些函数。这也更验证了这段反汇编代码就是我们找的DialogProc函数




10.png


====》》》说原创也算不上原创了,我是看某培训机构的视频,然后根据视频整理的。感觉自己讲的还是不够清楚,望谅解。如有错误请指正,如某处看不懂可讨论。《《《===


Dialog窗口小程序点击下载







Win32Dialog.zip

12.8 KB, 下载次数: 23, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 2热心值 +2 收起 理由
yyhf + 1 感谢细心整理
tail88 + 1 只剩热心了!

查看全部评分

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

KaQqi 发表于 2016-9-20 21:10
哦,通过处理函数进行破解与下信息框断点差不多麻烦.这是一种新方法
tail88 发表于 2016-9-20 21:23
tanbing 发表于 2016-11-21 11:25
这个比较有启发,但如果窗体本身比较复杂的话要找很久。
把中断在任意窗口改成当前或相同标题窗口可能更好
hbkccccc 发表于 2016-11-22 23:32

感谢分享教程!
xuemangtang 发表于 2016-12-4 09:59
正在学习这种方法,我破解的不完善
那该怎么办 发表于 2016-12-26 00:28
学习了.......
hack_pojie 发表于 2017-2-19 18:56
。。。。大师 求解。。能不能找到具体的消息断点。。。就是程序领空
wisoft 发表于 2018-4-10 11:26
感谢分析!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-27 04:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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