Dieses Repository enthält Teile des Quellcode für Ventil-Anti-Cheat für Windows-Systeme, die aus dem Maschinencode nachgebildet wurden.
Ventil Anti-Cheat (VAC) ist ein nicht-invasives Anti-Cheat-System des Ventils. Es wird in Form von Modulen (DLLs) aus dem Remote -Server geliefert. steamservice.dll SteamService.exe Steam.exe Die Client VAC -Infrastruktur wird unter Verwendung von C++ (angezeigt durch viele in der Demontage vorhandene thiscall -Konventionsfunktionen) erstellt. Dieses Repo enthält jedoch C Codes für den Einfachheit halber. Anti-Cheat-Binärdateien sind derzeit 32-bit .
| AUSWEIS | Zweck | .Text -Abschnitt Rohgröße | Quellordner |
|---|---|---|---|
| 1 | Sammeln Sie Informationen zur Systemkonfiguration. Dieses Modul wird zuerst geladen und manchmal noch bevor ein vakuelles Spiel gestartet wird. | 0x5c00 | Module/SystemInfo |
| 2 | Aufzählende Laufprozesse und Griffe. Dieses Modul wird kurz nach dem Start des Spiels geladen, aber auch später wiederholt. | 0x4a00 | Module/Prozesshandlelist |
| 3 | Sammeln Sie VacProcessMonitor -Daten aus Filemapping, die von steamservice.dll erstellt wurden. Es ist das erste Modul, das virtual methods (polymorphism) verwendet. | 0x6600 | Module/Prozessmonitor |
VAC verwendet mehrere Verschlüsselungs- / Hashing -Methoden:
NtQuerySystemInformation . Saiten sind xor-ed mit ^ oder > oder & char.Dieses Modul wird zuerst geladen und manchmal noch bevor ein vakuelles Spiel gestartet wird.
Beim ersten Modul ruft GetVersion -Funktion auf, um Major- und Build -Systemversion EG 0x47BB0A00 abzurufen - was bedeutet:
18363 )10 ) Die Modulaufrufe GetNativeSystemInfo -Funktion und liest Felder aus dem resultierenden SYSTEM_INFO Struct:
Anschließend werden die API -Funktion NtQuerySystemInformation mit den folgenden SystemInformationClass -Werten (in der Reihenfolge im Code angezeigt) aufgerufen:
SYSTEM_TIMEOFDAY_INFORMATION Struct verwendet VAC zwei Felder:SYSTEM_CODEINTEGRITY_INFORMATION zurück, Modul speichert das Feld CodeIntegrityOptionsSYSTEM_DEVICE_INFORMATION zurück, Modul speichert das Feld NumberOfDisksSYSTEM_KERNEL_DEBUGGER_INFORMATION zurück, VAC verwendet ganze StrukturBootIdentifier Gibt SYSTEM_BOOT_ENVIRONMENT_INFORMATION zurückSYSTEM_RANGE_START_INFORMATION zurück, die nur void* . Anti-Cheat Saves Returned Kernel Space Start-Adresse und Zeichen dieser Adresse (um zu überprüfen, ob ausführbare Dateien in dem ausgelegt wird, dass VAC ausgeführt wird, ist mit der Option LARGEADDRESSAWARE verknüpft) Weitere Informationen zu SYSTEM_INFORMATION_CLASS Enum finden Sie in der Seite von Geoff Chappell.
Anschließend Anti-Cheat-Anrufe GetProcessImageFileNameA -Funktion, um den Pfad der aktuellen ausführbaren Datei abzurufen und die letzten 36 Zeichen liest (z. Program Files (x86)SteamSteam.exe ).
Der spätere VAC ruft den Systemverzeichnispfad (z. B. C:WINDOWSsystem32 ) mit GetSystemDirectoryW ab, konvertiert ihn von Wide -Charch in Multibyte -String und speichert sie (maximale Länge der Multibyte -String - 200). Anti-Cheat-Abfragen Ordner FileId (mit GetFileInformationByHandleEx ) und Volumen-Seriennummer ( GetVolumeInformationByHandleW ). Darüber hinaus hat es das gleiche mit Windows -Verzeichnis von GetWindowsDirectoryW -API.
Das Modul liest NtDll.dll -Datei aus dem Systemverzeichnis und verarbeitet es (noch nicht umgekehrt).
VAC spart Griffe (Basisadressen) von importierten System -DLLs (max 16, dieses VAC -Modul lädt 12 DLLs) und Zeiger auf WinAPI -Funktionen (max 160, Modul verwendet 172 Funktionen). Dies wird durchgeführt, um die Einfuhradressetabelle zu erkennen, die das Anti-Cheat-Modul angehängt hat . Wenn die Funktionsadresse niedriger als die entsprechende Modulbasis ist, wurde die Funktion angeregt.
Anti-Cheat erhält die Selbstmodulbasis , indem sie bitweise und unter Renditadresse ( _ReturnAddress() & 0xFFFF0000 ) durchführen. Dann sammelt es:
Als nächstes zählt es das Volumen mit FindFirstVolumeW / FindNextVolumeW -API auf. VAC -Abfragen Volumeninformationen, indem Sie GetVolumeInformationW , GetDriveTypeW und GetVolumePathNamesForVolumeNameW -Funktionen und Füllung nach Struktur mit gesammelten Daten aufrufen:
struct VolumeData {
UINT volumeGuidHash;
DWORD getVolumeInformationError;
DWORD fileSystemFlags;
DWORD volumeSerialNumber;
UINT volumeNameHash;
UINT fileSystemNameHash;
WORD driveType;
WORD volumePathNameLength;
DWORD volumePathNameHash;
}; // sizeof(VolumeData) == 32VAC sammelt Daten von max. 10 Bände.
Wenn dieses Modul nach Beginn des vakuellen Spiels gestreamt wurde, ist es angewiesen, den Spielprozess zu verwandeln (mit OpenProcess API).
Schließlich verschlüsselt Modul Daten (2048 Bytes), DWORD BY DWORD XORING mit Taste, die vom Server empfangen werden (z. B. 0x1D4855D3).
Offenbart werden ...
Dieses Modul scheint relativ new zu sein oder war für lange Zeit deaktiviert. Zum ersten Mal sah ich dieses Modul im January 2020 . Es hat die Fähigkeit, viele verschiedene Arten von Scans auszuführen (derzeit 3 ). Weitere Scans hängen von den Ergebnissen früherer ab.
Jeder Scan -Typ implementiert four methods einer Basisklasse.
Zunächst weist Vac Server den Client an, scan #1 durchzuführen.
Die ersten Scan-Funktionsangaben können Steam_{E9FD3C51-9B58-4DA0-962C-734882B19273}_Pid:%000008X Filemapping. Das Mapping hat das folgende Layout:
struct VacProcessMonitorMapping {
DWORD magic; // when initialized - 0x30004
PVOID vacProcessMonitor;
}; // sizeof(VacProcessMonitorMapping) == 8 VacProcessMonitorMapping::vacProcessMonitor ist ein Zeiger auf das VacProcessMonitor -Objekt (der 292 bytes beträgt).
VAC liest dann das gesamte VacProcessMonitor -Objekt (292 Bytes) und seine VMT (Virtual Method Table), die Zeiger auf 6 Methoden (24 Bytes) enthält. Die Grundadresse von steamservice.dll wird ebenfalls gesammelt.
Diese Daten werden wahrscheinlich auf VAC -Servern verwendet, um Hooking VacProcessMonitor zu erkennen. Das Verfahren kann folgen:
if (method_ptr & 0xFFFF0000 != steamservice_base)
hook_detected ();