SJYssr

Listen Obligate Valued Excuse

文章

27

标签

10

评论

15

文章目录

数据统计

成立

216天

文章

27篇

评论

15条

标签

10个

最近文章

Windows窗口反截屏

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窗口反截屏

发布于

August 23, 2025

分类

代码分享

版权协议

MIT

#开源
评论
😀

感谢支持!

微信二维码

请使用微信扫描二维码打赏。

支付宝二维码

请使用支付宝扫描二维码打赏。