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. Разрешены:
- сам Java executable;
- DLL внутри Windows System32;
- 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 принципиально находятся выше его доверительной границы. На
сервере всё равно нужны поведенческие проверки и валидация игрового протокола.