Архитектура античита Sentinel: сканирование памяти JVM и защита от инъекций
1. Модель угроз в соревновательном Minecraft
В отличие от игр на движках Source или Unreal, архитектура Minecraft на базе Java Virtual Machine имеет специфические векторы атак. Злоумышленники используют инъекции динамических библиотек (DLL) через CreateRemoteThread или SetWindowsHookEx, после чего через механизм Java Native Interface (JNI) находят окружение JNIEnv* и патчат таблицы виртуальных методов LWJGL либо классы сетевых пакетов net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.
Обычные серверные античиты (NoCheatPlus, Vulcan, Grim) видят только результат движения в сетевых пакетах и часто допускают ложные срабатывания (False Positives) при высоком пинге. Sentinel решает задачу непосредственно в момент генерации события на клиенте.
2. Мониторинг VMM и страниц виртуальной памяти
Встроенный агент Sentinel запускается параллельно с процессом Java. Через системные вызовы операционной системы сканер регулярно обходит виртуальное адресное пространство процесса, отслеживая появление страниц с правами PAGE_EXECUTE_READWRITE (RWX), которые не принадлежат JIT-компилятору JVM (HotSpot CodeCache).
#include <windows.h>
#include <vector>
#include <iostream>
struct SuspiciousRegion {
void* base_address;
size_t region_size;
DWORD protect_flags;
};
std::vector<SuspiciousRegion> ScanJvmMemoryIntegrity(HANDLE hProcess, uintptr_t jvmJitBase, size_t jvmJitSize) {
std::vector<SuspiciousRegion> anomalies;
unsigned char* addr = nullptr;
MEMORY_BASIC_INFORMATION mbi;
while (VirtualQueryEx(hProcess, addr, &mbi, sizeof(mbi))) {
// Выявляем исполняемые регионы с правами записи вне официального CodeCache HotSpot
if (mbi.State == MEM_COMMIT &&
(mbi.Protect == PAGE_EXECUTE_READWRITE || mbi.Protect == PAGE_EXECUTE_WRITECOPY)) {
uintptr_t current = reinterpret_cast<uintptr_t>(mbi.BaseAddress);
bool isJitCache = (current >= jvmJitBase && current < (jvmJitBase + jvmJitSize));
if (!isJitCache) {
anomalies.push_back({mbi.BaseAddress, mbi.RegionSize, mbi.Protect});
}
}
addr = static_cast<unsigned char*>(mbi.BaseAddress) + mbi.RegionSize;
}
return anomalies;
}
3. Аудит загрузчиков байткода через JVM TI
Для противодействия чит-модам, внедряемым на уровне Java-агентов (-javaagent), лаунчер MCX инжектирует проверенный нативный агент JVM Tool Interface (JVM TI). Агент регистрирует обратный вызов ClassFileLoadHook.
Перед передачей байткода любого класса в рантайм вычисляется его контрольная сумма SHA-256 и сверяется с подписанным манифестом сборок Fabric. Если мод пытается пропатчить поля дистанции атаки (Reach) или подменить углы обзора, процесс мгновенно завершается с кодом нарушения SEC_INTEGRITY_TAMPER_DETECTED.
4. Анализ энтропии CPS и физики кликов
Программные автокликеры и аппаратные макросы мышей (Bloody, Razer Synapse) пытаются маскировать нажатия псевдослучайными задержками (Random Jitter). Однако закон распределения интервалов между нажатиями у человека подчиняется распределению Гаусса с характерным затуханием мышечной реакции.
Sentinel фиксирует временные метки событий ввода с точностью до микросекунд через Raw Input API. Расчет энтропии Шеннона и коэффициента вариации позволяет со 100% точностью отличить живой клик (бабочка, джиттер) от программного генератора кликов уже на 40-м нажатии без единого ложного бана.
5. Итоги и защита официальных турниров
Благодаря многоуровневой защите Sentinel турниры Minecrafter-X Championship проходят с максимальным уровнем доверия. За весь 2025 год система предотвратила более 14 000 попыток запуска читерского софта, обеспечив честные условия для профессиональных PvP-команд.