逆向学习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

相关推荐

  • 关于靠造的软件

    关于靠造的软件 近年来,随着计算机科学的不断发展,软件行业也迎来了巨大的变革。尤其是在人工智能、大数据、云计算等新兴领域,软件的制造变得越来越重要。然而,这些新技术的实现离不开一些…

    科研百科 2024年11月7日
    2
  • 党员质量先锋引领以“党建赋能”助推产品质量提升(党建引领品质工程)

    文|汶涛 来源|《国企》杂志2022年11月号 习近平总书记在全国国有企业党的建设工作会议上强调,国有企业党建工作要坚持服务生产经营不偏离,把提高企业效益、增强企业竞争实力、实现国…

    科研百科 2023年1月3日
    638
  • 【基层党建】龙桑寺镇“三化”并举 提升党员教育管理质效(三举措加强党员教育管理)

    为保持党员队伍先进性,龙桑寺镇采取多项举措,加强党员教育管理,不断提升党员队伍建设质量。 筑平台强阵地,提升规范化建设 依托大刘村党群服务中心,按照“六有”标准,扎实推动镇党校(党…

    科研百科 2023年3月1日
    241
  • markdown编辑器

    markdown编辑器简介 Markdown编辑器是一种轻量级的文本编辑器,用于在浏览器中显示markdown格式的内容。Markdown是一种基于超链接的格式,可以用于编写博客,…

    科研百科 2024年10月5日
    21
  • 成都国家实验室 航空发动机

    成都国家实验室与航空发动机:探索未来科技与可持续发展 近年来,随着全球航空发动机技术的快速发展,成都国家实验室在航空发动机领域的研究也取得了重要进展。作为我国航空发动机产业的重要发…

    科研百科 2024年10月19日
    0
  • 党建管理平台(长沙智慧党建管理平台)_2

    智慧党建 r 党建管理平台,是随着时代的发展和党建工作的需要而应运而生的一种新型工具。它以信息化、智能化和互联网化的手段,为各级组织和广大员提供了全过程、全时空的服务和支持,成为了…

    科研百科 2023年6月2日
    572
  • 公司合同管理制度(完整版)

    公司合同管理制度(完整版) 合同是公司日常业务中不可或缺的一部分。为了更好地管理合同,公司制定了一套完整的合同管理制度。本制度包括了合同的订立、审查、签署、履行、变更、解除和结算等…

    科研百科 2025年1月4日
    1
  • 研发经费管理制度

    研发经费管理制度 随着科技的不断发展,企业的研发工作也越来越重要。为了保障企业的研发工作能够顺利进行,研发经费管理制度是必不可少的。研发经费管理制度是指为了规范企业的研发经费使用,…

    科研百科 2024年9月12日
    20
  • 官渡区凤凰山社区:党建领航“134”模式 创享社区治理新局面(凤凰社区党支部)

    来源:【云南日报】 昆明市官渡区金马街道凤凰山社区于2019年10月挂牌成立,辖区面积1.2平方公里,管辖服务居民小区6个,钢材批发、果蔬零售、道路货物运输等企业467个,服务人口…

    科研百科 2023年1月18日
    136
  • 论文修改情况导师审查意见

    论文修改情况导师审查意见 在完成论文后,我们收到了导师的审查意见,这些意见为我们提供了宝贵的反馈和指导,帮助我们更好地完善我们的研究。本文将介绍我们在导师审查意见中的修改情况,并讨…

    科研百科 2024年12月8日
    1