Guardian — отдельный Windows user-mode supervisor. Electron не запускает javaw.exe напрямую: он формирует policy из уже проверенных manifests и передаёт её Guardian. Guardian повторно проверяет доверенные данные, создаёт Java-процесс в приостановленном состоянии, применяет Windows mitigations, помещает процесс в Job Object и только затем разрешает выполнение.

Запуск вручную

Аргументы policy хранят постоянные JVM/classpath параметры. Всё после -- добавляется только в память процесса. Launcher использует эту часть для username, UUID и access token.

Policy, создаваемая лаунчером

Общий root равен storage, а не каталогу одной сборки. Благодаря этому одна policy одновременно охватывает:
  • Java в storage/runtimes/{runtimeId};
  • JAR, mods и natives в storage/common/{profile.dir}.

Поля policy

Проверка пути и файла

Guardian принимает только относительные пути с /. Запрещены:
  • абсолютные пути и drive prefix;
  • ..;
  • обратные слеши;
  • символические ссылки/reparse chain;
  • дублирующиеся пути без учёта регистра.
Перед запуском javaw.exe проверяется по размеру и SHA-256. Protected files проверяются до старта и повторно во время работы игры. Manifest-файлы с типом configuration не входят в runtime-policy: Scanner восстанавливает их перед запуском, но моды могут штатно менять такие файлы во время инициализации.

Контроль DLL

Guardian перечисляет модули процесса через ToolHelp API. Разрешены:
  1. сам Java executable;
  2. DLL внутри Windows System32;
  3. DLL, явно перечисленные в allowedModules и совпавшие по hash.
Лаунчер строит allowedModules из .dll файлов client/runtime manifests. Неизвестная сторонняя DLL считается нарушением и завершает всё дерево игры. Во время старта Java список DLL быстро меняется, и Windows может временно вернуть ERROR_BAD_LENGTH или ERROR_PARTIAL_COPY. Guardian повторяет снимок внутри ограниченного окна и один раз отправляет guardianWarning. Успешный снимок сбрасывает счётчик; неизвестная DLL по-прежнему вызывает немедленное нарушение, а восемь последовательных нестабильных циклов завершают процесс.
Все штатные LWJGL/JVM natives должны входить в manifest. Иначе Guardian корректно воспримет их как неизвестный модуль и остановит Minecraft.

Защита JVM

Guardian удаляет из окружения:
При blockJavaAgents = true запрещены:
Guardian сам добавляет -XX:+DisableAttachMechanism. Custom Wraithbound authlib не является agent: она должна лежать в проверенном classpath сборки. Поэтому запрет instrumentation не мешает штатной авторизации Minecraft. Файлы только из update восстанавливаются перед запуском, но не входят в периодический protectedFiles: игра может штатно менять, например, servers.dat. Конфигурации из updateVerify также проверяются Scanner перед стартом, но исключаются из runtime-защиты по manifest kind configuration. JAR, библиотеки, natives, моды и весь Java runtime остаются защищёнными.

Job Object и остановка

Job Object создаётся с режимом kill-on-close. Если пользователь нажал «Остановить», Guardian завершился или Electron аварийно закрыл его handle, Windows завершает всё дерево Minecraft, включая дочерние процессы.

События stderr

Launcher переносит warning/violation/fatal в отдельную debug console без вывода access token.

Итог stdout

Exit codes Guardian

exitCode внутри итогового JSON — код самого процесса Minecraft.

Граница защиты

Guardian повышает стоимость user-mode DLL injection, подмены JAR/native и Attach API, но не является kernel anti-cheat. Администратор системы или kernel driver принципиально находятся выше его доверительной границы. На сервере всё равно нужны поведенческие проверки и валидация игрового протокола.