逆向学习记录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)...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
- Qt界面——搭配QCustomPlot(qt platform)
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
- 掌握Visual Studio项目配置【基础篇】
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
- Visual Studio Community 2022(VS2022)安装图文方法
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)