Этот репозиторий содержит части исходного кода клапана анти-Chat для систем Windows, воссозданных из машинного кода.
Клапан Анти-Chat (VAC)-это неинвазивная анти-Chat-система пользователя, разработанная клапаном. Он доставляется в форме модулей (DLL), потокового с удаленного сервера. steamservice.dll загружен в SteamService.exe (или Steam.exe если запустить, как администратор, готовит и запускает анти-Chat модули. Инфраструктура VAC Client создается с использованием C++ (обозначенные многими функциями thiscall Convention, присутствующими в разборке), но этот репо содержит C -код для простоты. Антиколистые двоичные файлы в настоящее время 32-bit .
| ИДЕНТИФИКАТОР | Цель | .Text раздел необработанный размер | Исходная папка |
|---|---|---|---|
| 1 | Соберите информацию о конфигурации системы. Этот модуль загружается в первую очередь, а иногда еще до того, как будет запущена любая игра, защищенная от VAC. | 0x5c00 | Модули/Systeminfo |
| 2 | Перечислять процессы работы и ручки. Этот модуль загружается вскоре после запуска игры, но также неоднократно позже. | 0x4a00 | Модули/процесс -рук |
| 3 | Соберите данные VacProcessMonitor от FILMEPPOW, созданного steamservice.dll . Это первый модуль, который наблюдается, использующий virtual methods (polymorphism) . | 0x6600 | Модули/Processmonitor |
VAC использует несколько методов шифрования / хэширования:
NtQuerySystemInformation . Строки-xor-ed с ^ или > или & .Этот модуль загружается в первую очередь, а иногда еще до того, как будет запущена любая игра, защищенная от VAC.
В первом модуле вызывает функцию GetVersion для извлечения основной версии системы и строительства , например, 0x47BB0A00 - что означает:
18363 )10 ) Модульные вызовы GetNativeSystemInfo Функция и считывает поля из результирующей SYSTEM_INFO struct:
Затем он вызывает функцию API NtQuerySystemInformation с следующими значениями SystemInformationClass (для того, чтобы они появляются в коде):
SYSTEM_TIMEOFDAY_INFORMATION struct, VAC использует два поля:SYSTEM_CODEINTEGRITY_INFORMATION , модуль сохраняет поле CodeIntegrityOptionsSYSTEM_DEVICE_INFORMATION , модуль сохраняет поле NumberOfDisksSYSTEM_KERNEL_DEBUGGER_INFORMATION , VAC использует целую структуруSYSTEM_BOOT_ENVIRONMENT_INFORMATION , VAC Copies BootIdentifier GuideSYSTEM_RANGE_START_INFORMATION , которая просто void* . Anti-Chat Saves Saves Возвращенный адрес начала пространства ядра и бит знака этого адреса (чтобы проверить, есть ли исполняемый файл внутри, который работает VAC, связан с опцией LARGEADDRESSAWARE ) Для получения дополнительной информации о SYSTEM_INFORMATION_CLASS Enum см. Страницу Джеффа Чаппелла.
Далее, антишковые вызовы получают функцию GetProcessImageFileNameA , чтобы получить путь текущего исполняемого файла и считывает последние 36 символов (например Program Files (x86)SteamSteam.exe ).
Позднее VAC Retieves System Directory (например C:WINDOWSsystem32 ) с использованием GetSystemDirectoryW , преобразует его из широко -формула в мультибийную строку и сохраняет ее (максимальная длина многобитной строки - 200). FileId папки Anti-Cheat запросов (используя GetFileInformationByHandleEx ) и серийный номер тома ( GetVolumeInformationByHandleW ). Кроме того, он делает то же самое с Windows Directory , полученным от GetWindowsDirectoryW API.
Модуль считывает файл NtDll.dll из системного каталога и выполняет некоторую обработку на нем (пока не обращена вспять).
VAC сохраняет ручки (базовые адреса) импортированных системных DLL (максимум 16, этот модуль VAC загружает 12 DLL) и указатели на функции WinAPI (максимум 160, модуль использует 172 функции). Это сделано для обнаружения подключения таблицы адресов импорта на модуле против Chat, если адрес функции ниже, чем соответствующая база модуля , функция была подключена.
Anti-Cheat получает базу для самостоятельного модуля , выполняя бить и по адресу return ( _ReturnAddress() & 0xFFFF0000 ). Затем он собирает:
Затем он перечисляет объемы , используя API FindFirstVolumeW / FindNextVolumeW . Информация о томе 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 томов.
Если этот модуль был транслирован после того, как играла VAC-защищенная игра, он попытается получить ручку для игрового процесса (с помощью API OpenProcess ).
В конце концов, модульные шифрования данных (2048 байт), DWORD от dword xoring с ключом, полученным с сервера (например, 0x1d4855d3)
Быть раскрытым ...
Этот модуль кажется относительно new или был отключен в течение длительного времени. Впервые я увидел этот модуль в January 2020 . Он обладает способностью выполнять множество различных типов сканирования (в настоящее время 3 ). Дальнейшее сканирование зависит от результатов предыдущих.
Каждый тип сканирования реализует four methods базового класса.
Первоначально VAC Server инструктирует клиента выполнять scan #1 .
Функция первого сканирования пытается открыть Steam_{E9FD3C51-9B58-4DA0-962C-734882B19273}_Pid:%000008X . Картирование имеет следующую макет:
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 ();