转 hook 自绘原理

通过子类化窗口(SubClass)来为现有的某个窗口添加新的窗口处理程序(或者叫钩子,Hook) 创建窗口的时候,可以传一个消息处理函数。然而如果窗口不是自己创建的,还能增加消息处理函数吗?答案是可以的,除了 SetWindowsHookEx 来添加钩子之外,更推荐用子类化的方式来添加。 本文介绍如何通过子类化(SubClass)的方式来为窗口添加额外的消息处理函数。 @TOC 子类化 子类化的本质是通过 SetWindowLong 传入 GWL_WNDPROC 参数。 SetWindowL... 阅读详情


以下是转自优快云的文章,希望能找到一些有用的东西。 

界面技术概述

在做“HOOK文件打开/保存对话框”的过程中,我首先研究了界面库的相关知识。界面库一般都是由C/C++这种中低级语言编码,这是因为在Windows下的界面库实现技术大都以直接操作控制Windows的消息和调用Windows的API为主,这就是这种中低级语言的优势了。无论何种界面库,最为根本的原理就是获得或者截获窗口的某些消息,按照自己的需要处理这些消息,画出自己需要的界面。

按照Windows下的界面库的使用方法来分类,可以分为两种:

1、通过派生、继承界面库中的类来使用库。这类界面库现在是占绝大多数。这类界面库通常可以对同种类型的控件、窗口自己控制显示风格。这种类型的界面库典型的代表就是GuiToolkit、ProfUIS。

2、通过Link头文件,使用DLL来使用的界面库。这类界面库一般都是商业化的界面库。这类界面库一般对于同种类型的控件、窗口都是显示统一的风格。这种类型的界面库的典型代表是Skin++、AppFace。

上面的分类,其实同时也代表着两种界面库实现技术,也就是获取用于自绘窗口的消息的两种来源:

1、 通过子类化、超类化改变窗口风格。其实就是调用Windows的API SetWindowLong或者通过类的派生和继承来改变Windows窗口的默认的消息处理函数。

2、 使用HOOK技术改变Windows的默认消息处理。

一、SetWindowLong

 SetWindowLong(HWND hWnd,//需要改变UI的窗口的窗口句柄

Int nIndex,//替换窗口的默认消息处理函数时为GWL_WNDPROC

Long dwNewLong)//新的默认的窗口消息处理函数

调用这个API函数可以替换一个窗口的默认的消息处理函数,这样就可以在新的窗口消息处理函数中截获到目标窗口的相关消息,然后根据需要处理这些消息。这个API用于获取当前窗口的消息,它不能获取窗口中子窗口的消息。

 这种类型的界面库,一般是开源的或者是提供了头文件和Lib文件的界面库。

这个Windows API大家很可能很少直接调用,但是它的封装――――SubclassWindow这个成员函数,我想大家都使用过。先让我们看看各种类型的子类化过程中的SetWindowLong都藏在什么地方,它们是如何工作的。

1、 MFC下的实现

在MFC程序中,可以先在工程中添加一个用于子类化的窗口类,然后就可以通过ClassWizard这个工具来完成剩下的子类化的工作了。我们以一个自定义的Button类CMyButton类来举例。在打开ClassWizard为我们的基于Dialog的工程中的一个Button资源添加一个对应的变量的时候我们就可以看到可以直接定义了CMyButton类,如下图:

 我们为ID为IDC_BUTTON1的一个按钮资源定义一个类型为CMyButton的成员变量m_MyBtn。这时候ClassWizard就会在重载的虚函数DoDataExchange中为我们添加上一条语句,如下:

void CMFCSampleDlg::DoDataExchange(CDataExchange* pDX)

{

 CDialog::DoDataExchange(pDX);

 //{{AFX_DATA_MAP(CMFCSampleDlg)

 DDX_Control(pDX, IDC_BUTTON1, m_MyBtn);//这就是ClassWizard为我们添加的

 //}}AFX_DATA_MAP

}

让我们来看看DDX_Control这个函数为我们做了什么,在MFC的源代码DLGDATA.CPP文件中我们能找到这个函数的源代码:

void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl)

{

 if (rControl.m_hWnd == NULL)    // not subclassed yet

 {

 ……

…

  //注意看看,噢,原来SubclassWindow在这里

  if (!rControl.SubclassWindow(hWndCtrl))

  {

   ASSERT(FALSE);      // possibly trying to subclass twice?

   AfxThrowNotSupportedException();

  }

……

…

 }

}

让我们再看看MFC下的SubclassWindow这个成员函数的实现,在MFC的源代码wincore.cpp中可以看到所有MFC下窗口类的基类CWnd中的SubclassWindow的实现:

BOOL CWnd::SubclassWindow(HWND hWnd)

{

 if (!Attach(hWnd))

  return FALSE;

 // allow any other subclassing to occur

 PreSubclassWindow();

 // now hook into the AFX WndProc

 WNDPROC* lplpfn = GetSuperWndProcAddr();

 //注意看看,原来它也是使用SetWindowLong啊

 WNDPROC oldWndProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC,

  (DWORD)AfxGetAfxWndProc());

 ……

 …

 return TRUE;

}

上面的源代码跟踪说明,ClassWizard为我们自动完成的子类化工作中,其实也是调用的SetWindowLong这个Windows API。当然在MFC下你也可以自己调用SubclassWindow这个成员函数去手动的完成子类化。

2、 ATL/WTL下的实现

在ATL的源代码中,文件ATLWIN.H文件中,我们可以找到所有ATL窗口类的基类CwindowImplBaseT中的SubClassWindow的实现:

template <class TBase, class TWinTraits>

BOOL CWindowImplBaseT< TBase, TWinTraits >::SubclassWindow(HWND hWnd)

{

 ATLASSERT(m_hWnd == NULL);

 ATLASSERT(::IsWindow(hWnd));

 m_thunk.Init(GetWindowProc(), this);

 WNDPROC pProc = (WNDPROC)&(m_thunk.thunk);

 //注意看看,它也是调用SetWindowLong的!

 WNDPROC pfnWndProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pProc);

 if(pfnWndProc == NULL)

  return FALSE;

 m_pfnSuperWindowProc = pfnWndProc;

 m_hWnd = hWnd;

 return TRUE;

}

在ATL/WTL没有MFC下的那种自动子类化的机制,如果需要子类化一般都是直接调用SubclassWindow这个成员函数。

二、SetWindowsHookEx

SetWindowsHookEx( int idHook,//HOOK的类型

HOOKPROC lpfn,//HOOK的回调函数

HINSTANCE hMod,//应用程序的实例句柄

DWORD dwThreadId)//线程的ID

SetWindowsHookEx这个API可以设置很多种类型的HOOK,它们分别在不同的时间截获线程ID为dwThreadId的线程的不同消息。在编写界面库的时候一般设置类型为WH_CALLWNDPROC的HOOK,用以在窗口处理消息之前获得消息并进行处理。在HOOK的CALLBACK函数中可以获得窗口句柄,进而获得窗口的类型和窗口的风格,这样就可以知道需要处理的消息类型。一般都是从截获WM_CREATE消息开始,然后处理WM_PAINT、WM_NCPAINT等等和UI有关的消息以达到自绘窗口UI的目的。

使用HOOK技术的界面库中当然也可以使用SetWindowLong技术,在C++写的界面库中一般是在获得了窗口句柄以后,即使用SetWindowLong技术将窗口句柄关联到一种特定的窗口类上。并且可以根据窗口的风格让同一个类做出不同风格的显示效果,可惜的是现在市面上的界面库都很少进行这种比较繁琐的区分工作。

这种类型的界面库一般都是以DLL文件格式出现,现在最为流行的是将界面库封装为一个COM DLL,在应用程序中创建这个COM组件,获得相关的接口,调用相关的接口函数来为应用程序安装HOOK。在做“Picasso风格的文件打开/保存对话框”过程中,我们一直以Yahoo Messenger的Save对话框作为参考,其实Yahoo Messenger就是使用的这种类型的界面库的。Yahoo messenger的界面库截获了进程中所有线程的消息,并做了相关的处理,所以它可以截获一些系统的窗口的创建消息和UI相关的消息,以达到改变Windows系统窗口的显示风格的目的。

最后介绍一下几个比较好的开源的界面库或者例子。

1、 ClassXP(http://www.yonsm.net/read.php?26)

一个个人的开源界面库,C语言写的,不完善,使用HOOK技术。Yahoo messenger的界面库就类似于这个界面库,只不过Yahoo messenger做的更完善而已。

2、 ProfUIS(http://www.codeproject.com/docking/prod_profuis.asp)

一个部分开源的界面库,有完善功能的商业版。比较完善,MFC写的,使用的是SetWindowLong技术。

3、 GuiToolkit(http://www.codeproject.com/library/guitoolkit.asp)

一个开源的界面库,比较完善,MFC写的,使用的是SetWindowLong技术。

4、 MSDN中的ControlSpy例子。

MSDN中的一个例子,用于了解各种控件的消息。

Android hook原理及APP安全 Xposed原理 如何保证APP最安全。 这篇文章不对逆向和hook进行分析,如有不知道的,请看我之前的文章。 原理: 通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持 Zygote启动进程时 1、都会将这个D... 阅读详情

相关推荐

用HOOK机制让自绘菜单栏控件模拟系统菜单栏行为

在Windows的UI开发中,我们经常需要对窗口和控件进行自绘,以实现独特的UI风格,满足软件的个性化需求,提升用户的视觉体验。目前市面上流行的软件,大都有自己别具一格的界面,许多软件还提供多种界面供用户选择,我们称之为skin。应用程序的类型,按M$通俗粗略的划分,可以分为:对话框程序、单文档程序(SDI)、多文档程序(MDI)。在换肤功能的开发中,对话框程序是最简单的,单文档和多文档程序是

iloveican的专栏 2216

Windows API函数SetWindowLong

SetWindowLong()用于改变一个窗口的属性。 LONG SetWindowLong( HWND hWnd, //handle to window(窗口句柄) int nlndex, //offset of value to set(改变窗口上的何种属性) LONG dwNewLong // new value(指定该属性为一个新的具体样式) ); 窗口属性包括窗口的样式(GWL_STYLE)、扩展...

zxf347085420的博客 4097

hook原理介绍与简单实例

一、HOOK介绍 1、什么是HOOK(钩子) HOOK技术即钩子函数,钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。 钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。 ...

mijichui2153的博客 5424

SetWindowLong和SetWindowPos函数详解

一个应用程序可以一个系统美为于类,但是不能以一个其他进程产生的窗口类为子类,SetwindowLong函数通过改变与一个特殊的窗口类相联系的窗口过程来创建窗口子类,从而使系统调用新的窗口过程而不是以前定义的窗口过程。Windows CE:如果这是一个可见的顶层窗口,并且未指定SWP_NOACTIVATE标志,则这个函数将激活窗口、如果这是当前的激活窗口,并且指定了SWP_NOACTIVATE或SWP_HIDEWINDOW标志,则激活另外一个可见的顶层窗口。SWP_NOACTIVATE:不激活窗口。

m0_37346206的博客 4402

Android PLT hook 与 Inline hook

Android Native 函数 Hook 技术是一种在应用运行时拦截或替换系统或自身函数行为的手段,常见实现包括 PLT Hook、Inline Hook。PLT Hook 和 Inline Hook 是两种不同层次和机制的函数 Hook 技术,常用于逆向工程、安全分析、壳保护或热修复等场景。

1404

面试:Hook框架Xposed、Dexposed、Epic原理

Xposed原理: Xposed原理简介及其精简化 - 简书 Xposed 实现原理分析_l0neman 的博客-优快云博客_xposed原理 Dexposed原理 Android中免Root实现Hook的Dexposed框架实现原理解析以及如何实现应用的热修复_尼古拉斯.赵四的博客-优快云博客_dexposed Epic原理 我为Dexposed续一秒——论ART上运行时 Method AOP实现 | Weishu's Notes ...

王温暖的博客 5780

SetWindowLong 用法总结

SetWindowLong 函数原型为:LONG SetWindowLong(HWND hwnd,int nIndex,Long dwNewLong);详见MSDN。下面简单总结一下SetWindowLong函数几种常用的地方:1.设置窗口风格   如:SetWindowLong(hWnd, GWL_STYLE, WS_POPUP|WS_BORDER);      //有边框的弹出窗口         SetWindowLong(hWnd, GWL_EXSTYLE,  WS_EX_TOOLWINDOW); 

firehood的专栏 2万+

C++程序编程中的 SetWindowLong 函数的几个常见用途(附源码)

本文讲解C++程序编程中的 SetWindowLong 几个常见用法。

dvlinker的技术专栏 446

HOOK自绘原理

做“HOOK文件打开/保存对话框”的过程中,我首先研究了界面库的相关知识。界面库一般都是由C/C++这种中低级语言编码,这是因为在Windows下的界面库实现技术大都以直接操作控制Windows的消息和调用Windows的API为主,这就是这种中低级语言的优势了。无论何种界面库,最为根本的原理就是获得或者截获窗口的某些消息,按照自己的需要处理这些消息,画出自己需要的界面。 按照Windo

把握自己。 1661

FLUENT UDF编译及蒸发冷凝相关问题

蒸发冷凝与相间传质

weixin_48029137的博客 1万+

CST STUDIO SUITE 2023安装

破解工具的Crack文件夹内有一个名为「CST Studio Suite 2022」的文件夹,这也是于CST的安装目录同名的文件夹,直接把它拷贝到CST Studio Suite 2022的同级路径下即可,比如你的CST安装路径为:D:\Program Files\CST Studio Suite 2022,则将Crack目录内的「CST Studio Suite 2022」文件夹复制到 D:\Program Files\ 这个级别的路径下即可。软件百度网盘链接放在文章末尾啦!先不着急启动CST或者激活。

m0_49516223的博客 4116

Windows Hook原理与实现

Windows Hook原理与实现 教程参考自《逆向工程核心原理》 1.概述 Hook技术被广泛应用于安全的多个领域,比如杀毒软件的主动防御功能,涉及到对一些敏感API的监控,就需要对这些API进行Hook;窃取密码的木马病毒,为了接收键盘的输入,需要Hook键盘消息;甚至是Windows系统及一些应用程序,在打补丁时也需要用到Hook技术。接下来,我们就来学习Hook技术的原理...

安全杂货铺 4万+

国科大作业考试资料-人工智能原理与算法-2024新编-第十一次作业整理

1、有一位教授想知道学生是否睡眠充足。每天,教授观察学生在课堂 上是否睡觉,并观察他们是否有红眼。教授获得如下的领域知识: (1)没有观察数据时,学生睡眠充足的先验概率为0.7。 (2)给定学生前一天睡眠充足为条件,学生在晚上睡眠充足的概率是0.8;如果前一天睡眠不充足,则是0.3。 (3)如果学生睡眠充足,则红眼的概率是0.2,否则是0.7。 (4)如果学生睡眠充足,则在课堂上睡觉的概率是0.1,否则是0.3。 将这些信息形式化为一个动态贝叶斯网络,使教授可以使用这个网络从观察序列中进行滤波和预

MatsumotoChrikk 1055

Android Natvie Hook讲解、 got表hook、inline hook 原理

Android Natvie Hook 讲解什么是Hook,以及Android Native层 hook名词解释以及知识储备处理器架构欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 什么是

spinchao的博客 8294

基于Qt C++开发一个体测数据管理系统

advice.dietAdvice = "饮食建议:\n1. 控制总热量摄入,每天减少300-500大卡\n2. 减少精制碳水(白米饭、白面包、甜食)\n3. 增加优质蛋白和膳食纤维摄入\n4. 烹饪方式以蒸、煮、烤、凉拌为主,减少油炸\n5. 晚餐适量减少,睡前3小时避免进食";dataTable->setHorizontalHeaderLabels({"ID", "用户名", "身高(cm)", "体重(kg)", "BMI", "体脂率(%)", "记录时间"});

寒寒豆豆软件公司的博客 192

深度学习图神经网络 (GNN) —— 处理图结构数据(六十九)

本文系统介绍了图神经网络(GNN)的核心概念、主流模型及其应用。主要内容包括: GNN基础:阐述了图结构数据的特性(节点数不定、连接不规则),以及GNN相比CNN/RNN的优势在于处理非欧式空间的图数据。 核心机制:重点讲解了消息传递框架(MPNN),通过聚合邻居信息迭代更新节点表示,并分析了GCN的归一化邻接矩阵计算和GAT的注意力权重机制。 典型模型: GCN:基于归一化邻接矩阵的特征传播 GAT:引入注意力机制区分邻居重要性 GraphSAGE:通过采样解决大图扩展性问题 GIN:理论表达能力最强的图

hello.reader 300

Hook原理

HOOK,中文译为“挂钩”或“钩子”。在iOS逆向中是指改变程序运行流程的一种技术。例如,一个正常的程序运行流程是A->B->C,通过hook技术可以让程序的执行变成A->我们自己的代码->B->C。在这个过程中,我们的代码可以获取到A传递B的数据,对其进行修改或利用再传递给B,而A,B是不会感知到这个过程的。所以,通过hook可以让别人的程序执行自己所写的代码。在逆向中经常使用这种技术。在学习过程中,我们重点要了解其原理,这样能够对恶意代码进行有效的防护。

程序员阿飘 的博客 1951

基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

在人工智能迈向通用化(AGI)的今天,“视觉感知 + 语言理解”的多模态联合是未来的趋势。单纯的检测画框已经无法满足复杂的业务需求,如何让系统“看懂”画面并进行“思考”,是当前视觉项目的重点。我们知道目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。因此本项目将 YOLO 目标检测模型(兼容 YOLO26/v11/v8 系列)与 DeepSeek 等顶流大语言模型(LLM) 进行联合,使用 Django (后端) + Vue3 (前端) 技术栈

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2834

React Hook的实现原理

Hook 这个单词的意思是"钩子"。React Hooks 的意思是,组件尽量写成纯函数,如果需要外部功能和副作用,就用钩子把外部代码"钩"进来。React Hooks 就是那些钩子。你需要什么功能,就使用什么钩子。React 默认提供了一些常用钩子,你也可以封装自己的钩子。所有的钩子都是为函数引入外部功能,所以 React 约定,钩子一律使用use前缀命名,便于识别。你要使用 xxx 功能,钩子就命名为 usexxx。

kelly0721的博客 3481

不藏了!Wireshark 命令、捕获、过滤器大全分享给你

Wireshark,这款广受欢迎的开源网络协议分析工具,堪称网络管理员、网络安全专家和网络爱好者的“显微镜”!它可以帮助我们捕获网络中的数据包,并提供详细的解码和分析能力。本文将为您全面剖析 Wireshark 的强大功能,从基础到高级,让你快速掌握这个神器!💡Wireshark 是一款功能强大的网络协议分析器,最早由 Gerald Combs 于 1998 年开发,经过多年发展,已成为网络诊断和分析的首选工具。

网络技术联盟站 725

独创改进 | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

独创改进🚀! | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

Coding... 2211

hook 自绘原理

经过一段时间的使用,发现有bug,可能是使用D版的原因,在调试程序时有莫名其妙的错误,停止使用了,现在想找一个开源的界面类。VC写界面真的很痛苦以下是转自优快云的文章,希望能找到一些有用的东西。 界面技术概述 在做“HOOK文件打开/保存对话框”的过程中,我首先研究了界面库的相关知识。界面库一般都是由C/C++这种中低级语言编码,这是因为在Windows下的界面库实现技术大都以直接操

1001

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android hook 程序,Android Hook 原理及应用

Rate this post什么是hookHook的中文意思是“钩子”, 在安卓系统中,不同的应用程序都有触发事件和逻辑处理过程,而hook就是像钩子一样,勾住某个事件,在该事件执行的前或后执行自己的代码。比如,对于一个应用程序,我们不能直接去修改它的代码,就可以通过hook的方式,将自己的代码注入到该应用程序中。Hook的原理如下,在安卓系统中,每个应用程序的进程都是由Zygote进程产生的,Z...

weixin_35849560的博客 3264

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: VC++工程如何脱离VSS环境
下一篇: NSIS 脚本介绍
serverxp
博客等级 码龄23年 31粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值