百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

逆向学习记录3:寻找窗口处理函数与条件断点

liebian365 2024-10-22 15:42 28 浏览 0 评论

#行家计划#书接上文,逆向学习如积沙成塔,如古人言:“不积跬步,无以至千里.不积小流,无以成江海”。逆向学习非常枯燥,非常需要时间。废话不多说,直接进入主题。

所需知识

上文我们在反汇编找到了winmain函数,接下来我们需要寻找到窗口的处理函数,才能针对不同的消息(如针对鼠标左右击等)下条件断点。

typedef struct {
    UINT style;
    WNDPROC lpfnWndProc; //窗口处理函数
    int cbClsExtra;
    int cbWndExtra;
    HINSTANCE hInstance; //实例句柄,winmain的第一个参数,ImageBase
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground; //背景画刷
    LPCTSTR lpszMenuName;
    LPCTSTR lpszClassName;  //一类窗口类名
} WNDCLASS, *PWNDCLASS;

The WNDCLASS structure contains the window class attributes that are registered by the RegisterClass function.

结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性,为了快速进入主题,在此只介绍比较重要的成员。其他的成员可以通过MSDN Library或网络进行查询。

第二个成员

WNDPROC lpfnWndProc;

Pointer to the window procedure. You must use the CallWindowProc function to call the window procedure.

指向窗口处理函数的指针,而具体的窗口处理函数形式如下:

LRESULT CALLBACK WindowProc(HWND hwnd, //窗口句柄
    UINT uMsg,   //消息类型,常量标识
    WPARAM wParam,//消息的附加信息
    LPARAM lParam);//消息的附加信息

The WindowProc function is an application-defined function that processes messages sent to a window. The WNDPROC type defines a pointer to this callback function. WindowProc is a placeholder for the application-defined function name.

窗口处理函数的主要作用是处理该窗口所需的消息,即从应用程序消息队列中取出消息进行处理。如针对该窗口的移动,初始化,拉伸等等。其成员组成和MSG结构体成员很类似。如下是一个简单的消息处理函数:

LRESULT CALLBACK WindowProc(   HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam  	
)  	{  								
		switch(uMsg){	
			case WM_CREATE: {	//窗口创建								
				return 0;					
			}						
		case WM_MOVE:{	//窗口移动					
				return 0;					
			}						
		case WM_DESTROY:{	//窗口销毁		
				return 0;					
			}				
		case WM_KEYUP:{	//按下键	
				return 0;					
			}						
		case WM_KEYDOWN:{		//抬起键							
				return 0;					
			}										
		case WM_LBUTTONDOWN:{//鼠标左击
				return 0;					
			}							
			}
		return DefWindowProc(hwnd,uMsg,wParam,lParam);//不需要的消息,交由系统处理							
	} 

其他成员可以初始化为0,窗口类属性定义好以后,还需要注册。而RegisterClass()就是在系统注册某一类型的窗体。也就是将你提供的WNDCLASS数据注册为一个窗口类,在WNDCLASS.lpszClassName中定义该WNDCLASS的标识。

typedef WORD ATOM;
ATOM RegisterClass(CONST WNDCLASS *lpWndClass);

在反汇编中定位窗口处理函数

根据上一篇文章的步骤进入winmain领空:

图片的标号1是将wndclass的地址放到eax寄存器中,标号2就是RegisterClassA的参数也就是wndclass结构体的地址。所以我在标号2处下断点就可以知道wndclass结构体在哪。按F2下断点,然后放开程序,让程序停到断点处,此时eax存的就是wndclass地址。

将鼠标放在eax上单击鼠标右键,选择follow in stack (此时EBP 0019FF70,ESP 0019FE9C,eax 0019FEC0,此地址在栈中)

此时标号1就是第一个成员,标识2就是第二个成员,也就是窗口处理函数所在地址,标识3就是最后一个成员即窗口的类名。然后将鼠标放置在第二成员上,然后单击鼠标右键,选择Follow in Disassembler(追到反汇编)。窗口处理函数领空如下图:

条件断点

esp+8就是窗口处理函数的第二参数即消息类型。

为什么esp+8就是消息类型?初步推理,上层调用消息处理函数时,压栈4个参数(从右向左压栈,窗口处理函数使用stdcall),然后使用call 0x4xxxx,即将自身下一行地址压栈。

下个条件断点证明一下,条件断点方法如下图

//左右击常量
#define WM_LBUTTONDOWN 513
#define WM_LBUTTONUP 514
#define WM_RBUTTONDOWN 516
#define WM_RBUTTONUP 517

然后在该应用程序的窗口中点击鼠标左键。

此时我们看到[esp+8]为0x201,即十进制的513,而左击常量WM_LBUTTONDOWN为513。故esp+8为消息类型。

此篇到此结束,欲知后事如何,且看下文分解(可能还没写)。该文仅为学习记录,如有不足,望海涵批评指正。本文及该合集文章仅限学习,不可用于非法用途,一切后果与本人无关。

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: