該存儲庫包含從機器代碼重新創建的Windows系統的Valve Anti-Cheat源代碼的一部分。
閥門反陳令(VAC)是閥門開發的用戶模式非侵入性反陳詞系統。它以從遠程服務器流的模塊(DLL)的形式傳遞。 steamservice.dll加載到SteamService.exe中(或Steam.exe作為管理員運行)準備並運行反欺騙模塊。客戶VAC基礎架構是使用C++構建的(由拆卸中存在的許多thiscall慣例功能表示),但是此回購包含C代碼,以簡單起見。抗芯片二進製文件目前為32-bit 。
| ID | 目的 | .TEXT部分原始尺寸 | 源文件夾 |
|---|---|---|---|
| 1 | 收集有關係統配置的信息。 該模塊首先加載,有時甚至在啟動任何VAC安全遊戲之前。 | 0x5c00 | 模塊/SystemInfo |
| 2 | 列舉運行過程和手柄。 該模塊在啟動遊戲後不久將加載,但後來又一再加載。 | 0x4a00 | 模塊/processHandlelist |
| 3 | 從steamservice.dll創建的FileMapping收集VacProcessMonitor數據。這是使用virtual methods (polymorphism)觀察到的第一個模塊。 | 0x6600 | 模塊/ProcessMonitor |
VAC使用多種加密 /哈希方法:
NtQuerySystemInformation 。字符串是帶有^或>或& char的XOR-ED。該模塊首先加載,有時甚至在啟動任何VAC安全遊戲之前。
首先,模塊調用GetVersion函數以檢索專業並構建系統版本,例如0x47BB0A00這意味著:
18363 )10 )模塊調用GetNativeSystemInfo函數,並從結果SYSTEM_INFO struct中讀取字段:
然後,它調用NtQuerySystemInformation API函數,並使用以下SystemInformationClass值(以代碼出現):
SYSTEM_TIMEOFDAY_INFORMATION struct,vac使用兩個字段:SYSTEM_CODEINTEGRITY_INFORMATION ,模塊保存CodeIntegrityOptions字段SYSTEM_DEVICE_INFORMATION ,模塊保存NumberOfDisks字段SYSTEM_KERNEL_DEBUGGER_INFORMATION ,vac使用整個結構SYSTEM_BOOT_ENVIRONMENT_INFORMATION ,vac副本BootIdentifier guidSYSTEM_RANGE_START_INFORMATION ,它只是void* 。反陳詞保存返回的內核空間啟動地址和該地址的簽名位(要檢查vac的可執行文件是否與LARGEADDRESSAWARE選項鍊接在一起)有關SYSTEM_INFORMATION_CLASS枚舉的更多信息,請參見Geoff Chappell的頁面。
接下來,反陳詞調用GetProcessImageFileNameA函數以檢索當前可執行文件的路徑,並讀取最後36個字符(例如Program Files (x86)SteamSteam.exe )。
後來VAC檢索系統目錄路徑(例如C:WINDOWSsystem32 )使用GetSystemDirectoryW ,將其從寬char轉換為多鍵字符串,然後存儲它(多鍵字符串的最大長度-200)。反陳述查詢文件夾文件ID(使用GetFileInformationByHandleEx )和音量序列號( GetVolumeInformationByHandleW )。此外,它與Windows Directory從GetWindowsDirectoryW API獲取相同的操作。
模塊從系統目錄讀取NtDll.dll文件,並在其上進行一些處理(尚未反轉)。
VAC將導入系統DLL(最大16,此VAC模塊加載12個DLL)的手柄(基本地址)和用於Winapi功能的指針(最大160,模塊使用172個功能)。這樣做是為了檢測反陳詞模塊上的導入地址表掛鉤,如果函數地址低於相應的模塊底座,則函數已被掛鉤。
反欺騙通過表演和返回地址( _ReturnAddress() & 0xFFFF0000 )獲得自我模塊基礎。然後它收集:
接下來,它使用FindFirstVolumeW / FindNextVolumeW API列舉了量。 VAC查詢量量信息通過調用GetVolumeInformationW , GetDriveTypeW和GetVolumePathNamesForVolumeNameW函數,並使用收集的數據填充結構:
struct VolumeData {
UINT volumeGuidHash;
DWORD getVolumeInformationError;
DWORD fileSystemFlags;
DWORD volumeSerialNumber;
UINT volumeNameHash;
UINT fileSystemNameHash;
WORD driveType;
WORD volumePathNameLength;
DWORD volumePathNameHash;
}; // sizeof(VolumeData) == 32VAC收集最大數據。 10卷。
如果在VAT啟用遊戲開始後流式傳輸了此模塊,則它會在處理遊戲過程(使用OpenProcess API)上。
最終,模塊加密數據(2048個字節),dword by dword Xoring,使用從服務器接收到的密鑰(例如0x1D4855D3)
要披露...
該模塊似乎是相對較new或長時間禁用的。我第一次在January 2020看到這個模塊。它具有執行許多不同類型的掃描(當前3 )的能力。進一步的掃描取決於以前的掃描結果。
每種掃描類型都實現了基類的four methods 。
最初,VAC服務器指示客戶端執行scan #1 。
首先掃描功能attemps打開Steam_{E9FD3C51-9B58-4DA0-962C-734882B19273}_Pid:%000008X FileMapping。映射具有以下佈局:
struct VacProcessMonitorMapping {
DWORD magic; // when initialized - 0x30004
PVOID vacProcessMonitor;
}; // sizeof(VacProcessMonitorMapping) == 8 VacProcessMonitorMapping::vacProcessMonitor是指向VacProcessMonitor對象的指針(其大小為292 bytes )。
然後,VAC讀取整個VacProcessMonitor對象(292個字節)及其VMT(虛擬方法表),其中包含指針至6方法(24個字節)。還收集了steamservice.dll的基礎地址。
這些數據可能在VAC服務器上用於檢測掛接VacProcessMonitor 。該程序可能以下是以下內容:
if (method_ptr & 0xFFFF0000 != steamservice_base)
hook_detected ();