逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

#行家计划#这篇学习记录可能比较长,请大家耐心看完,待我缓缓道来,如果觉得文章对各位看官有帮助,请点赞支持!多余的话就不说了,本篇的主要内容是获悉子窗口的本质与消息断点的应用与本质。

按钮是什么?

为了快速进入主题,函数参数的说明仅作简要介绍。

HWND CreateWindow( LPCTSTR lpClassName,//窗口类名 LPCTSTR lpWindowName,//窗口标题名 DWORD dwStyle,//窗口的类型与风格 int x,//相对于父窗口偏移 int y,//相对于父窗口偏移 int nWidth,//自身宽 int nHeight,//自身高 HWND hWndParent,//父窗口句柄 HMENU hMenu,//菜单句柄,对于子窗口是身份ID HINSTANCE hInstance,//应用程序句柄 LPVOID lpParam//);

The CreateWindow function creates an overlapped, pop-up, or child window. It specifies the window class, window title, window style, and (optionally) the initial position and size of the window. The function also specifies the window's parent or owner, if any, and the window's

接下来我们在简单窗口上创建一个按钮,代码如下(此处只贴部分代码):

void CreateButton(HWND hwnd){ HWND hwndButton; hwndButton = CreateWindow( TEXT("button"), TEXT("按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON, 10,10, 80,30, hwnd, (HMENU)1001, hInst, NULL ); }

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

简陋按钮

在第一章我们创建一个窗口时,我们写了很多代码,如下图:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

创建一个非系统定义窗口

但是在创建一个按钮时,我们只CreateWindow,其他的都由系统替我们完成了,甚至连窗口处理函数都由系统替我们完成。正常做开发的话,可能仅需了解怎么设计更好看的按钮,不需要了解系统替我们做了那些工作。但是做逆向你需要深处了解系统替我们干了什么。每一个窗口都由一个WNDCLASS结构用于描述窗口属性,接下来我们介绍两个函数用于获取窗口WNDCLASS结构。

//获取类名int GetClassName( HWND hWnd,LPTSTR lpClassName, int nMaxCount);

The GetClassName function retrieves the name of the class to which the specified window belongs.

//获取窗口WNDCLASS结构信息BOOL GetClassInfo(HINSTANCE hInstance, LPCTSTR lpClassName,LPWNDCLASS lpWndClass);

The GetClassInfo function retrieves information about a window class.

具体使用如下:

TCHAR Buffer[0x20]; GetClassName(hwndButton,Buffer,0x20); WNDCLASS wc; GetClassInfo(hInst,Buffer,&wc);

下个断点:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

WNDCLASS结构体信息

在调试窗口中,我们可以看到系统给按钮定义类名就是Button,并且按钮的窗口处理函数地址并在应用程序的内存范围(0x7xxxxx通常是系统dll的空间),而是由操作系统定义。所以说按钮是特殊的窗口,当按钮产生消息时,会向父窗口发生一个WM_COMMAND消息。

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

按钮动作传递流程图

WM_COMMAND

#define WM_COMMAND 273 //0x111

The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.

If an application enables a menu separator, the system sends a WM_COMMAND message with the low-word of the wParam parameter set to zero when the user selects the separator.

CreateWindow的第九个参数,就是按钮的标识,当消息是WM_COMMAND时,使用wParam的低四位表示按钮的身份ID(即那个按钮触发了消息)。

具体的做法如下:

case WM_COMMAND: { switch(LOWORD(wParam)) { case 1001: MessageBox(hwnd,"你点的是我","按钮",MB_OK); return 0; } }

附:LOWORD是个宏,即取低四位

#define LOWORD(l) ((WORD)((DWORD)(l)))

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

点击按钮结果

消息断点

有时候逆向的程序不像这个这么简单,可能没有像上文那么容易找到窗口处理函数。这个时候我就需要一点技巧,消息断点的本质也是条件断点。

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

案例

用OD打开案例:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

切换OD窗口

然后单击右键选择Actulize:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

Actualize

我看到按钮窗口的句柄,消息处理函数等等,接下来需要在消息处理函数处下断。这个我们需要注意的是我们要下断点的类型。

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

选择消息断点

然后我们选择断点消息类型(消息类型需要自己测试,比如是按键按下触发还是抬起触发):

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

选择消息类型

下断完成:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

下断完成

点击按钮触发断点:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

消息断点被触发

这个时候我们单步追踪容易追丢,根据上面的流程图,我们知道系统会将消息加工WM_COMMAND类型发给应用程序,此时我们就知道系统肯定会访问应用程序的领空,所以我们只要在代码段追踪谁访问了代码段就能找到父窗口的消息处理函数。

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

进入内存空间

找到需要下断的代码节(PE文件结构知识,会在另一个合集记录):

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

寻找需要下断的地方

在代码节选择谁访问了该内存:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

在代码节下谁访问断点

放开断点:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

放开程序

成功断到应用程序领空,该领空既是父窗口的消息处理函数:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

断到应用程序领空

此时我们看到[esp 8]为0x135,不是WM_COMMAND常量的0x111,所以我们需要单步跳过此函数(代码段下了断点,无法直接跳过),当然我们也可以在此处下消息断点。

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

WM_COMMAND

现在接受的就是按钮的消息处理函数,同时[ESP C]代表的是按钮标识,即那个按钮触发的消息,此时我们就可以追踪按钮触发后的逻辑。

附取消内存访问断点:

逆向学习4-消息断点与子窗口的窗口处理函数(按钮的秘密)

取消内存访问断点

此篇到此结束,下文预告,与应用资源有关,如更换图标等等。该文仅为学习记录,如有不足,望海涵,不足之处请在评论区批评指正。本文及该合集文章仅限学习,不可用于非法用途,一切后果与本人无关。如果大家喜欢此文,还请关注,点个赞,评个论,您的认可,是我写作的动力。感谢观看。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年12月8日 下午1:46
下一篇 2022年12月8日 下午2:00

相关推荐

  • 清理系统集成项目管理

    清理系统集成项目管理 随着信息技术的不断发展,系统集成项目管理已经成为了软件开发和项目管理中不可或缺的一部分。然而,随着项目的增多和复杂度的增加,系统集成项目管理也面临着越来越多的…

    科研百科 2025年1月1日
    1
  • 项目时间管理问题及分析

    项目时间管理是项目管理中非常重要的一环,它涉及到项目的开始、中期和结束,以及项目过程中的各个阶段。一个好的项目时间管理可以提高项目的效率和质量,降低项目的风险,同时提高项目的成功率…

    科研百科 2024年5月25日
    108
  • 2024年十大最受欢迎的技术技能(2024年十大最受欢迎的技术技能是什么)

    你准备好在2024年在科技界留下印记了吗?科技行业的不断发展要求你通过掌握最需要的技能来保持领先地位。 在这篇博客中,我们将深入研究将主导技术就业市场的十大技术技能。无论你是刚开始…

    科研百科 2024年4月18日
    140
  • 孩子智商高低是因为思维习惯不同造成的吗?(孩子智商高低取决于什么)

    你的直觉是对的,数学不好的确是思维习惯不好造成的,唯一不足的是误用了智商这个词,其实用“思考能力的高低”可能更好些。 在智商这个词上,经常有人会把因果颠倒 常常看到有人评价别人能力…

    科研百科 2023年8月22日
    125
  • 医院建设项目进度管理的核心关键点,条条重要,赶紧收藏(医院建设项目全部过程)

    医院建设项目的质控目标包含多项内容,如招标投标、设计、进度、安全等管理,其中施工进度管理关系整个医院建设项目的功能实现和最终呈现。我们我们要格外重视,并抓住下面的四个关键点,确保完…

    科研百科 2022年8月25日
    320
  • 一款智能、好用的低代码平台具备哪些能力?(低代码平台技术)

    组织的数字化建设能力要求全面加速,低代码平台成为趋势。随着技术的革新,组织的数字化建设能力已从“能开发、能开放”转变为“配置化、移动化、智能化”的开发模式,核心让技术能够快速响应业…

    科研百科 2024年5月13日
    86
  • 滨州协同办公

    滨州协同办公:打造高效协同办公平台 随着数字化时代的到来,滨州市也迎来了协同办公的新时代。作为山东省的一个地级市,滨州市有着悠久的历史和文化,但同时也面临着交通拥堵、环境污染等问题…

    科研百科 2024年9月24日
    27
  • 现代项目管理概论

    现代项目管理概论 项目管理在现代社会中扮演着越来越重要的角色。无论是组织大规模的工程项目,还是进行日常的日常管理工作,都需要通过有效的项目管理来实现目标和提高效率。本文将介绍现代项…

    科研百科 2024年7月22日
    45
  • 信息科技项目管理办法

    信息科技项目管理办法 为加强信息科技项目的管理,提高项目质量和效率,确保项目顺利实施,我部制定了《信息科技项目管理办法》。 该办法共九章,包括总则、项目管理、预算与评审、合同管理、…

    科研百科 2025年1月3日
    1
  • 订餐管理系统的项目介绍

    订餐管理系统的项目介绍 随着现代都市生活的不断快节奏,人们对于餐厅、快餐店的订餐需求越来越大。传统的订餐方式不仅效率低下,而且容易受到时间和地点的限制。因此,为了满足用户的需求,越…

    科研百科 2024年12月26日
    0