Windows窗口反截屏技术实战:WatcherCheater项目源码解析
代码地址SJYssr
欢迎Follow,Star,Fork
项目背景
在信息安全日益重要的今天,如何防止敏感信息被恶意截屏成为许多企业和开发者关注的焦点。Windows 10 及以上系统引入了 SetWindowDisplayAffinity API,为开发者提供了窗口级别的反截屏能力。WatcherCheater 项目正是基于这一原理,实现了对任意窗口的反截屏保护。
核心原理
WatcherCheater 的核心思路是通过注入代码到目标进程,调用 SetWindowDisplayAffinity,将窗口的显示亲和性(Affinity)设置为 WDA_EXCLUDEFROMCAPTURE,从而让大部分截图工具(如微信、QQ、系统自带截图等)无法捕获该窗口内容。
关键API说明
SetWindowDisplayAffinity(HWND hWnd, DWORD dwAffinity):设置窗口的显示亲和性。WDA_NONE:无特殊限制,可被截图。WDA_EXCLUDEFROMCAPTURE:禁止被大多数截图工具捕获。
核心实现分析
窗口选择机制
项目通过自定义控件 CMyStatic,实现了类似“十字靶”窗口选择器。用户按住控件并拖动到目标窗口,程序会自动捕获窗口句柄,并显示窗口的标题、类名、样式等信息。
void CMyStatic::OnMouseMove(UINT nFlags, CPoint point) {
if (m_bFlag) {
ClientToScreen(&point);
HWND hWnd = ::WindowFromPoint(point);
// ...高亮显示并记录句柄
}
}
代码注入与远程调用
由于部分窗口属于其他进程,直接调用API会失败。WatcherCheater 采用远程线程注入的方式,将调用 SetWindowDisplayAffinity 的代码和参数写入目标进程内存,并创建远程线程执行。
BOOL CWatcherCheaterDlg::ChangeAffinity(HWND Wnd, DWORD dwAffinity) {
// 1. 获取目标进程句柄
// 2. 分配内存并写入参数
// 3. 分配内存并写入注入函数
// 4. 创建远程线程执行
// 5. 释放资源
}
图形界面交互
程序基于 MFC 框架,提供简洁直观的对话框界面。主要按钮包括“隐藏”(设置反截屏)、“显示”(恢复可截屏)、“退出”。所有操作均通过窗口选择器和按钮完成,无需命令行。
使用体验与效果
WatcherCheater 支持对大部分普通 Windows 应用窗口进行反截屏设置。实际测试中,微信、QQ、系统截图工具均无法捕获被保护窗口内容。部分高权限或特殊窗口(如部分系统窗口)可能需要以管理员身份运行本程序。
注意事项
- 反截屏依赖于 Windows 10 及以上系统的 API 支持,低版本系统无效。
- 某些第三方截图工具可能绕过系统 API,无法完全杜绝所有截屏风险。
需以管理员权限运行以操作高权限窗口。
免责声明
⚠️ 免责声明
- 本代码遵循 GPL-3.0 License 协议,允许开源/免费使用和引用/修改/衍生代码的开源/免费使用,不允许修改和衍生的代码作为闭源的商业软件发布和销售,禁止使用本代码盈利,以此代码为基础的程序必须同样遵守 GPL-3.0 License协议
- 本代码仅用于学习讨论,禁止用于盈利和非法用途
- 他人或组织使用本代码进行的任何违法行为与本人无关
- 使用本项目造成的任何后果由使用者自行承担
赞赏支持
如果您觉得此项目对您有所帮助,可以进行赞赏支持:
Made with ❤️ by SJYssr
代码地址SJYssr
Windows窗口反截屏