《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 官方安全公告。