能否检测到其他程序获取我的窗口hwnd、DC或对窗口进行截图操作?
针对你提到的Win32密码应用场景下的窗口截图、DC访问行为检测需求,具体实现方案和可行性如下:
窗口句柄(HWND)获取行为检测
其他进程调用FindWindow、EnumWindows、GetWindowThreadProcessId等API获取你窗口句柄的操作,用户层没有原生的系统通知机制可以直接检测,可行方案有两种:
- 优先使用Win10 1903及以上版本提供的
SetWindowDisplayAffinity接口,给窗口设置WDA_EXCLUDEFROMCAPTURE属性,设置完成后系统会自动在所有全局截图、其他进程的DC获取操作中排除你的窗口内容,哪怕其他进程拿到了你的HWND也无法获取窗口画面,是成本最低的防护方案。 - 如果必须要检测HWND获取行为,需要开发内核驱动,通过
ObRegisterCallbacks注册内核对象操作回调,监控其他进程对你进程所属的窗口内核对象的打开、查询操作,匹配到非信任进程操作时直接拦截或者触发告警。
GetDC、BitBlt、GetPixel等GDI API调用检测
用户层可以通过API钩子实现这类调用的监控:
- 对系统User32.dll、Gdi32.dll中的
GetDC、GetWindowDC、BitBlt、GetPixel等相关API安装inline hook或者IAT hook,监控所有进程的调用参数,如果发现调用目标对应你的窗口句柄或者窗口DC,就触发告警。 - 注意这类用户层hook只能防护普通的用户层调用,如果恶意程序通过内核驱动直接调用GDI内核态函数,hook会完全失效。
显存访问行为检测
- 其他程序通过WDDM接口直接读取显存获取窗口渲染内容的操作,用户层没有可靠的检测方案,需要在内核层对接WDDM的回调接口实现,开发成本非常高。
- 上述提到的
WDA_EXCLUDEFROMCAPTURE属性已经可以覆盖这类场景,设置后DWM在合成画面时会直接排除你的窗口,其他进程哪怕直接读取显存也拿不到你窗口的完整内容。
补充提示:所有用户层的检测方案都存在被绕过的可能,如果你的应用对安全等级要求较高,优先使用系统原生的安全特性,搭配驱动层的行为监控,不要单独依赖用户层的API钩子做防护。
内容的提问来源于stack exchange,提问作者Demiler
相关产品推荐
相关产品推荐

