windows 消息断点

news/2024/11/5 0:42:30/文章来源:https://www.cnblogs.com/czlnb/p/18527025

windows 消息循环

以下是一个简单的处理按钮点击的示例:

#include <windows.h>#define BUTTON_ID 1 // 定义按钮IDLRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){case WM_CREATE:{// 创建一个按钮HWND hButton = CreateWindow(L"BUTTON",          // 按钮类名L"Click Me",        // 按钮标题WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // 样式50,                 // x 坐标50,                 // y 坐标100,                // 宽度50,                 // 高度hwnd,               // 父窗口句柄(HMENU)BUTTON_ID,   // 按钮ID(HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE),NULL);              // 参数break;}case WM_COMMAND:if (LOWORD(wParam) == BUTTON_ID && HIWORD(wParam) == BN_CLICKED){MessageBox(hwnd, L"Button clicked!", L"Notification", MB_OK);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;
}int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{const wchar_t CLASS_NAME[] = L"Sample Window Class";WNDCLASS wc = {};wc.lpfnWndProc = WindowProc;wc.hInstance = hInstance;wc.lpszClassName = CLASS_NAME;RegisterClass(&wc);HWND hwnd = CreateWindowEx(0,CLASS_NAME,L"Button Click Example",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 300, 200,NULL, NULL, hInstance, NULL);ShowWindow(hwnd, nCmdShow);MSG msg = {};while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}

下面是消息循环的代码

    while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}

当消息队列没有操作系统发来的消息时,GetMessage会阻塞等待,当消息队列有消息时,GetMessage会将消息赋值到msg,并且调用DispatchMessage分发到各个窗口的消息处理函数

下面是消息处理函数注册的代码

    WNDCLASS wc = {};wc.lpfnWndProc = WindowProc;wc.hInstance = hInstance;wc.lpszClassName = CLASS_NAME;RegisterClass(&wc);

通过SetWindowLong可以针对不同窗口设置消息处理函数

SetWindowLongA(hWnd,GWL_WNDPROC,WindowProc);

通过GetWindowLong 可以获取该窗口的消息处理函数

 LONG_PTR wndProc = GetWindowLongPtr(hwnd, GWLP_WNDPROC);

SetWindowLongGetWindowLong仅限当前进程使用,其它进程调用是会有权限不足的错误

x64dbg设置消息断点

加载程序后,运行到窗口弹出来,选择句柄选项卡,右键点击刷新
a30d73cbcdf920e942a7b93d1703157d

d04a3cc3a9c030063d2565a0357bac33
有很多关键信息,其中最关键的还是窗口过程,这个就是消息处理函数

在某个窗口右键点击消息断点
4b0ba06f8360a4b03c78f9e258f9af8a

弹出消息断点窗口
9d7c6dcbdc05fe4128f9d7af4f2aa29d
有很多消息类型,下面我列举一下点击事件的常见消息

WM_LBUTTONDOWN //用户按下鼠标左键时发送的消息。
WM_LBUTTONUP //用户释放鼠标左键时发送的消息
WM_COMMAND //当按钮被点击时,最常见的消息类型。消息携带控件 ID 和通知码,通常与按钮交互事件相关。

其中WM_COMMAND一般用的最多,因为它会携带被点击的控件ID。

x64dbg消息断点的缺陷

x64dbg的句柄窗口只能获取调用RegisterClass时的窗口过程,不能获取SetWindowLong设置的窗口过程,所以要准确获取正确的窗口过程,最好函数写个插件使用注入hook技术调用GetWindowLong获取窗口过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/826892.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FindResource详解

#include <iostream> #include <Windows.h>int main() {// 获取当前模块的句柄HMODULE hModule = GetModuleHandle(NULL);HRSRC hRes = ::FindResource(hModule, MAKEINTRESOURCE(1), RT_MANIFEST);if (hRes == NULL) {std::cerr << "无法找到清单文件资…

11.4做洛谷深基到发疯记录

今日校队每日一题依然是不看题解就不…… 日,是题解都看不懂的一集 : ) 然后就去接着做洛谷深基的题了 当我做到P1098的时候还没意识到问题严重性 当我一看到如此复杂的情况分类的时候,以为只是写起来麻烦点罢了,遂敲 敲着敲着就感觉出来不对劲了,要是每种情况都分个类那if…

【spring开发】Spring Cloud Bus快速入门Demo

一、什么是Spring Cloud Bus?二、环境搭建三、代码工程四、测试五、引用原创 Harries HBLOG一、什么是Spring Cloud Bus? Spring Cloud Bus 是一个用于将分布式系统的节点连接起来的框架,它使用了轻量级消息代理来实现节点之间的通信。Spring Cloud Bus 可以将配置变更事件、…

大模型-训练推理 模型大小与硬件GPU 选取的大致关系-05

目录0. 计算公式1. 市面上常见的显卡2. 训练2. 推理 0. 计算公式 重点:显存大小 = 模型参数占用 + 梯度占用 + 优化器占用 + CUDA kernel占用 + 中间计算结果 每个神经元节点 不仅仅有自身的权重值 在进行反向传播的时候还有梯度的累计值 1. 市面上常见的显卡 英伟达GPU 3060 …

MSSprinkler:一款针对MS账号的密码喷射安全测试工具

原创 Alpha_h4ck FreeBuf关于MSSprinkler MSSprinkler是一款功能强大的密码喷射安全测试工具,可以帮助广大研究人员从外部角度测试其 Microsoft Online 帐户的安全性。 MSSprinkler 是用 PowerShell 编写的,可以直接作为模块导入,并且没有其他依赖项。MSSprinkler 依靠 Micr…

Unbound数据结构分析

mesh结构msg_cache + rr_cache缓存数据 msg_cache里的entry是msgreply_entry,rr_cache里的entry是ub_packed_rrset_key。 ub_packed_rrset_key的rrset_id_type通过alloc_get_id方法获取。 ub_packed_rrset_key通过alloc_special_obtain方法从env->alloc分配。

开发中常用到的10个数据结构

开发中常用到的10个数据结构 ▪️列表(List):用于存储有序集合,如Twitter动态流🐦。 ▪️数组(Array):连续存储的元素集合,适用于数学运算和大数据集📊。 ▪️栈(Stack):后进先出(LIFO)的数据结构,常用于撤销/重做功能🔄。 ▪️队列(Queue):先进先出(F…

【JavaScript安全】JS沙箱隔离

原创 码中仙一、什么是沙箱环境 在计算机安全中,沙箱(Sandbox)是一种用于隔离正在运行程序的安全机制,通常用于执行未经测试或不受信任的程序或代码,它会为待执行的程序创建一个独立的执行环境,内部程序的执行不会影响到外部程序的运行。 其实在前端世界里,沙箱环境无处…

Unbound启动流程分析

unbound入口在run_daemon方法。 daemon_init方法,分配struct daemon结构体,设置信号处理方法,初始化openssl库,设置时区,设置daemon->need_to_exit为0,初始化模块栈(modstack_init方法)设置deamon->mods结构体(struct module_stack)的num为0、mod为NULL,为dae…

如何给 GoPro 拍摄的视频添加时间水印 All In One

如何给 GoPro 拍摄的视频添加时间水印 All In One 执法记录仪 时间水印是指在拍摄的照片或视频上添加一个显示时间的标识。 这个标识通常以数字的形式出现在画面的一个角落,它显示了拍摄的具体日期和时间。 时间水印的目的是为了记录下拍摄的时间,以便用户可以更好地回顾和分…

《使用Gin框架构建分布式应用》读后感

1.为什么选择这本书? 因为工作中有一个项目使用了Go进行开发,项目用到了MySQL, Redis,GORM,Rabbitmq,Zap等组件进行开发,没有使用到Web框架,因为本人是Web开发方向,所以就想了解下Web框架在Go开发中的应用,看看别人是怎么用的。国外的Go Web框架有:Echo, Gin, Iris, …