Начинающий
- Статус
- Оффлайн
- Регистрация
- 15 Окт 2021
- Сообщения
- 210
- Реакции
- 26
LoliLand Reversing
Это новая часть реверса, старая есть тут
Ещё можете посмотреть
Это новая часть реверса, старая есть тут
Ещё можете посмотреть
Пожалуйста, авторизуйтесь для просмотра ссылки.
Содержание:
- 1. Введение
- 2. Структура проекта (папки)
- 3. Разбор лаунчера
- 3.1 Технический разбор (Jetty, Nuxt, JCEF)
- 3.1.2 Процесс запуска клиента
- 3.2 Шпионский модуль (OSHI, HWID, SystemData)
- 3.3 Локальная инфраструктура (API эндпоинты)
- 3.4 Реверс интерфейса (Eruda injection)
- 4. Разбор клиента
- 4.1 LoliMod (Ядро защиты и логики)
- 4.1.2 Логика античита
- 4.2 LoliHooks (Байт-код хуки)
- 4.3 MSW (Multi Server Worlds)
- 4.4 LoliDimensions (Миры, Пакеты)
- 5. Разбор инфраструктуры
- 5.1 Домены и API (ru/pro/io)
В этом репозитории будут результаты реверса LoliLand.
2. Структура проекта (папки)
%appdata%\.loliland- папка с данными проекта, там хранятся джарка лаунчера, папки с клиентами и рантаймом.loliland\game-resources\clients- папка с клиентами, там лежат моды, джарки клиентов (кастомные) и т.д.loliland\game-resources\runtimes- папка с рантаймами, там лежит оригинальная java-1.8.0_144.loliland\java\- джава которая используется лаунчером (JBR-17.0.11+1-1312.2-jcef).loliland\launcher-cef- папка с CEF (Chromium Embedded Framework), который используется лаунчером для отображения интерфейса.loliland\launcher-data- папка с настройками лаунчера.loliland\launcher-natives- папка с .dll файлами, щас есть только двеNvAPI_SettingsEditor_x64иNvAPI_SettingsEditor_x32, как я понял для настройки графы для слабых пк.loliland\launcher-logs- папка с логами.loliland\launcher.jar- сама джарка лаунчера
3. Разбор лаунчера
На удивление лаунчер использует CEF для отображения интерфейса (Nuxt), а не JavaFX как ранее
Это позволяет нам более легко реверсить интерфейс, так как он написан на HTML/CSS/JS
3.1. Разбор лаунчера (технический)
Лаунчер написан на Kotlin, использует CEF для отображения интерфейса.
Использует обфускацию, основные классы логики спрятаны в пакетах по типу
loliland.launcher.app.obf.Структура кода:
loliland.launcher.app.Main- мейн класс, инициализация JCEF и локального Jetty-сервера.loliland.launcher.app.data.SystemData- сборщик HWID.loliland.launcher.app.services.LaunchService- запуск клиента.
3.1.2. Процесс запуска клиента
За запуск отвечает
LaunchService. Основные этапы:- Подготовка рантайма:
- Лаунчер ищет
javaw.exeвruntime/binна Windows илиjavaна других платформах. - На Linux/macOS/других платформах он пытается сделать файл исполняемым через
setExecutable(true)при включенных флагахO1il1llOLANd()илиlil0liLand().
- Лаунчер ищет
- Настройка графики (GPU Force):
- Nvidia: через
NativeHandler.doEditNvidiaProfileсоздается профильLoliLand-game-javaдля исполняемогоjava. - DirectX: пишется запись в реестр
HKCU\Software\Microsoft\DirectX\UserGpuPreferencesс параметромGpuPreference=2;для пути к исполняемому файлу.
- Nvidia: через
- Сбор параметров запуска:
- Генерируется список JVM-параметров и аргументов запуска.
- Включаются данные клиента:
-Dloliland.client.uuid,-Dloliland.client.systemName,-Dloliland.client.displayName. - Включаются данные авторизации:
-Dloliland.auth.uuid,-Dloliland.auth.token, а также-Dloliland.tokenиз свойстваauth.password. - При необходимости добавляется
-Dloliland.auth.poolType=dg. - Если среда не
Environment.PROD, добавляется-Dloliland.dev=true. - Всегда устанавливается
-Dloliland.servers=127.0.0.1:25565. - При наличии
nativesвupdateVerifyпрописываются пути-Djava.library.path,-Dorg.lwjgl.librarypathи-Dnet.java.games.input.librarypath. - Добавляются флаги
-Djava.net.preferIPv4Stack=true,-XX:HeapDumpPath=...и, при необходимости, подмена ОС на Windows 10 (-Dos.name=Windows 10,-Dos.version=10.0). - Для macOS добавляются
-Xdock:name=...,-XstartOnFirstThreadи-Djava.awt.headless=true. - Память задается через
-Xmx<значение>mиз системного конфигуратора. - Игровой класс-путь строится рекурсивно из
ClientLaunchConfig.getClassPath(): файлы и папки обходятся, а для директорий используется шаблон*.
- Формирование аргументов игры:
- Используется шаблон
OfflinePlayer:<playerName>для генерации офлайн-UUID. - Аргументы из
ClientLaunchConfig.getGameArguments()разбиваются по пробелам и проходят подстановку:${auth_player_name}→ имя игрока.${auth_uuid}→ офлайн-UUID.${auth_session}→-.${gameDir}→ папка клиента.${assetsDir}→ папка ассетов.00000000-0000-0000-0000-000000000000заменяется на офлайн-UUID.
- Используется шаблон
- Запуск процесса:
- Создается
ProcessBuilderс рабочей директориейclientFolder. - Если лаунчер в режиме отображения логов/консоли, он перенаправляет поток ошибок в стандартный поток и оставляет себя живым, сохраняя ссылку на процесс.
- В противном случае стандартный вывод и ошибки отбрасываются, и лаунчер вызывает
System.exit(0)сразу после старта игры. - В любом случае процесс получает callback на
onExit(), который очищает ссылку на процесс и возвращает видимость лаунчера.
- Создается
- Завершение работы лаунчера:
- В статическом блоке класса добавлен shutdown-хук, который вызывает
terminateGame(), чтобы принудительно убить игровой процесс при выходе лаунчера.
- В статическом блоке класса добавлен shutdown-хук, который вызывает
3.2. Шпионский модуль
За сбор всей информации отвечает пакет
oshi и класс loliland.launcher.app.data.SystemData. Они знают больше, чем ты самЧто именно отсылается:- Материнка:
baseboardSerial(серийник - основной таргет для HWID банов), производитель и модель. - Проц:
processorId(уникальный степпинг), количество физических и логических ядер, частота. - ОЗУ: Общий объем +серийные номера каждой плашки.
- Видеокарты: Полный список активных ГПУ.
- Мониторы: Список всех подключенных дисплеев (модели, разрешения).
- Периферия: Серийники USB-устройств (флешки, мышки, клавы).
- Система:
hardwareUUID(GUID винды/биоса), разрядность, точная версия ОС.
Реализация:
- Библиотека: Юзают OSHI (Operating System and Hardware Information). Она обходит стандартные ограничения Java и лезет напрямую в WMI (
Win32_BaseBoard,Win32_Processor) и системный реестр. - HWID: Генерируется как
hashCode()от всей структурыSystemData. Любое изменение (высунул оперативку, поменял моник) меняет твой хэш, но серийник материнки остается константой для их базы банов.
Лаунчер поднимает локальный сервер для взаимодействия фронтенда с бэкендом:
- Порт 14463: Основной прокси. Перенаправляет запросы с префиксом
/apiv2/наlauncher-dg.loliland.pro - Порт 12450: Системное API лаунчера. Используется для управления клиентом и получения дэбаг информации
| Эндпоинт | Метод | Описание |
|---|---|---|
/api-system/storage/auth.access_token | GET | Токен текущей сессии |
/api-system/storage/auth.access_id | GET | ID текущей сессии. |
/api-launcher/bootstrap | GET | Полная конфигурация проекта, права пользователя и список серверов. |
/api-launcher/bootstrap/retry | GET | Расширенный конфиг: роли, время в игре, настройки темы. |
/api-system/launch | POST | Команда на запуск игрового клиента (передает UUID сборки). |
/api-launcher/last-client | GET | Информация о последнем запущенном сервере. |
Реверс-инженеринг интерфейса:
Инъекция DevTools (Eruda):
Так как лаунчер использует JCEF, мы можем внедрить Eruda напрямую в
launcher.jar.- Распаковать
launcher.jar. - В файле
loliland/application/public/index.htmlв тег<head>вставить:
Код:
<script src="https://cdn.jsdelivr.net/npm/eruda"></script>
<script>
eruda.init();
</script>
- После этого в углу лаунчер появится иконка для открытия консоли, инспектора сети и ресурсов.
Иерархия ролей:
| Системное имя | Отображаемое имя | Уровень (Level) |
|---|---|---|
god | Founder | 1000.0 |
chief_curator | Project Curator | 203.0 |
developer | Developer | 202.0 |
art_director | Art Director | 201.0 |
admin | Admin | 107.0 |
legendary | Legend | 60.0 |
ultra | Ultra | 50.0 |
default | Player | 10.0 |
4. Разбор клиента
В целом клиент оригинальный, но есть некоторые изменения в загрузке модов, они валидируются по хэшу
Эта логика уже была раньше, можете почитать про неё в старом реверсе тут
Каждый мод содержит файл
META-INF\mc_class_data_hash.bin с HEX байтами (SHA-256), для декодирования используется библиотека com.google.common.hash, и метод HashCode.fromBytes(byte[])При загрузки клиента, лаунчер проверяет все моды, и если хэш не совпадает, то выдаёт ошибку, и не запускает клиент
4.1. Разбор LoliMod (сердце всех клиентов)
LoliMod - есть в каждом клиенте, там находиться ВСЯ логика проекта, магазин, загрузки модов, валидации, проверки, "античит" и т.д
На данный момент, античит и скриншоты экрана были убраны.
Интересные факты:
- Гейб в коде: В моде захардкожена ссылка на видео
(Gabe Newell - This isn't working), походу это пасхалка при ошибках. - CubixWorld: В коде (например, в
lO01liI0LAnD.java) до сих пор висят ссылки наПожалуйста, авторизуйтесь для просмотра ссылки.(noad). Похоже, проекты либо имеют общие корни, либо просто спастили часть системы банов. - Скрытый бэкенд: Помимо публичных доменов, используется Пожалуйста, авторизуйтесь для просмотра ссылки.для внутренних нужд
4.1.2. Логика античита
Технический разбор системы защиты, которая глубоко интегрирована в
LoliMod и LoliHooks.1. Hardware ID (HWID) Fingerprinting
- Сбор данных: Происходит в
XForge.onConstructionпри запуске клиента. - Что собирают:
- CPU: Имя, ID, количество ядер, частота.
- Материнка: Производитель, модель, серийный номер.
- GPU: Список всех адаптеров, их названия и объем видеопамяти.
- RAM: Общий объем и серийные номера каждой плашки.
- Система: Hardware UUID, точная версия ОС, список мониторов.
- Передача: HWID сериализуется в JSON и вшивается в пакет авторизации
C00PacketLoginStartчерез ASM-хук вHooksClient. Сервер получает твой "цифровой отпечаток" еще до того, как ты заспавнился.
- Ядро: Класс
iI11I1lllaNd(на базе JNA). - Привилегии: Пытается получить
SeDebugPrivilege, чтобы иметь возможность читать память и пути к EXE-файлам любых процессов в системе. - Сканирование:
- Использует
WTSEnumerateProcessesExиCreateToolhelp32Snapshot. - Для каждого процесса собирает: полный путь к файлу, имя пользователя (владельца), и аргументы командной строки (через WMI).
- Это позволяет детектить читы, даже если они переименованы (например,
cheat.exe->chrome.exe).
- Использует
- Службы: Проверяет список запущенных системных служб Windows на наличие подозрительных драйверов.
3. Мониторинг процессов (Linux)
- Метод: Класс
lliOlOLanD. - Сканер
/proc: Анализирует дерево процессов в Linux. - LSOF: Использует команду
lsof -nlдля получения списка всех открытых файлов в системе. Это помогает найти скрытые модули читов, которые подгружаются в память.
5. Сетевой уровень и Телеметрия
- Канал
ModFix: Кастомный канал Forge для скрытой передачи данных античита. - Краш-репорты: Хук в
HooksClientавтоматически перехватывает любой вылет игры и мгновенно отправляет отчет (с ником и состоянием системы) наapi.loliland.pro. - Хэширование: Класс
IIilILAnDсчитает SHA-1 хэши файлов. Сервер может прислать команду на проверку хэша конкретного файла в папке с игрой.
4.2. Разбор LoliHooks
LoliHooks (
loliland.forge.hookslib) - это мод который используется для изменения кода игры "на лету" через ASM.Он позволяет изменять байт-код классов игры, добавлять свои методы, менять логику и т.д
4.3. Разбор MSW (Multi Server Worlds)
MSW (Multi Server Worlds) - это мод, который связывает клиентское меню, реальные миры и серверную синхронизацию.
- основной мод
net.loliland.msw.MultiServerWorldsстартует вpreInit, загружает конфиг и подключаетRealms - на сервере MSW инициализирует web-сервис, сетевые хендлеры и sync/хранилище
- на клиенте MSW хукает GUI и заменяет главное меню/паузу/экран отключения своей гуишкой
- мод регистрирует лобби-измерение
WorldProviderLobbyна ID 5 черезWorldUtils - у MSW есть свой сетевой слой (
SimpleNetwork) и системыServersSync/ServersStorage
Интересные факты:
- MSW имеет в себе ассеты музыки для главного меню, и используются при отображении главного меню игры, вот их список:
LoliWorlds - Lost in Stasis [Menu Song]LoliWorlds - Sapphire Woods[Moon Forest]LoliWorlds - Bluish [Moon plains]LoliWorlds - I Will Find You Again [Amber Forest]
- Название файла мода имеет в себе git бренч и коммит, например:
msw-main-606d1a78.jar
4.4. Разбор LoliDimensions - глобальный мод, отвечающий за новые миры, измерения и механику боссов.
Технические особенности:
- Генерация: Полностью переработанные Край и Ад (
net.loliland.lolidimensions.newendиnewhell) с использованием кастомных биомов и структур. - Сетевой слой: Использует собственную систему пакетов в
net.loliland.lolidimensions.packets. Переписана синхронизация позиций игроков (UpdateOtherPlayerPositionPacket) для плавности отображения кастомных анимаций. - Визуал: Своя система анимаций на JSON (
net.loliland.lolidimensions.animation) и множество уникальных мобов со сложным ИИ.
5.1 Разбор доменов
Сервера (.ru):
| домен | описание |
|---|---|
| api.loliland.ru | Главная API |
| devlauncher.loliland.ru | Девелоперская версия API лаунчера |
| klauncher.loliland.ru | ???, как я понял это партнёрка |
| launcher-s1.loliland.ru | S3 хранилище для лаунчера, через него админы заливают файлы |
| launcher.loliland.ru | Ассеты для лаунчера, библиотеки |
| loliland.ru | Основной сайт |
| s-holly.loliland.ru | ???, сервер от хостинга "Selectel" |
| static.loliland.ru | Статика, картинки, скрипты и т.д |
| status.loliland.ru | Статус серверов, Web, API и Launcher API |
Сервера (.pro / .io):
| домен | описание |
|---|---|
| api.loliland.pro | Основная API |
| core.loliland.io | Внутреннее API ядра (Hidden) |
| devlauncher.loliland.pro | Девелоперская API |
| klauncher.loliland.pro | Партнерка |
| launcher-cf.loliland.pro | Лаунчер через CF |
| launcher-dg.loliland.pro | Защита от DDoS (DDOS-GUARD) |
| launcher-msk-1.loliland.pro | Московский узел (TimeWeb) |
| launcher-new.loliland.pro | Новый API лаунчера |
| launcher-s1.loliland.pro | S3 хранилище (Selectel) |
| launcher-spb-1.loliland.pro | Питерский узел (TimeWeb) |
| launcher.loliland.pro | Основной лаунчер |
| loliland.pro | Основной домен |
| static.loliland.pro | Статика |
Пожалуйста, авторизуйтесь для просмотра ссылки.
| Прокси сайта |
Сервера (.net):
| домен | описание |
|---|---|
| loliland.net | Основной домен |
| email.loliland.net | ???, HTTP, IP: 34.111.99.212 |
| discord.loliland.net | Discord перенаправление |
| vk.loliland.net | VK перенаправление |
| tg.loliland.net | Telegram перенаправление |
Пожалуйста, авторизуйтесь для просмотра ссылки.
| Веб-сайт |
| static.loliland.net | Статика |
| status.loliland.net | Статус сервисов |
Последнее редактирование: