搜尋

NVIDIA OverlayNVIDIAOverlay遊戲修改器

返回清單
切換到指定樓層
通知這文章過時或找檔案 發表主題

[電玩遊戲] 《NVIDIA Overlay》共享映射漏洞技術整理 無DLL注入畫面覆蓋原理、Token加密破解、反作弊繞過技術

[複製連結]
1樓
A7533984132 ( Lv.30 大天使 ) 發表於 10 小時前 | 只看該作者 回覆獎勵 |降序瀏覽 |閱讀模式

《NVIDIA Overlay》共享映射漏洞 快速閱讀精華


  • 🎯 **核心突破**:利用 NVIDIA 遊戲覆蓋層的共享記憶體機制,無需注入 DLL 即可在任意目標程序上渲染自訂畫面
  • 🔐 **加密破解**:逆向工程 NVIDIA 的資源 Token 加密演算法,透過日誌檔洩漏的資訊還原 XOR 遮罩與會話密鑰
  • ⚠️ **雙重風險**:此技術不僅可用於遊戲外掛繞過反作弊,還能無聲截取使用者桌面,造成嚴重隱私外洩
  • 🛠️ **技術本質**:劫持 NVIDIA 合成器的共享記憶體插槽,替換為自行建立的 D3D11 紋理,讓 NVIDIA 驅動程式「幫我們」完成畫面渲染




漏洞背景與技術原理



當你在遊戲中開啟 NVIDIA GeForce Experience 的覆蓋層(Overlay)查看幀數或截圖時,背後其實有一套複雜的共享記憶體機制在運作。這次揭露的漏洞正是利用了 NVIDIA 驅動程式與遊戲程序之間的信任關係,實現了無需注入任何 DLL 就能劫持畫面渲染的攻擊手法。


👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app



核心概念:NVIDIA 的遊戲內覆蓋層使用具名共享記憶體區段(Named Shared Memory Sections)來傳遞覆蓋層插槽(Overlay Slots)資訊給合成器(Compositor)。每個插槽包含紋理權杖(Texture Token)、尺寸、位置、格式以及更新計數器等關鍵資料。

攻擊者可以開啟其中一個映射區段並取得讀寫權限,保存原始插槽資料後,將其替換為自行建立的 D3D11 共享紋理。當更新計數器遞增後,NVIDIA 的合成器會自動拾取變更後的插槽,並將我們的紋理渲染到目標程序之上。

運作機制深度整理



整個攻擊流程可以拆解為四個關鍵階段,每個階段都利用了 NVIDIA 驅動架構的設計特性:

第一階段:記憶體映射劫持

NVIDIA 驅動會在目標程序中建立具名共享記憶體區段,名稱格式通常包含程序 ID 與會話識別碼。PoC(概念驗證)程式會掃描這些區段,以讀寫權限開啟目標映射。

關鍵在於無需注入任何 DLL 到目標程序,所有操作都在攻擊者自己的程序空間完成。這使得傳統的反作弊偵測機制(掃描外來 DLL、記憶體完整性檢查)完全失效。

第二階段:紋理插槽替換

成功映射記憶體後,程式會備份原始插槽資料,然後建立一個新的 D3D11 共享紋理。這個紋理的共享權杖(Shared Handle)會經過編碼後寫入插槽結構,替換原始紋理權杖。

插槽結構中的更新計數器(Update Counter)是關鍵觸發機制。當這個計數器遞增時,NVIDIA 的合成器會認為插槽資料已更新,重新讀取紋理資訊。

第三階段:驅動級渲染劫持

這是整個攻擊最巧妙的部分——NVIDIA 驅動程式幫攻擊者完成了髒活。合成器信任共享記憶體中的插槽資料,不會驗證紋理權杖的來源是否合法,直接將攻擊者提供的紋理渲染到目標程序之上。

由於渲染是在驅動層級完成,目標程序完全無法察覺畫面被覆蓋。無論是遊戲還是其他應用程式,看到的都是自己正常的渲染結果,而實際顯示的畫面已經被劫持。

Token加密破解技術



NVIDIA 並非完全沒有防護——他們對共享紋理權杖進行了加密處理。權杖不會直接儲存在共享記憶體中,而是與一個由會話密鑰(Session Key)和 32 位元種子(Seed)產生的遮罩(Mask)進行 XOR 運算。

加密演算法

遮罩產生函式使用了多組 64 位元常數與複雜的位元運算:

std::uint64_t resource_token_mask(std::uint64_t key, std::uint32_t seed) {
    constexpr std::uint64_t c1 = 0xFF51AFD7ED558CCDull;
    constexpr std::uint64_t cx = 0xED77E7F1C90AA277ull;
    constexpr std::uint64_t c2 = 0xC4CEB9FE1A85EC53ull;

    const std::uint64_t repeated = static_cast<std::uint64_t>(seed) |
        (static_cast<std::uint64_t>(seed) << 32);

    std::uint64_t value = key ^ repeated;
    value = (value ^ (value >> 33)) * c1;
    value = (value ^ (value >> 33)) * cx;
    value = (value ^ (value >> 33)) * c2;
    return value ^ (value >> 33);
}


最終編碼後的權杖計算方式為:

encoded_token = shared_texture_handle ^ resource_token_mask(key, seed);


日誌檔洩漏破綻

諷刺的是,NVIDIA 的驅動程式會將解碼後的權杖寫入 CaptureCore.log 日誌檔。這意味著攻擊者可以從兩個來源取得關鍵資訊:

  • 共享記憶體映射中的編碼後權杖(Encoded Token)
  • 日誌檔中的明文解碼權杖(Decoded Handle)


取得這兩個值後,遮罩的計算簡化為一次 XOR 運算:

mask = encoded_token ^ decoded_handle;


有了遮罩和種子,剩下的就是逆向工程多輪 XOR 和乘法運算,還原會話密鑰。一旦取得密鑰,攻擊者就能產生任意有效的紋理權杖,完全繞過 NVIDIA 的加密保護。

核心程式碼實作



以下是實作此漏洞的關鍵程式碼片段,展示瞭如何劫持 NVIDIA 的共享記憶體映射並替換紋理插槽:

共享記憶體映射開啟

// 開啟 NVIDIA 覆蓋層共享記憶體映射
HANDLE hMapFile = OpenFileMapping(
    FILE_MAP_ALL_ACCESS,  // 讀寫權限
    FALSE,                // 不繼承
    L"NVIDIA_Overlay_Shared_Memory"  // 映射名稱(實際名稱依程序而異)
);

if (hMapFile == NULL) {
    // 錯誤處理
    return;
}

// 映射視圖到當前程序位址空間
LPVOID pBuf = MapViewOfFile(
    hMapFile,
    FILE_MAP_ALL_ACCESS,
    0, 0,  // 偏移量
    SHARED_MEM_SIZE  // 映射大小
);


紋理插槽結構定義

// NVIDIA 覆蓋層插槽結構(簡化版)
struct OverlaySlot {
    std::uint64_t texture_token;      // 加密後的紋理權杖
    std::uint32_t widtd;              // 紋理寬度
    std::uint32_t height;             // 紋理高度
    std::uint32_t format;             // DXGI 格式
    std::uint32_t update_counter;     // 更新計數器(關鍵觸發器)
    std::uint32_t seed;               // 加密種子
    // ... 其他欄位
};

// 插槽在共享記憶體中的偏移量
constexpr size_t SLOT_OFFSET = 0x100;


紋理替換與觸發

// 備份原始插槽資料
OverlaySlot original_slot;
OverlaySlot* pSlot = reinterpret_cast<OverlaySlot*>(
    static_cast<char*>(pBuf) + SLOT_OFFSET
);
memcpy(&original_slot, pSlot, sizeof(OverlaySlot));

// 建立 D3D11 共享紋理
ID3D11Texture2D* pSharedTexture = CreateSharedTexture(
    device, widtd, height, DXGI_FORMAT_B8G8R8A8_UNORM
);

// 取得共享權杖並加密
HANDLE shared_handle = GetSharedHandle(pSharedTexture);
uint64_t encoded_token = EncodeToken(shared_handle, key, seed);

// 替換插槽資料
pSlot->texture_token = encoded_token;
pSlot->widtd = widtd;
pSlot->height = height;
pSlot->update_counter++;  // 遞增觸發合成器更新

// 等待 NVIDIA 合成器渲染我們的紋理
Sleep(16);  // 約一幀時間

// 還原原始插槽(可選,用於隱藏痕跡)
memcpy(pSlot, &original_slot, sizeof(OverlaySlot));


Token 加密實作

// 產生資源權杖遮罩
uint64_t ResourceTokenMask(uint64_t key, uint32_t seed) {
    constexpr uint64_t c1 = 0xFF51AFD7ED558CCDull;
    constexpr uint64_t cx = 0xED77E7F1C90AA277ull;
    constexpr uint64_t c2 = 0xC4CEB9FE1A85EC53ull;
   
    uint64_t repeated = static_cast<uint64_t>(seed) |
                       (static_cast<uint64_t>(seed) << 32);
   
    uint64_t value = key ^ repeated;
    value = (value ^ (value >> 33)) * c1;
    value = (value ^ (value >> 33)) * cx;
    value = (value ^ (value >> 33)) * c2;
    return value ^ (value >> 33);
}

// 編碼共享紋理權杖
uint64_t EncodeToken(HANDLE shared_handle, uint64_t key, uint32_t seed) {
    uint64_t mask = ResourceTokenMask(key, seed);
    uint64_t handle_value = reinterpret_cast<uint64_t>(shared_handle);
    return handle_value ^ mask;
}

// 從日誌還原遮罩
uint64_t RecoverMaskFromLogs(uint64_t encoded_token, uint64_t decoded_handle) {
    // CaptureCore.log 中包含 decoded_handle
    return encoded_token ^ decoded_handle;
}


實際影響與潛在風險



這項技術的危險性遠超過一般的遊戲外掛或修改器。傳統的畫面覆蓋或記憶體修改通常需要將惡意 DLL 注入目標程序,這會觸發現代反作弊系統(如 BattlEye、Easy Anti-Cheat、Vanguard)的敏感偵測機制。然而,此漏洞完全繞過了這道防線。

反作弊系統的盲點

現行反作弊方案主要監控以下行為:
  • 可疑的 DLL 注入或記憶體掃描
  • 未簽署的驅動程式載入
  • 系統呼叫攔截(Hook)行為
  • 除錯器或虛擬化痕跡


然而,此技術利用的是 NVIDIA 官方驅動程式(具有有效數位簽章)的合法功能。反作弊系統看到的是 NVIDIA 驅動在執行「正常的」覆蓋層合成工作,無法區分這是合法的遊戲 HUD 還是惡意的第三方覆蓋。

桌面截圖的隱私威脅

更可怕的是,這項技術不僅限於遊戲程序。由於 NVIDIA 驅動層級的設計,攻擊者可以利用相同的機制,在使用者完全不知情的情況下截取整個桌面畫面。這意味著:

  • 網路銀行操作畫面可能被即時擷取
  • 私人訊息或敏感文件內容可被側錄
  • 企業機密資訊可能在無痕跡的情況下外洩


與傳統的螢幕截圖木馬不同,這種方式不會觸發作業系統的截圖 API,也不會在螢幕上顯示任何覆蓋層提示,因此極難被偵測或防範。

對遊戲產業的衝擊

對於競技遊戲生態而言,此漏洞的影響是災難性的。傳統的外掛通常會留下可偵測的痕跡,但這種「無痕跡」的畫面覆蓋可以實現:

  • 即時敵人位置標記(ESP)而無需讀取遊戲記憶體
  • 自瞄輔助的視覺回饋線條
  • 遊戲內資源位置的高亮顯示


由於這些視覺元素是透過 NVIDIA 驅動「合法」渲染的,遊戲客戶端無法區分這些是外部注入的還是遊戲內建的功能,這使得傳統的用戶端反作弊措施完全失效。



所有站內附件皆會附上安全掃描報告
請會員查看純淨度百分比後判斷使用



相關檔案須知:
取得檔案前,請先詳細閱讀文章內容
避免不必要錯誤與誤會發生。
也可多參考文章討論樓層內容
了解附件檔案相關討論資訊。





常見問題Q&A



Q:這個漏洞會影響所有 NVIDIA 顯示卡嗎?

只要是使用 NVIDIA GeForce Experience 並啟用遊戲內覆蓋層功能的系統,理論上都暴露在此風險之下。這包括從 GTX 600 系列到最新的 RTX 40 系列顯示卡,只要驅動程式版本支援 Overlay 功能,就可能成為攻擊目標。特別危險的是預設安裝 GeForce Experience 的遊戲玩家族羣,因為他們通常不會主動關閉這些「便利」功能。

Q:反作弊系統為什麼偵測不到這種攻擊?

傳統反作弊系統主要監控程序記憶體完整性、DLL 注入行為以及可疑的系統呼叫。然而,這項技術完全在 NVIDIA 官方驅動程式的「合法」操作範圍內執行——它使用 Windows 標準的共享記憶體機制,透過 D3D11 合法 API 建立紋理,並且最終的畫面合成是由 NVIDIA 自己的驅動程式完成。反作弊系統看到的是「NVIDIA 驅動在正常運作」,而非「外來程序在注入遊戲」。

Q:一般使用者該如何保護自己?

目前最有效的防護措施是完全停用 NVIDIA GeForce Experience 的遊戲內覆蓋層功能,甚至考慮解除安裝 GeForce Experience 只保留純驅動程式。此外,保持驅動程式更新(NVIDIA 可能已在後續版本修補)以及避免下載來路不明的「優化工具」或「遊戲輔助」都是基本防線。對於企業用戶,建議在敏感操作環境中完全移除獨立顯示卡的 Overlay 功能,或使用虛擬桌面環境隔離潛在風險。

Q:這個技術只能用於遊戲作弊嗎?

絕對不是。雖然技術影片通常以遊戲為目標(因為效果直觀且受眾關注),但此漏洞的潛在危害遠超遊戲範疇。攻擊者可以利用相同的機制,在使用者瀏覽網頁、操作網路銀行、處理機密文件時,無聲無息地截取螢幕畫面或疊加釣魚介面。這屬於作業系統層級的權限濫用,影響範圍涵蓋所有 Windows 桌面應用程式,而不僅僅是遊戲。

Q:NVIDIA 官方對此有回應或修補嗎?

根據原始發現者的描述,他在向 NVIDIA 回報此問題後等待了約兩週,但支援團隊的回應態度消極(甚至被要求「離開」),最終促使他決定公開披露。這種現象在資安界並不罕見——當廠商對研究人員的漏洞回報缺乏正向回應時,公開披露往往成為迫使廠商正視問題的最後手段。目前 NVIDIA 可能已在後續的驅動程式更新中(如 531.xx 或更新版本)加入防護措施,但使用者應保持驅動程式更新並關注 NVIDIA 官方安全公告。





大家正在看啥


收藏收藏 分享文章到FB上分享
回覆 使用道具 檢舉
複製專屬你的推廣連結:發至FB與各論壇宣傳:累積點數換GP商品 & 藍鑽
每五點閱率就可以兌換藍鑽積分或遊戲點卡 夢遊推廣文章換GP商品

你需要登入後才可以回覆 登入 | 加入會員

本版積分規則

Copyright (C) 2010-2020 夢遊電玩論壇

廣告合作:請直接聯繫我們,並附上您預刊登位置的預算。  

快速回覆 返回頂端 返回清單