![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Windows 基础编程
文章平均质量分 90
基于对 Windows 的简单研究,实现一些常用功能,或者复现常见的技术。
涟幽516
Those who cannot remember the past are condemned to repeat it.
展开
-
检测窗口是否最大化兼容 Win10/11
在 Win10/11 上有很多 UWP 进程,检测窗口是否最大化将迎来新的挑战。这些窗口以它不能够使用 Win32 的 IsWindowVisible 获取窗口可见性。必须使用 DWM API 来判断此类窗口的状态。原创 2024-06-10 15:59:20 · 295 阅读 · 0 评论 -
【Windows】UWP - Application Frame 窗口句柄溯源
当 GUI 线程的窗口属于 Windows/UWP 应用程序时,它们始终由进程 ApplicationFrameHost 托管。如果依然使用 Win32 的那套方法我们最终将获取到根进程ApplicationFrameHost.exe 而不是实际的 AppContainer 进程或者 RuntimeBroker 进程。原创 2024-06-10 12:06:52 · 691 阅读 · 0 评论 -
用户态下屏蔽全局消息钩子 —— ClientLoadLibrary 指针覆盖
拦截 SetWindowsHookEx 函数的官方方法是在系统或程序运行的早期,安装一个 WH_DEBUG 类型的 Win32 钩子,这将允许你捕获后面几乎所有 Win32 钩子的挂钩过程(除了WH_KEYBOARD_LL 低级键盘钩子无法拦截以外),具体可以参考。首先,它定位回调指针的地址。首先是一种触发操作时的调用堆栈,可以看出间接调用了 __ClientLoadLibrary 指针指向的函数,然后依次调用钩子回调队列中的函数。它保存 DLL 的路径、指向通知函数的指针以及一些尚不清楚的数据。原创 2024-05-26 00:58:42 · 665 阅读 · 0 评论 -
编程实现标题栏窗口摇动——显示桌面的未公开细节研究
本文提供一种前瞻方法来触发窗口顺序改变。如果您在 Windows 11(或 Windows 10)系统上抓住窗口标题并用鼠标摇动它,屏幕上所有其他打开的窗口都将最小化到任务栏。然后,如果您再次摇动同一个窗口,它们将返回到屏幕上。此功能称为“窗口摇动” (TitleBar Window Shake)或 Aero Shake,自 Windows 7 起可用。原创 2024-05-25 23:30:03 · 726 阅读 · 0 评论 -
Windows 固定快捷方式到任务栏
将应用程序固定到任务栏是 Windows 7 中首次引入的一项功能。自其发明以来,微软(根据 Raymond Chen 的说法)就打算不提供(无限的)编程操作。显然,一些开发人员认为他们的应用程序是世界上最棒的,谁不希望我们的应用程序在安装时固定到任务栏?!目前操作任务栏固定的方法有很多种,这里整理常用的几种方法。原创 2024-05-18 18:19:40 · 1253 阅读 · 0 评论 -
Win 11 24H2 桌面窗口层次改动
Win11 24H2 最近在测试渠道发布了(3 月 13 日)。经过这几天的测试,我们已经观察到 Win11 为了优化用户体验,对资源管理器一些实现细节进行了改动。当然,这些改动在 UI 上体现的不是很明显。但是,可见的是,删除了很多旧的东西。原创 2024-03-22 21:39:11 · 542 阅读 · 0 评论 -
重启 explorer 进程的正确做法(二)
在上一篇中我认为:“我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者 taskkill /f /im 等方法重启资源管理器( explorer.exe ),其实这是。所以,我们正确的做法是,在调用 TerminateProcess 之前,修改注册表 “AutoRetartShell” 的值为 0 ,然后再在结束进程后恢复值为 1 即可。其实,并不能一口咬定以前的方法不正确。重启资源管理器进程的方法不唯一,但长期以来大家对实施方法用的不到位。要知其然,更要知其所以然。原创 2024-03-10 16:13:42 · 708 阅读 · 0 评论 -
对通知区域(Win 系统托盘)窗口层次的分析
Windows 的通知区域也就是我们俗称的系统托盘,该区域是为了显示应用程序或系统的重要通知以及支持应用程序的最小化操作而诞生的。关于他的历史由来有一些有趣的说法,有兴趣的可以搜索资料了解一下。在前面的几篇文章中,我详细介绍了在新旧不同版本的 Windows 系统上获取通知区域图标信息的方法。后来,我考虑到:如果缺乏对通知区域界面的基本知识的了解,可能会影响通知区域图标信息的获取方法的理解。原创 2024-03-04 00:17:51 · 1469 阅读 · 0 评论 -
获取 Windows 系统托盘图标信息的最新方案(三)
在《获取 Windows 系统托盘图标信息的最新方案(一)》中(下文简称 《最新方案(一)》),我们讨论了在 Win11 22H2 上获取系统托盘图标信息的方法,即拦截 Shell_TrayWnd 窗口的 WM_COPYDATA 消息。在《最新方案(一)》中,我们主要使用 Inline hook 重写 CTray::v_WndProc 函数,也就是窗口过程函数来拦截 WM_COPYDATA 消息。具体分析了两种注入 explorer 的实现方法:(1)创建挂起进程的远程线程注入;原创 2024-02-22 19:21:17 · 1260 阅读 · 8 评论 -
获取 Windows 系统托盘图标信息的最新方案(二)
系列文章分析获取系统通知区域图标的多种方法。解释了在 Win11 22H2 更新后无法获取托盘图标信息的问题所在,并给出了有效的解决方案。这一篇主要是对第一篇第 4 节的解析注册表中系统通知图标信息的方法进行详细的解释。原创 2024-02-20 23:24:11 · 1354 阅读 · 3 评论 -
获取 Windows 系统托盘图标信息的最新方案(一)
本文分析获取系统通知区域图标的多种方法。解释了在 Win11 22H2 更新后无法获取托盘图标信息的问题所在,并给出了有效的解决方案。这篇文章发布前,我一直在我的一篇历史文章中更新我的研究进度。在解决这个这个问题的过程中,我逐步地了解到了通知消息传递的一些细节,而在此之前对细节实现的分析过程只是被我潦草地堆砌在一起,并没有很好地梳理事情的整个流程。所以我决定将文章重新整理出来。也就是大家现在看到的这篇长文,请认真地阅读下去,这将会解决一部分的一直以来在文献中含糊不清的问题。原创 2024-02-20 18:08:25 · 1812 阅读 · 2 评论 -
Windows 重启 explorer 的正确做法
我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者 taskkill /f /im 等方法重启资源管理器( explorer.exe ),其实这是不正确的。我们应该使用重启管理器接口来重启 explorer 进程。原创 2024-02-19 22:29:22 · 2199 阅读 · 0 评论 -
Windows 虚拟桌面信息(一)分析注册表
Win 10/11 的虚拟桌面微软暂时没有开放接口,有很多信息对开发者是闭塞的,对于开发动态壁纸程序来说,这个功能也是需要的,我们需要检测多桌面的情况,以允许不同桌面用不同的壁纸。相关的研究目前就是对未公开的 COM 接口进行操作的,可以实现很强大的功能。本系列将逐一复现外网的相关研究结论。当然,这一部分研究注册表的结果是我自己发现的。原创 2024-02-14 00:00:18 · 372 阅读 · 0 评论 -
模拟发送 Ctrl+Alt+Del 快捷键
对于开启了安全登陆的窗口工作站 Server 系统,需要在登陆时按下 Ctrl + Alt + Del 才能成功登陆。此时,研究一种编程模拟发送组合热键以便于验证安全注意序列(SAS)是有必要的,通过研究发现发送这样子的快捷键往往需要一些特殊的技巧,因为他它和一般的快捷键不同(诸如,Win + D)。原创 2024-02-11 00:19:30 · 1301 阅读 · 1 评论 -
使用 NtQuerySystemInformation 遍历进程信息
通过遍历系统进程信息,我们可以了解系统中运行的各种进程的详细信息,从而更好地进行系统管理和性能优化。本文介绍了一种通过调用 Windows 系统API来获取并遍历系统进程信息的技术,并提供了一段示例代码以帮助读者理解该技术的实现方法。原创 2024-02-07 11:42:06 · 953 阅读 · 0 评论 -
R3 下动态加载的模块的保护(一)
在 R3 下防护动态加载的模块不被意外卸载需要很多的策略,比如:LDR 断链、VAD 记录擦除、PE 头擦除、修改入口函数、内存注入等。文本我们将浅析模块静态化技术这一项技术。模块静态化是一个很常见的模块保护技术,它通过修改模块的引用计数为 -1,来使得模块不可被标准的 API 成功卸载。系列文章:R3 下动态加载的模块的保护(一):分析模块伪静态化技术 [本文]R3 下动态加载的模块的保护(二):分析重映射擦除 VAD 信息[暂未发布]更多 ... ...文本浅析模块静态化技术这一项技术。原创 2024-02-03 23:42:40 · 694 阅读 · 0 评论 -
屏蔽系统热键/关机/注入 Winlogon(中)
系列文章主要讲解关于挂钩Winlogon回调过程,实现对任务管理器电源操作DWM 自启动控制、常见系统热键等进行编程拦截。最后,我们指出可以通过我们的方法修改系统登陆或者其他安全页面的界面样式,达到自定义的效果。这是之前编写的一篇文章,一直没有发布,最近得空完善了一下。本篇从 RPC 挂钩角度实现热键拦截。我曾阅读过heiheiabcd写的通过修改具体的窗口回调中的操作 ID,将其指向无效的 ID 来拦截系统热键的方法(《禁止Ctrl+Alt+Del、Win+L等任意系统热键》原创 2024-01-29 11:21:04 · 942 阅读 · 0 评论 -
屏蔽系统热键/关机/注入 Winlogon(下)
系列文章主要讲解关于挂钩Winlogon回调过程,实现对任务管理器电源操作DWM 自启动控制、常见系统热键等进行编程拦截。最后,我们指出可以通过我们的方法修改系统登陆或者其他安全页面的界面样式,达到自定义的效果。这是之前编写的一篇文章,一直没有发布,最近得空完善了一下。本篇从 RPC 挂钩角度实现热键拦截。我曾阅读过heiheiabcd写的通过修改具体的窗口回调中的操作 ID,将其指向无效的 ID 来拦截系统热键的方法(《禁止Ctrl+Alt+Del、Win+L等任意系统热键》原创 2024-01-29 11:13:11 · 967 阅读 · 0 评论 -
实现屏蔽 Ctrl + Alt + Del 、Ctrl + Shift + Esc 等热键(一)
winlogon 进程通过 SignalManagerWaitForSignal 函数循环等待系统快捷键。最终通过 WMsgKMessageHandler 回调函数来实现 RPC 消息的处理。第一个参数 uMsgCSessionKey 控制会话有关(CSession)的回调消息,这不是我们需要关注的。第二个参数 uMsgWLGenericKey 控制注册调用(WLGeneric)的回调消息,其中包含了对快捷键处理有关的函数。原创 2024-01-28 21:33:28 · 1714 阅读 · 3 评论 -
TLS 回调中挂钩 LdrLoadDll 实现监视模块加载过程
通过 TLS 回调机制可以实现很多功能,本文简单地从挂钩 LdrLoadDll 函数说起,通过利用 TLS 回调比程序入口代码执行更早的特性,实现监视程序执行期间所有模块加载过程。TLS 全称为 Thread Local Storage,是 Windows 为解决一个进程中多个线程同时访问全局变量而提供的机制。TLS 可以简单地由操作系统代为完成整个互斥过程,也可以由用户自己编写控制信号量的函数。原创 2024-01-24 16:10:00 · 1089 阅读 · 0 评论 -
Windows 程序文件特征码识别定位方法
常见的文件特征码识别定位是基于硬编码指令定位、逻辑偏移量等方法,这种方法对于定位字符串等相对固定的数据非常友好。但是,对于编译程序中经常更新的组件,定位其中的指令代码就会因为版本更新而需要同步更新定位方法。文本介绍一种基于控制流程和函数调用链导向的特征码匹配定位方法,同时也从个人有限的角度去分析如何更好地选择特征码。特征码是一串二进制字符串,可以用来定位数据、判断字段、识别病毒等。特征码通常是从文件或汇编代码中提取。特征码可以被杀毒软件用来扫描病毒,也可以被病毒用来修改或掩码,实现免杀。原创 2024-01-22 23:21:40 · 1263 阅读 · 1 评论 -
获取 Dll 模块的加载字符串资源
获取 Dll 模块中加载的字符串资源,可以通过 LoadString 实现。具体操作如下:从与指定模块关联的可执行文件加载字符串资源,并将字符串复制到具有终止 null 字符的缓冲区中,或返回指向字符串资源本身的只读指针。其可执行文件包含字符串资源的模块实例的句柄。若要获取应用程序本身的句柄,请使用 NULL 调用 GetModuleHandle 函数。要加载的字符串的标识符。原创 2024-01-13 10:40:42 · 979 阅读 · 0 评论 -
RPC-Hook 屏蔽系统热键(一)
通过挂钩技术( Hooking )注入代码来修改winlogon.exe 的Ndr64AsyncServerCallAll函数的 Buffer 参数,从而实现屏蔽系统热键、拦截计算机电源操作等功能。原创 2024-01-11 18:31:43 · 1154 阅读 · 0 评论 -
获取系统托盘图标信息的尝试
尝试在资源管理器初始化时注入例程,过滤 Shell_TrayWnd 窗口的 WM_COPYDATA 消息,因为任何通过 SHAppBarMessage, Shell_NotifyIcon, SHEnableServiceObject 和 SHLoadInProc 封装的内部实现都是向 Shell_TrayWnd 的消息线程发送 WM_COPYDATA 并带有特殊标志的缓冲区结构来共享系统通知栏的图标信息。原创 2023-01-07 21:52:17 · 1304 阅读 · 11 评论 -
利用 PEB_LDR_DATA 结构枚举进程模块信息
我们常常通过很多方法来获取进程的模块信息,例如EnumProcessModules 函数、CreateToolhelp32Snapshot 函数、WTSEnumerateProcesses 函数、ZwQuerySystemInformation 函数等。但是调用这些接口进行模块枚举的原理是什么我们并不知道。通过学习 PEB 中 PEB_LDR_DATA 结构的知识,我们可以对进程模块信息的查询以及相关存储数据结构有进一步的了解。原创 2023-12-29 18:32:49 · 1370 阅读 · 0 评论 -
Windows 拦截系统睡眠、休眠
本文从 R3 角度分析了编程拦截睡眠的一般方法,通过上文,其实不难发现,要在 R3 下拦截任意进程发起的睡眠,必须全局注入处理NtInitiatePowerAction、 NtSetSystemPowerState 等函数。在前一篇文章中,我们分析了拦截 RPC 异步回调,可以对很多系统热键以及跟电源有关的操作做出“提前”响应......原创 2024-01-21 11:02:27 · 1538 阅读 · 4 评论 -
R3下 API 挂钩监视右键管理员权限启动
以前的操作系统上,挂钩 CreateProcessInternel 即可监视进程创建,在 以管理员身份启动的时候,情况发生了变化,我们的 explorer 不再调用原来的路径,而是使用一个未被导出的函数 AicFindLaunchAdminProcess。我们只需要根据特征码定位该函数的入口点,并挂钩该函数,即可监视资源管理器中,那些以管理员身份启动的程序。原创 2023-10-24 22:35:29 · 114 阅读 · 0 评论 -
检测虚拟机环境(一)
虚拟机环境的检测有多种方法,这里以注册表痕迹检测法为例,谈谈如何快速检测虚拟环境。原创 2023-10-24 19:03:32 · 923 阅读 · 0 评论 -
【转载】禁止Ctrl+Alt+Del、Win+L等任意系统热键
另外一个想法是直接挂起 Winlogon.exe 进程,由于 Winlogon.exe 只负责登录和注销等工作,因此挂起它也没什么,但还是上面的问题,如果在挂起 Winlogon.exe 进程期间,按下了Ctrl+Alt+Del,等我们恢复掉挂起的 Winlogon.exe 进程,Ctrl+Alt+Del 还是会得到响应。双击对 "taskmgr.exe /%lu " 的引用,来到下面这段代码,很明显这是打开任务管理器,我最在意的是谁调用的这段代码,可惜 IDA 没显示谁调用了函数,但是有数据引用。转载 2023-10-23 17:58:09 · 355 阅读 · 0 评论 -
【基于Win10】桌面窗口层次记录(Spy++)
当应用程序新建了一个窗口时,操作系统将根据窗口的类型,将它放置到同类型窗口的最上方,即同类型窗口 Z-Order 的最顶层。如果这个窗口是一个 Topmost 窗口,使用 HWND_BOTTOM 参数调用 SetWindowPos 函数之后,这个窗口将不再是 Topmost 类型,并被放到所有其他窗口之下,即如果此时还存在 Non-Topmost 类型的其他窗口,哪怕当前窗口是一个 Topmost 类型窗口,它也将被放到其他 Non-Topmost 类型窗口之下,也就是变为所有窗口中最底层的那⼀个。原创 2022-06-30 17:36:20 · 521 阅读 · 0 评论 -
屏蔽系统热键/关机/注入 Winlogon(上)
本文主要讲解关于挂钩Winlogon过程,实现对任务管理器电源操作DWM 自启动控制、常见系统热键等进行编程拦截。最后,我们指出可以通过我们的方法修改系统登陆或者其他安全页面的界面样式,达到自定义的效果。这里主要涉及 R3 用户层下的挂钩,如果是 R0,有些操作可能更为简单。这是之前编写的一篇文章,一直没有发布,最近得空完善了一下。【提示】原创 2023-10-24 21:02:29 · 1471 阅读 · 0 评论 -
使用 Winsta API 结束进程句柄
于是我们拷贝了一份去分析了一下它是如何运作的,发现主要调用 WinStationTerminateProcess 来终止进程,查找进程我们改用 NtQuerySystemInformation 来完成,算是一种结束进程的方法吧,TerminateProcess 也可以终止进程。我们发现只要提供进程的PID就可以结束进程,避免了调用 OpenProcess,第一个参数指定目标工作站,如果为 NULL,表示搜索所有工作站。Winsta 有好几个有意思的函数,比如可以用其中的函数结束工作站强制注销或关机等等。原创 2023-10-12 23:01:33 · 137 阅读 · 0 评论 -
利用 ZwCreateThreadEx 注入 DLL
PROCESSENTRY32W 结构体中的 cntThreads 包含进程的线程计数信息,崩溃的进程没有主线程,于是,可以加上这个条件来过滤。我们可以采取很多方法来注入 DLL 比如较新的早鸟(EarlyBird)技术,就是利用 APC 配合未公开函数进行劫持注入。需要注意的是我们可能遇到内存中已经崩溃的进程,这种时候会导致注入器不断尝试注入过程,但始终失败。我们常常使用进程名作为特征,遍历进程的 PID 以及句柄,然后执行注入过程原创 2023-10-09 18:09:30 · 534 阅读 · 1 评论 -
根据 PDB 文件分析 DLL 内部符号的地址
最近遇到给定一个 DLL 文件,但是想快速定位内部函数(没有导出)的地址,想到 Sym 系列函数可以实现根据已知的 PDB 调试符号数据库直接分析出函数的地址,参考了 MSDN 可以知道我们需要依次调用如下函数......原创 2023-10-09 17:37:17 · 230 阅读 · 1 评论 -
注入Dll 阻止任务管理器结束进程 -- Win 10/11
资源管理器通过NtQuerySystemInformation获取进程信息,通过TerminateProcess以及EndTask等函数终止进程,我们可以通过挂钩途径中的多个R3函数实现在资源管理器中保护进程。可以看出该接口返回的结构体包含链表结构,我们可以通过断链方法隐藏进程,或者通过记录查找到的进程信息,在联合挂钩NtOpenProcess等函数来保护进程。其他部分不在详细叙述,给出完整代码,需要注意的是,该挂钩只适用于Taskmgr不适用于procexp等程序。原创 2023-10-05 19:49:26 · 401 阅读 · 3 评论 -
修改 Windows 文件访问权限的多种方法
由于文件是安全对象,因此访问它们受访问控制模型控制,该模型控制对 Windows 中所有其他安全对象的访问。更改文件或目录对象的安全描述符,需要调用或等函数。ACL,用来表示用户(组)权限的列表,包括 DACL和 SACL;ACE,ACL中的元素;DACL,用来表示安全对象权限的列表;SACL,用来记录对安全对象访问的日志。关于这几个概念已经有很多资料解释,这里就不详细展开了。(以下仅介绍通过Win32API修改文件安全属性的一些内容)。原创 2023-08-23 21:52:13 · 6254 阅读 · 6 评论 -
Dll注入过滤任意Windows控制台命令行输入
命令提示符也就是命令行控制台,新版本也叫做Windows 终端。如何做到当命令被输入控制台窗口后能够做到过滤呢?其中,有一种就是键盘钩子判断键盘输入,但实用性可能不高。另外一种方法就是获取控制台缓冲区的文本,了解用户接下来要使用那种指令,然后对其进行相应的过滤。上面的图片展示了本节我们要实现的命令拦截效果。我们甚至只需要过滤具有特征性的参数调用。首先我们需要明白的是,无论是新版还是旧版控制台(兼容性)他的控制台缓冲区数据都是在一个名为cmd.exe的进程中完成的。原创 2023-01-29 21:10:53 · 689 阅读 · 2 评论 -
利用 WMI 接口结束进程
我们发现在新的系统上不能以低完整级别(普通账户的安全上下文)来执行对具有高完整级别进程的终止。会返回拒绝访问的错误。诸如taskkill.exe /F /IM ***.exe /T 都不能完成一些结束指令。那么我们该如何完成结束后台进程的任务呢?如果这个进程不是我们自己的进程的话?并且我们不使用提升的权限来终止进程,那么该如何做到?我相信,很多人会提议使用wmic, ntsd ,powershell,那我们现在就来看看他们各自的实现吧。原创 2023-01-27 08:15:00 · 377 阅读 · 0 评论