爱编程的叶一笑 2024-03-05 20:37 采纳率: 50%
浏览 34
已结题

如何利用api hook阻止程序通过DXGI全屏截图

我在一个开源软件项目中工作,目前,我所在的项目已经做到能够将dll注入到指定进程中,甚至有了便捷的api注入宏,而且我已经实现了对GDI方式防止截屏的代码,然而,我发现此办法(拦截GetDC系列函数)并不适用于使用dxgi截屏的应用程序。我现在需要对dxgi相关函数进行拦截,对它们想要截取的窗口句柄进行检查,我应该怎么做?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-05 20:39
    关注

    引自免费微信小程序:皆我百晓生

    针对你的问题,为了阻止通过DXGI进行全屏截图,你需要拦截并处理Direct3D相关的API函数调用,特别是与交换链(IDXGISwapChain)创建和呈现目标获取有关的函数。以下是一些关键的DXGI接口函数,你可以考虑对其进行Hook:

    1. CreateDXGIFactory:创建 DXGI 工厂对象,用于枚举适配器和其他 DXGI 对象。
    2. IDXGIFactory::CreateSwapChain:创建交换链,这是获取渲染结果的关键路径。
    3. IDXGISwapChain::PresentIDXGISwapChain1::Present1:用于将渲染内容提交到屏幕。

    在DLL注入后,可以通过Detours等库实现API Hook。下面是一个简化的示例代码片段,仅展示了如何设置对CreateSwapChain的Hook:

    #include <windows.h>
    #include <detours.h>
    #include <dxgi.h>
    
    // 原始的CreateSwapChain函数指针
    static HRESULT(WINAPI* Real_CreateSwapChain)(
        IDXGIFactory* This,
        IUnknown* pDevice,
        DXGI_SWAP_CHAIN_DESC* pDesc,
        IDXGISwapChain** ppSwapChain);
    
    // 你自定义的拦截处理函数
    HRESULT WINAPI Hooked_CreateSwapChain(
        IDXGIFactory* This,
        IUnknown* pDevice,
        DXGI_SWAP_CHAIN_DESC* pDesc,
        IDXGISwapChain** ppSwapChain)
    {
        // 在这里检查窗口句柄或进行其他安全检查
        HWND hWnd = (HWND)pDesc->OutputWindow;
    
        // 如果检查失败,则不允许创建交换链
        if (!YourCheckFunction(hWnd)) {
            return E_ACCESSDENIED;
        }
    
        // 否则调用原始函数创建交换链
        return Real_CreateSwapChain(This, pDevice, pDesc, ppSwapChain);
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
            {
                DetourTransactionBegin();
                DetourUpdateThread(GetCurrentThread());
    
                DetourAttach(&(PVOID&)Real_CreateSwapChain, Hooked_CreateSwapChain);
    
                if (DetourTransactionCommit() != NO_ERROR) {
                    // 处理Hook失败的情况
                }
            }
            break;
        case DLL_PROCESS_DETACH:
            // 这里应当清理Hook
            break;
        }
    
        return TRUE;
    }
    

    注意这只是一个基本示例,并未包含错误处理、完整的Hook卸载逻辑以及其他可能需要Hook的函数。根据实际需求,你可能还需要Hook更多的DXGI或者Direct3D接口来确保截屏操作被完全阻止。同时,由于Hook技术存在一定的复杂性和兼容性风险,请务必谨慎设计和测试你的解决方案。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月5日
  • 已采纳回答 8月28日
  • 创建了问题 3月5日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见