Начинающий
- Статус
- Оффлайн
- Регистрация
- 29 Мар 2026
- Сообщения
- 6
- Реакции
- 0
Здравствуйте, сегодня я хотел бы слить проект кряка нурсултан клиента - была проделана такая работа, как анализ нетворкинга, реверс лоадер(-ов) и иные манипуляции.
В архиве приложены: i64db(дб иды), спуфер запросов под нурик(абсолютно спокойно адаптируется под Celestial Client т.к один протект = один нетворкинг), клиентские сертификаты(позволяют слать неограниченные запросы на api/launcher в обход CF!!!), декриптор хвида(hwid в нурике шифруется AES ключами, которые я достал успешно из лоадера, это позволяет теоретически создать спуфер хвида под нур/целку), все файлы всех доступных на сервере версий(1.16.5, alpha 1.16.5, test 1.16.5, 1.21.8 старый сурс), webview лоадера.
Внимание!!! Данный проект - не является готовым решением!!! Вам необходимо продолжить работу над кряком самому!!!
Я бы хотел начать с описания нетворкинга Нурсултана, т.к именно из за уязвимостей в нем данный проект возымел право на жизнь. Анализ будет представлен в виде таблицы.
Это наиболее важные эндпоинты, по которым обращается сервер. Но вы не сможете по ним прямо обратиться - сервер валидирует все запросы на эндпоинты апишки лаунчера посредством проверки клиентского сертификата, если вы отправите запрос без него, сервер выдаст мнимое File not found.
Но так-же есть общение между Webview-лоадера и нативной частью лоадера. Она происходит посредством Вебсокетов - вся важная логика по типу загрузки версий авторизации и т.п происходит именно в нативной части лоадера. Давайте же перейдем к более глубокому анализу. В этой статье я буду анализировать только нативную часть лоадера, на webview заостряться не буду.
Я начну с как раз общения между webview и native. Как передается порт для соединения по вебсокету? Очень просто - нативка передает в вебвью базовые константы(порт, хвид и настройки типо мемори) т.е настраивает окружение.
Версия лаунчера захардкожена.
Все это происходит в одной единственной функции по адресу 0x0000000140166850(в i64 названа SetupEnv)
Здесь происходит и получение хвида и его крипт и передача всех данных в вебвью
Здесь мы видим - получение memory методом(GlobalMemoryStatusEx), получение хвида посредством GetHwid(к сожалению данная функция была виртуализирована)
Причем стоит подметить, что это не стандартная функция из SDK VMPROTECT, сдк собирает гораздо меньше данных о системе.
При ошибке получения HWID нативка убивает свой процесс(Хотя в вебвью есть заданный fallback при отсутствии HWID)
При получении HWID он шифруется AES, ключи и IV не защищены в целом
При ошибке шифрования хвида такое-же поведение, как при ошибке получения его(килл процесса)
Далее перейдем к анализу нетворкинга. Хотелось бы подметить, что я не заметил виртуализированных функций кроме получения хвида, энтрипоинта и tls_callback0
Сначала разберем загрузку файлов webview - она происходит в функции sub_14048E0A0(0x0000000140158730) в i64 подписана как DownloadWebFiles
Происходит все этим запросом - он отправляет запрос на URL_WEB_FILES(или же /storage/launcher/cache.json) и парсит данный json, и далее по нему качает все файлы(идет далее по коду)
Так-же отправляет запросы функция sub_140150260(0x0000000140150260) или же DownloadVersionFiles
В большинстве своем у данной функции такой-же принцип - парсит json объект и по данным в нем качает все необходимые файлы.
Так-же советую посмотреть, какие функции вызывают их(DownloadWebFIles и DownloadVersionFiles).
В большинстве своем более разбирать нечего, только подмечу, что заревершены curl функции, которые вы можете хукать при желании.
Разбирать кастомную jvm(те самые лаунчеры версий) я не буду т.к там в большинстве своем нечего анализировать, код слишком запутан для статического анализа. Скажу лишь только то, что сигнатуры функций curl частично обратно совместимы из лоадера(где они заревершены) и из лаунчеров, это понадобится вам для реверса. Так-же в лаунчерах в большинстве важных функций сломаны xrefs.
Теперь давайте перейдем к сетевым уязвимостям, посредством которых были выкачаны без сабки все версии, доступные на сервере. Спуфая запросы я заметил, что сервер нурсултана дает мне скачивать файлы альфы без авторизации в аккаунт(т.е без сабки без ничего), но я это заметил - поглядел, подумал и забил. Но вдруг в чате некотором кто-то заговорил о версии 1.21.8 для нурика. И у меня родилась идея забрутфорсить версии - ну и не долго думая я принялся за брутфорс. И через несколько версий я получил 1.21.8. Это был практически сурс - основная структура была полностью видна, но в итоге она была под криптой. Сам менеджер нурсултана подтвердил, что это реальный билд, но старый.
(Дай бог я не на ратке)
Основная уязвимость(критическая) - отсутствие авторизации на загрузке файлов версий.
Подведем итоги: была проделана большая работа, но в итоге она отдается энтузиастам с данного форума. Основной крякер: FREUDE, в кряке принимали участие так-же PasterEnd, но они более освещали его, чем работали над его разработкой. Анализ спуфера и декодера хвида оставляю на вас. Данный проект более не будет поддерживаться мной. Всем спасибо за внимание.
P.S На момент написания статьи был обновлен лаунчер(все равно дампится на раз-два/приложу позже) + пофикшена дыра в нетворкинге(загрузка файлов с сервера), похоже после такого было грех не подсуетиться аргентозу(осталось только отказаться от vmprotect и перейти на адекватную защиту)))).
В архиве приложены: i64db(дб иды), спуфер запросов под нурик(абсолютно спокойно адаптируется под Celestial Client т.к один протект = один нетворкинг), клиентские сертификаты(позволяют слать неограниченные запросы на api/launcher в обход CF!!!), декриптор хвида(hwid в нурике шифруется AES ключами, которые я достал успешно из лоадера, это позволяет теоретически создать спуфер хвида под нур/целку), все файлы всех доступных на сервере версий(1.16.5, alpha 1.16.5, test 1.16.5, 1.21.8 старый сурс), webview лоадера.
Внимание!!! Данный проект - не является готовым решением!!! Вам необходимо продолжить работу над кряком самому!!!
Я бы хотел начать с описания нетворкинга Нурсултана, т.к именно из за уязвимостей в нем данный проект возымел право на жизнь. Анализ будет представлен в виде таблицы.
Эндпоинт | Значение | Пояснение |
| /api/launcher/check-update | Проверка на обновление лаунчера. | Вызывается при каждом запуске. При ошибке(любой статус != 200) не пропускает далее в лаунчер, просит установить обновление. При успехе(200) продолжает работу. |
| /api/launcher/user | Получает информацию о пользователе. | Вызывается при каждом запуске. При успешном запросе авторизует сразу в лаунчер пропуская ввод логина и пароля(т.к авторизация происходит по JWT-токену). При ошибке просто перебрасывает на ввод логина и пароля. |
| /api/launcher/login | Авторизует пользователя. | Вызывается при вводе логина, пароля и нажатия кнопки "Войти" в главном меню. Передает в открытом виде логин и пароль, так-же в закрытом виде передает HWID. |
| /api/launcher/versions | Получает все версии(клиенты) доступные пользователю. | Вызывается при каждой авторизации(через /login или через /user) Передает json объект со всеми версиями и их объектами. |
| /api/launcher/start | Получает необходимые аргументы, иногда готовые команды(не было проанализировано полностью) для запуска клиента. | Вызывается при запуске клиента из меню(нажатия кнопки "Запустить" в карточке версии) |
| /api/launcher/init | Данный эндпоинт не был полностью проанализирован. Предположительно дает добро или отказ на запуск клиента(распространяется только на платные версии предположительно) | Вызывается из под кастомных лаунчеров для клиентов(файлы в папке версий с названиями версий т.е alpha 1.16.5.exe, test 1.16.5.exe, etc.) Стоит отметить, что данный запрос идет в обход прокси винды, т.е его нельзя словить обычными средствами(только через proxifier для перенаправления, либо через wireshark для анализа) |
Это наиболее важные эндпоинты, по которым обращается сервер. Но вы не сможете по ним прямо обратиться - сервер валидирует все запросы на эндпоинты апишки лаунчера посредством проверки клиентского сертификата, если вы отправите запрос без него, сервер выдаст мнимое File not found.
Но так-же есть общение между Webview-лоадера и нативной частью лоадера. Она происходит посредством Вебсокетов - вся важная логика по типу загрузки версий авторизации и т.п происходит именно в нативной части лоадера. Давайте же перейдем к более глубокому анализу. В этой статье я буду анализировать только нативную часть лоадера, на webview заостряться не буду.
Я начну с как раз общения между webview и native. Как передается порт для соединения по вебсокету? Очень просто - нативка передает в вебвью базовые константы(порт, хвид и настройки типо мемори) т.е настраивает окружение.
Версия лаунчера захардкожена.
Все это происходит в одной единственной функции по адресу 0x0000000140166850(в i64 названа SetupEnv)
Здесь происходит и получение хвида и его крипт и передача всех данных в вебвью
Здесь мы видим - получение memory методом(GlobalMemoryStatusEx), получение хвида посредством GetHwid(к сожалению данная функция была виртуализирована)
Причем стоит подметить, что это не стандартная функция из SDK VMPROTECT, сдк собирает гораздо меньше данных о системе.
При ошибке получения HWID нативка убивает свой процесс(Хотя в вебвью есть заданный fallback при отсутствии HWID)
При получении HWID он шифруется AES, ключи и IV не защищены в целом
При ошибке шифрования хвида такое-же поведение, как при ошибке получения его(килл процесса)
Далее перейдем к анализу нетворкинга. Хотелось бы подметить, что я не заметил виртуализированных функций кроме получения хвида, энтрипоинта и tls_callback0
Сначала разберем загрузку файлов webview - она происходит в функции sub_14048E0A0(0x0000000140158730) в i64 подписана как DownloadWebFiles
Происходит все этим запросом - он отправляет запрос на URL_WEB_FILES(или же /storage/launcher/cache.json) и парсит данный json, и далее по нему качает все файлы(идет далее по коду)
Так-же отправляет запросы функция sub_140150260(0x0000000140150260) или же DownloadVersionFiles
В большинстве своем у данной функции такой-же принцип - парсит json объект и по данным в нем качает все необходимые файлы.
Так-же советую посмотреть, какие функции вызывают их(DownloadWebFIles и DownloadVersionFiles).
В большинстве своем более разбирать нечего, только подмечу, что заревершены curl функции, которые вы можете хукать при желании.
Разбирать кастомную jvm(те самые лаунчеры версий) я не буду т.к там в большинстве своем нечего анализировать, код слишком запутан для статического анализа. Скажу лишь только то, что сигнатуры функций curl частично обратно совместимы из лоадера(где они заревершены) и из лаунчеров, это понадобится вам для реверса. Так-же в лаунчерах в большинстве важных функций сломаны xrefs.
Теперь давайте перейдем к сетевым уязвимостям, посредством которых были выкачаны без сабки все версии, доступные на сервере. Спуфая запросы я заметил, что сервер нурсултана дает мне скачивать файлы альфы без авторизации в аккаунт(т.е без сабки без ничего), но я это заметил - поглядел, подумал и забил. Но вдруг в чате некотором кто-то заговорил о версии 1.21.8 для нурика. И у меня родилась идея забрутфорсить версии - ну и не долго думая я принялся за брутфорс. И через несколько версий я получил 1.21.8. Это был практически сурс - основная структура была полностью видна, но в итоге она была под криптой. Сам менеджер нурсултана подтвердил, что это реальный билд, но старый.
(Дай бог я не на ратке)
Основная уязвимость(критическая) - отсутствие авторизации на загрузке файлов версий.
Подведем итоги: была проделана большая работа, но в итоге она отдается энтузиастам с данного форума. Основной крякер: FREUDE, в кряке принимали участие так-же PasterEnd, но они более освещали его, чем работали над его разработкой. Анализ спуфера и декодера хвида оставляю на вас. Данный проект более не будет поддерживаться мной. Всем спасибо за внимание.
P.S На момент написания статьи был обновлен лаунчер(все равно дампится на раз-два/приложу позже) + пофикшена дыра в нетворкинге(загрузка файлов с сервера), похоже после такого было грех не подсуетиться аргентозу(осталось только отказаться от vmprotect и перейти на адекватную защиту)))).
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.