R3注入反截图

编写Dll 设置F2键开关反截图

cpp 复制代码
#include "pch.h"
#include <windows.h>

#ifndef WDA_NONE
#define WDA_NONE 0x00000000
#endif
#ifndef WDA_EXCLUDEFROMCAPTURE
#define WDA_EXCLUDEFROMCAPTURE 0x00000011
#endif

HWND g_hWnd = nullptr;
bool g_bAntiCapture = false;   // 当前是否开启反截图

BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM)
{
    DWORD pid = 0;
    GetWindowThreadProcessId(hWnd, &pid);

    if (pid == GetCurrentProcessId() && IsWindowVisible(hWnd))
    {
        g_hWnd = hWnd;
        return FALSE;
    }
    return TRUE;
}

DWORD WINAPI AntiCaptureThread(LPVOID)
{
    // 等窗口创建
    for (int i = 0; i < 50 && !g_hWnd; i++)
    {
        EnumWindows(EnumWndProc, 0);
        Sleep(100);
    }

    if (!g_hWnd)
    {
        MessageBoxW(NULL, L"未找到目标窗口", L"提示", MB_OK | MB_ICONWARNING);
        return 0;
    }

    bool lastKeyDown = false;

    while (true)
    {
        SHORT keyState = GetAsyncKeyState(VK_F2);
        bool keyDown = (keyState & 0x8000) != 0;

        // F2 从"未按下"到"按下"的瞬间
        if (keyDown && !lastKeyDown)
        {
            g_bAntiCapture = !g_bAntiCapture;

            if (g_bAntiCapture)
            {
                if (SetWindowDisplayAffinity(g_hWnd, WDA_EXCLUDEFROMCAPTURE))
                {
                    MessageBoxW(NULL, L"反截图已开启", L"提示", MB_OK);
                }
                else
                {
                    MessageBoxW(NULL, L"反截图开启失败", L"错误", MB_OK | MB_ICONERROR);
                }
            }
            else
            {
                SetWindowDisplayAffinity(g_hWnd, WDA_NONE);
                MessageBoxW(NULL, L"反截图已关闭", L"提示", MB_OK);
            }
        }

        lastKeyDown = keyDown;
        Sleep(50); // 降低 CPU 占用
    }

    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule,DWORD reason,LPVOID)
{
    if (reason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);
        HANDLE h = CreateThread(nullptr, 0, AntiCaptureThread, nullptr, 0, nullptr);
        if (h) CloseHandle(h);
    }
    return TRUE;
}

编译dll

注入到测试进程中

按下F2键就能开关反截图功能了

相关推荐
Mortalbreeze10 小时前
深入 Linux Socket 编程:端口号、网络字节序与 struct sockaddr 详解
linux·服务器·网络·c++
繁星蓝雨12 小时前
C++设计原理——异常处理
java·c++·异常处理·noexcept·throw·try catch
Kurisu_红莉栖12 小时前
关于相关问题的自我回答
c++
hansang_IR12 小时前
【题解】[AGC020E] Encoding Subsets
c++·算法·dp
我不管我就要叫小猪12 小时前
C/C++----命名空间
c语言·开发语言·c++
无忧.芙桃13 小时前
数据结构之堆
c语言·数据结构·c++·算法·
2301_7779983414 小时前
Linux线程控制——从线程创建到线程分离(第三部分:线程等待 pthread_join)
linux·运维·服务器·c语言·c++
醉城夜风~14 小时前
C++模板详解:从基础到高级全面解析
java·开发语言·c++
RuiZN14 小时前
Muduo---Channel类
运维·服务器·c++
誰能久伴不乏14 小时前
深入理解 C++ 多态:对象模型与底层机制解析
开发语言·c++·架构