Este repositório contém partes do código-fonte da válvula anti-travessa para sistemas Windows recriados a partir do código da máquina.
Valve Anti-Cheat (VAC) é o sistema anti-truque não invasivo do modo de usuário desenvolvido pela Valve. É entregue na forma de módulos (DLLs) transmitidos pelo servidor remoto. steamservice.dll carregado no SteamService.exe (ou Steam.exe se executado como admin) prepara e executa módulos anti-travessuras. A infraestrutura do VAC do cliente é construída usando C++ (indicado por muitas funções de convenção thiscall presentes na desmontagem), mas esse repo contém código C por simplicidade. Atualmente, os binários anti-travessuras são 32-bit .
| EU IA | Propósito | .Text seção tamanho bruto | Pasta de origem |
|---|---|---|---|
| 1 | Colete informações sobre a configuração do sistema. Este módulo é carregado primeiro e às vezes mesmo antes de qualquer jogo com segurança do VAC ser lançado. | 0x5c00 | Módulos/SystemInfo |
| 2 | Enumere processos e alças de execução. Este módulo é carregado logo após o lançamento do jogo, mas também repetidamente mais tarde. | 0x4a00 | Módulos/ProcessHandleList |
| 3 | Colete os dados VacProcessMonitor do Filemapping criado pelo steamservice.dll . É o primeiro módulo observado a usar virtual methods (polymorphism) . | 0x6600 | Módulos/Processmonitor |
O VAC usa vários métodos de criptografia / hash:
NtQuerySystemInformation . As cordas são xor-ed com ^ ou > ou & char.Este módulo é carregado primeiro e às vezes mesmo antes de qualquer jogo com segurança do VAC ser lançado.
No primeiro módulo, invoca a função GetVersion para recuperar e criar a versão do sistema, por exemplo, 0x47BB0A00 - o que significa:
18363 )10 ) O módulo chama a função GetNativeSystemInfo e lê campos de SYSTEM_INFO Struct:
Em seguida, ele chama NtQuerySystemInformation API Função com os seguintes valores SystemInformationClass (para que eles apareçam no código):
SYSTEM_TIMEOFDAY_INFORMATION STRICT, VAC usa dois campos:SYSTEM_CODEINTEGRITY_INFORMATION , o módulo salva o campo CodeIntegrityOptionsSYSTEM_DEVICE_INFORMATION , o módulo salva o campo NumberOfDisksSYSTEM_KERNEL_DEBUGGER_INFORMATION , VAC usa toda a estruturaSYSTEM_BOOT_ENVIRONMENT_INFORMATION , VAC Cópias BootIdentifier Guid GuidSYSTEM_RANGE_START_INFORMATION que é apenas void* . Anti-Cheat Saves Retorned Kernel Space Start Endereço e Bit Sign desse endereço (para verificar se o executável dentro de qual VAC está em execução está vinculado à opção LARGEADDRESSAWARE ) Para obter mais informações sobre SYSTEM_INFORMATION_CLASS Enum, consulte a página de Geoff Chappell.
Em seguida, a função Anti-Cheat chama GetProcessImageFileNameA para recuperar o caminho do executável atual e lê os últimos 36 caracteres (por exemplo Program Files (x86)SteamSteam.exe ).
Posteriormente, o VAC recupera o caminho do diretório do sistema (por exemplo, C:WINDOWSsystem32 ) usando GetSystemDirectoryW , converte -o de amplo -Char em String Multibyte e a armazena (comprimento máximo da string multibyte - 200). FileId da pasta FileId de consultas anti-travessuras (usando GetFileInformationByHandleEx ) e o número de série do volume ( GetVolumeInformationByHandleW ). Além disso, faz o mesmo com o Diretório do Windows obtido da API GetWindowsDirectoryW .
O módulo lê o arquivo NtDll.dll do diretório do sistema e faz algum processamento nele (ainda não revertido).
O VAC salva alças (endereços básicos) das DLLs do sistema importado (máximo 16, este módulo VAC carrega 12 DLLs) e ponteiros para as funções WinAPI (Max 160, o módulo usa 172 funções). Isso é feito para detectar a tabela de tabela de endereço de importação no módulo anti-travessa, se o endereço da função for menor que o módulo correspondente, a função foi ligada.
A anti-travessa obtém a base do auto-módulo , executando bit e no endereço de retorno ( _ReturnAddress() & 0xFFFF0000 ). Então ele coleta:
Em seguida, enumera os volumes usando a API FindFirstVolumeW / FindNextVolumeW . Informações sobre o volume de consultas do VAC ligando GetVolumeInformationW , GetDriveTypeW e GetVolumePathNamesForVolumeNameW funções e preenchem a estrutura seguinte com dados coletados:
struct VolumeData {
UINT volumeGuidHash;
DWORD getVolumeInformationError;
DWORD fileSystemFlags;
DWORD volumeSerialNumber;
UINT volumeNameHash;
UINT fileSystemNameHash;
WORD driveType;
WORD volumePathNameLength;
DWORD volumePathNameHash;
}; // sizeof(VolumeData) == 32O VAC reúne dados de máx. 10 volumes.
Se esse módulo foi transmitido após o início do jogo com segurança do VAC, ele tentará o processo de altura do jogo (usando a API OpenProcess ).
Eventualmente, o módulo criptografa dados (2048 bytes), dword by dword xoring com a chave recebida do servidor (por exemplo, 0x1d4855d3)
Ser divulgado ...
Este módulo parece ser relativamente new ou foi desativado por um longo tempo. Primeira vez que vi este módulo em January 2020 . Ele tem a capacidade de executar muitos tipos diferentes de varreduras (atualmente 3 ). Outras varreduras dependem dos resultados dos anteriores.
Cada tipo de varredura implementa four methods de uma classe base.
Inicialmente, o VAC Server instrui o cliente a executar scan #1 .
A função da primeira varredura tenta abrir Steam_{E9FD3C51-9B58-4DA0-962C-734882B19273}_Pid:%000008X Filemapping. O mapeamento tem o seguinte layout:
struct VacProcessMonitorMapping {
DWORD magic; // when initialized - 0x30004
PVOID vacProcessMonitor;
}; // sizeof(VacProcessMonitorMapping) == 8 VacProcessMonitorMapping::vacProcessMonitor é um ponteiro para o objeto VacProcessMonitor (cujo tamanho é 292 bytes ).
O VAC então lê todo o objeto VacProcessMonitor (292 bytes) e sua VMT (tabela de método virtual) contendo ponteiros a 6 métodos (24 bytes). O endereço base do steamservice.dll também está reunido.
Esses dados provavelmente são usados em servidores VAC para detectar VacProcessMonitor de conexões. O procedimento pode estar seguindo:
if (method_ptr & 0xFFFF0000 != steamservice_base)
hook_detected ();