搜尋

Steam遊戲修改器

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

[電玩遊戲] 《Steam》VAC Emulator 反作弊模擬器 原始碼解析 IPC 協議逆向教學

[複製連結]
1
o122334234 ( Lv.70 熾天使 ) 發表於 昨天 15:24 | 只看該作者 回覆獎勵 |降序瀏覽 |閱讀模式


《Steam》VAC Emulator 核心主題 快速閱讀精華



🚀 技術亮點:
  • 通訊解密: 揭露 `steamclient.dll` 與 `SteamService.exe` 之間的 IPC 命名管道通訊機制。
  • 核心模擬: 完整分析 VAC 模組載入器 (Module Loader),包含 RSA 簽章驗證與 ICE 解密流程。
  • 原始碼公開: 提供完整的 C++ 逆向還原代碼,展示如何攔截與模擬 VAC 行為。


⚠️ 學習重點:
  • 開發者導向: 本文涉及大量 C++ 與逆向工程知識,適合想深入了解反作弊運作原理的讀者。
  • 安全性研究: 這是針對 VAC 協議的技術剖析 (PoC),主要用於學術研究與模擬,請勿用於非法用途。




工具簡介與核心概念



各位對遊戲安全與底層技術有興趣的朋友,大家好!大家在玩 Steam 遊戲時,一定都聽過令人聞風喪膽的 VAC (Valve Anti-Cheat)。但你是否好奇過,這個反作弊系統究竟是如何在後台運作的?它是怎麼跟 Steam 服務溝通的?

今天要分享的專案 **VAC Emulator**,就是一位資深開發者花費數年心血,逆向分析 Steam 的 IPC (行程間通訊) 協議後開發出的模擬器。簡單來說,所有的 VAC 運作都是透過 `steamclient.dll` 和 `SteamService.exe` 之間的「命名管道 (Named Pipe)」來傳輸指令。

這篇文章將帶大家像剝洋蔥一樣,一層層揭開 VAC 的通訊協定,從最外層的分發器 (Dispatcher) 到最核心的模組載入 (Module Loading),讓你徹底看懂它的運作邏輯。

IPC 分發架構解析



首先,我們需要知道 Steam 是如何處理大量的通訊請求。開發者在追蹤管道流量後,鎖定了一個主要的「分發函數」,在 IDA (逆向工具) 中將其命名為 `CServiceEngine_IPC_ParentDispatch`。

這段程式碼就像是公司的總機小姐,它會讀取請求的第一個字節 (Byte),判斷你要找哪個部門(介面),然後把電話轉接過去。

// 位於 0x10052680 的核心分發函數
char __thiscall CServiceEngine_IPC_ParentDispatch(char *this, _DWORD *buffer, int a3)
{
  _DWORD *v3; // esi
  char dispatchType; // bl
 
  v3 = buffer;
  dispatchType = ReadByte(buffer);       // 讀取第1個字節 = 介面類型 (Interface Type)
  ReadBytes(&buffer, 4u);                 // 跳過 4 個字節 (保留位)
 
  switch ( dispatchType )
  {
    case 1:
      IClientInstallUtils_IPC_Dispatch((this + 2496), v3, a3, 0);
      return 1;
    case 2:
      IClientModuleManager_IPC_Dispatch((this + 2776), v3, a3, 0);  // 這就是 VAC 的處理函數!
      return 1;
    case 3:
      IRegistryInterface_IPC_Dispatch(this + 3768, v3, a3, 0);
      return 1;
    // ... 其他介面省略
    default:
      Steam_Assert();
      __debugbreak();
      return 0;
  }
}


從上面的代碼我們可以發現,當 `dispatchType` 為 **2** 時,就會呼叫 `IClientModuleManager_IPC_Dispatch`,這正是負責 VAC 模組管理的關鍵入口。


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



VAC 模組管理器詳解



進入到 VAC 的專屬部門(Type 2 Handler)後,系統會檢查一個「Magic Value (魔術數字)」,這就像是通關密語,決定了接下來要執行什麼動作,例如載入模組、卸載模組或是呼叫函數。

這段位於 `0x100549e0` 的代碼非常精彩,它展示了 VAC 的指令路由:

// IClientModuleManager_IPC_Dispatch (VAC 分發器)
char __cdecl IClientModuleManager_IPC_Dispatch(int this, _DWORD *buffer, int *response, ...)
{
  ReadBytes(buffer, &magic, 4);           // 讀取 4 字節的魔術數字
 
  if ( magic == 0x24DF160F )              // 對應功能:LoadModule (載入模組)
  {
    sub_10049AF0("IClientModuleManager", "LoadModule"); // 除錯字串洩漏了函數名稱
    ReadBytes(buffer, &moduleHash, 4);    // 讀取模組的 CRC32 哈希值
    ReadBytes(buffer, &dataSize, 4);      // 讀取數據大小
    // ... 後續還有 ICE 金鑰等數據
 
    result = (*(*this))(this, moduleHash, data, dataSize);  // 執行 vtable[0]
  }
  else if ( magic == 0xD2CB05FD )         // 對應功能:UnloadModule (卸載模組)
  {
    sub_10049AF0("IClientModuleManager", "UnloadModule");
    result = (*(*this + 4))(this, moduleHash);
  }
  // ... 其他功能如 CallFunction, CallFunctionAsync 等
}


【小知識】魔術數字 (Magic Values):
開發者從這裡整理出了 VAC 的核心指令表,這些數值是與 VAC 溝通的鑰匙:
  • 0x24DF160F: 載入模組 (LoadModule)
  • 0xD2CB05FD: 卸載模組 (UnloadModule)
  • 0xFDD7BB75: 呼叫函數 (CallFunction)


模組載入與驗證流程



這是整個 VAC 最核心的部分:**如何安全地將反作弊模組載入到記憶體中?** 位於 `0x1005B290` 的函數 `CClientModuleManager_LoadAndValidateModule` 揭示了這個過程。

這個過程非常嚴謹,包含了 RSA 簽章驗證和記憶體載入技術:

// 核心模組載入與驗證函數
char __stdcall CClientModuleManager_LoadAndValidateModule(_DWORD *pModule, char flags)
{
  // 檢查是否已經載入過
  if ( pModule[3] ) return 1;
 
  // 驗證是否有模組數據
  if ( !pModule[6] || !pModule[5] ) {
    pModule[4] = 12; // 錯誤代碼:無數據
    return 0;
  }
 
  // ⚠️ 關鍵步驟:首先進行 RSA 簽章驗證!
  if ( Module_ValidateSignature(pModule[6], pModule[5]) )
  {
    CClientModuleManager_FreeModule(pModule);
    pModule[4] = 11; // 錯誤代碼:簽章無效 (ERR_INVALID_SIGNATURE)
    return 0;
  }
 
  // 分為兩種載入路徑
  if ( (flags & 2) != 0 )
  {
    // 路徑 A:標準 LoadLibrary (會產生暫存檔)
    Library = MemoryModule_LoadLibrary(pModule[6], 0, 1);
    // ...
  }
  else
  {
    // 路徑 B:內存載入 (Memory Loading),不落地,隱蔽性高
    if ( !MemoryModule_Init() ) return 0;
 
    // 解密 ICE 加密的模組
    sub_1007C020(pModule[6], pModule[5], pModule[5], 0);
 
    hModule = MemoryModule_LoadFromBuffer(&decrypted, 0);
    // ... 獲取 "_runfunc@20" 導出函數
  }
 
  return 1;
}


從這裡我們可以看到,VAC 模組在執行前,**必須先通過 RSA 驗證**。這也是為什麼我們無法隨意篡改 VAC 模組的原因。此外,它支援「內存載入」,這意味著 VAC 模組可以直接在記憶體中解密並執行,硬碟上找不到對應的 `.dll` 檔案,增加了分析難度。

專案原始碼下載 🔽



這裡提供了包含完整分析與實作代碼的 VAC Emulator。對於想要研究 Steam 通訊協議或遊戲安全防護機制的朋友來說,這是一份非常珍貴的資料。



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



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






VAC Emulator_常見問題Q&A



Q:這個模擬器可以讓我繞過 VAC 封鎖嗎?
不行。這是一個「模擬器」與「協議分析工具」,它的目的是幫助研究人員理解 VAC 是如何與 Steam 服務溝通的。它並不是一個可以直接用來作弊或解除封鎖的外掛程式。

Q:為什麼要逆向分析 IPC 協議?
因為 VAC 的運作主要依賴於 `steamclient.dll` 和 `SteamService.exe` 之間的溝通。透過逆向 IPC (行程間通訊),我們可以攔截、觀察甚至模擬這些封包,進而理解 VAC 什麼時候載入、檢查了什麼內容。

Q:代碼中的 RSA 驗證是做什麼的?
這是 VAC 的安全機制。當 Steam 下載反作弊模組時,為了防止模組被中間人篡改或被惡意軟體替換,它會使用 RSA 算法驗證模組的數位簽章。如果簽章不符,模組就不會被執行。

Q:什麼是 "_runfunc@20"?
這是 VAC 模組的進入點 (Entry Point) 函數名稱。所有的 VAC 模組都必須導出這個函數,Steam 服務透過呼叫這個函數來啟動反作弊檢查。`@20` 表示這個函數接受總共 20 字節的參數(stdcall 呼叫約定)。

Q:編譯這個專案需要什麼環境?
這是一個 C++ 專案,你需要安裝 Visual Studio 以及對應的 Windows SDK 才能成功編譯。建議具備一定的 C++ 與逆向工程基礎再進行嘗試。






大家正在看啥


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

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

本版積分規則

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

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

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