Ce référentiel contient des parties du code source d'anti-triche de vanne pour les systèmes Windows recréés à partir du code machine.
Valve Anti-Cheat (VAC) est un système anti-triche non invasif en mode utilisateur développé par valve. Il est livré sous forme de modules (DLL) diffusés à partir du serveur distant. steamservice.dll chargé dans SteamService.exe (ou Steam.exe si l'exécution en tant qu'administrateur) prépare et exécute des modules anti-triche. L'infrastructure Client VAC est construite à l'aide de C++ (indiqué par de nombreuses fonctions de convention thiscall présentes dans le démontage), mais ce repo contient du code C pour la simplicité. Les binaires anti-triche sont actuellement 32-bit .
| IDENTIFIANT | But | . | Dossier source |
|---|---|---|---|
| 1 | Collectez des informations sur la configuration du système. Ce module est chargé en premier et parfois même avant le lancement d'un jeu sécurisé. | 0x5c00 | Modules / systeminfo |
| 2 | Énumérer les processus de fonctionnement et les poignées. Ce module est chargé peu de temps après le lancement du jeu, mais également à plusieurs reprises plus tard. | 0x4a00 | Modules / processhandlelist |
| 3 | Collectez les données VacProcessMonitor à partir de fichiers de fichiers créés par steamservice.dll . C'est le premier module observé pour utiliser virtual methods (polymorphism) . | 0x6600 | Modules / processMonitor |
VAC utilise plusieurs méthodes de chiffrement / hachage:
NtQuerySystemInformation . Les cordes sont xor-ed avec ^ ou > ou & char.Ce module est chargé en premier et parfois même avant le lancement d'un jeu sécurisé.
Au premier module, invoque la fonction GetVersion pour récupérer la version du système majeur et de construction, par exemple 0x47BB0A00 - ce qui signifie:
18363 )10 ) Le module appelle GetNativeSystemInfo Fonction et lit les champs à partir de SYSTEM_INFO Struct: résultant:
Ensuite, il appelle la fonction API NtQuerySystemInformation avec les valeurs SystemInformationClass suivantes (afin qu'elles apparaissent dans le code):
SYSTEM_TIMEOFDAY_INFORMATION sans papiers, Vac utilise deux champs:SYSTEM_CODEINTEGRITY_INFORMATION , le module enregistre le champ CodeIntegrityOptionsSYSTEM_DEVICE_INFORMATION , le module enregistre le champ NumberOfDisksSYSTEM_KERNEL_DEBUGGER_INFORMATION , Vac utilise une structure entièreSYSTEM_BOOT_ENVIRONMENT_INFORMATION , VAC Copies BootIdentifier GuidSYSTEM_RANGE_START_INFORMATION qui est juste void* . Anti-Cheat enregistre l'adresse de démarrage de l'espace du noyau renvoyé et signer un bit de cette adresse (pour vérifier si l'exécutable à l'intérieur duquel VAC est en cours d'exécution est lié à l'option LARGEADDRESSAWARE ) Pour plus d'informations sur SYSTEM_INFORMATION_CLASS Enum, voir la page de Geoff Chappell.
Ensuite, les appels anti-cheeat GetProcessImageFileNameA pour récupérer le chemin d'accès à l'exécutable actuel et lit 36 derniers caractères (par exemple Program Files (x86)SteamSteam.exe ).
Plus tard, VAC récupère le chemin du répertoire système (par exemple C:WINDOWSsystem32 ) à l'aide de GetSystemDirectoryW , le convertit de la chaîne large à la chaîne multi -yte et la stocke (longueur maximale de la chaîne multi -yte - 200). Le dossier des requêtes anti-modique FileID (en utilisant GetFileInformationByHandleEx ) et le numéro de série de volume ( GetVolumeInformationByHandleW ). De plus, il fait de même avec le répertoire Windows obtenu de l'API GetWindowsDirectoryW .
Le module lit le fichier NtDll.dll à partir du répertoire système et y fait un traitement (non inversé).
VAC enregistre les poignées (adresses de base) des DLL système importées (max 16, ce module VAC charge 12 DLL) et les pointeurs vers les fonctions WinAPI (Max 160, le module utilise 172 fonctions). Ceci est fait pour détecter le raccordement de la table d'adresse d'importation sur le module anti-triche, si l'adresse de fonction est inférieure à la base de module correspondante, la fonction a été accrochée.
Anti-Cheat obtient une base d'auto-module en effectuant un bit et sur l'adresse de retour ( _ReturnAddress() & 0xFFFF0000 ). Ensuite, il recueille:
Ensuite, il énumère les volumes à l'aide de l'API FindFirstVolumeW / FindNextVolumeW . VAC Informations sur le volume des questions en appelant GetVolumeInformationW , GetDriveTypeW et GetVolumePathNamesForVolumeNameW fonctions et remplit la structure suivante avec des données collectées:
struct VolumeData {
UINT volumeGuidHash;
DWORD getVolumeInformationError;
DWORD fileSystemFlags;
DWORD volumeSerialNumber;
UINT volumeNameHash;
UINT fileSystemNameHash;
WORD driveType;
WORD volumePathNameLength;
DWORD volumePathNameHash;
}; // sizeof(VolumeData) == 32VAC rassemble les données de Max. 10 volumes.
Si ce module a été diffusé après le début du jeu VAC, il s'atteint pour gérer le processus de jeu (à l'aide de l'API OpenProcess ).
Finalement, le module crypte les données (2048 octets), DWORD par DWORD XOING avec la clé reçue du serveur (par exemple 0x1d4855d3)
À divulguer ...
Ce module semble être relativement new ou a été désactivé pendant longtemps. La première fois, j'ai vu ce module en January 2020 . Il a la capacité d'effectuer de nombreux types de numérisations différents (actuellement 3 ). D'autres analyses dépend des résultats des précédents.
Chaque type de scan met en œuvre four methods d'une classe de base.
Initialement, le serveur Vac demande au client d'effectuer scan #1 .
La première fonction de numérisation s'atteint pour ouvrir Steam_{E9FD3C51-9B58-4DA0-962C-734882B19273}_Pid:%000008X FileMapping. La cartographie a la disposition suivante:
struct VacProcessMonitorMapping {
DWORD magic; // when initialized - 0x30004
PVOID vacProcessMonitor;
}; // sizeof(VacProcessMonitorMapping) == 8 VacProcessMonitorMapping::vacProcessMonitor est un pointeur vers l'objet VacProcessMonitor objet (dont la taille est de 292 bytes ).
VAC lit ensuite l'ensemble de l'objet VacProcessMonitor (292 octets) et son VMT (Tableau de méthode virtuelle) contenant des pointeurs vers 6 méthodes (24 octets). L'adresse de base de steamservice.dll est également rassemblée.
Ces données sont probablement utilisées sur les serveurs VAC pour détecter VacProcessMonitor de Cormeau. La procédure peut être suivante:
if (method_ptr & 0xFFFF0000 != steamservice_base)
hook_detected ();