суббота, 1 марта 2014 г.

Anti-cheat crackme или обход NSEngine

Всем привет, с вами снова Жора Корнев и сегодня, специально для любителей гейм-хакинга и реверс инжиниринга мы расскажем о том, как можно снять небольшой клиентский античит с серверной стороной. Речь пойдёт о античите NSEngine Anti-cheat работающим на ММОРПГ MuOnline. Это очень простая защита стоимостью примерно 100$, поэтому на нём мы продемонстрируем базовые техники атаки и обхода.


Этап 0×00. Разведка

Снимать защиту будем с произвольного MuOnline сервера http://muolymp.com, первоначально зарегистрируемся и скачаем клиент игры.

И так наша первая цель, это собрать как можно больше информации, которая могла бы быть полезной при взломе. После чего уже можно обдумывать возможные векторы атак.

В нашем случае загрузка модуля античита выполняется с помощью патчинга точки входа клиентского модуля игры main.exe.


Рис.1. Точка входа модуля main.exe

Как видно в сам клиент загружается библиотека wzVideo.dll являющаяся клиентским модулем античита. Сама библиотека накрыта протектором Safe Engine. Запуск клиента не возможен без лаунчера, который кстати от нашей команды. При запуске клиента без загрузки библиотеки wzVideo.dll вход в игру не возможен.

Такие читы как Cheat Engine блокируются, причём блокируются именно окна программ судя по всему по имени, что говорит о низком уровне защиты и противоречит заявленному описанию. Помимо читов блокируются окна ничем не провинившихся легальных программ, что вызывает неудобства (Total Commander к примеру).


Рис. 2. Дамп памяти из библиотеки wzVideo.dll

Попытки остановки потоков античита обнаруживаются, однако никакого контроля целостности памяти нет. Кодовая секция игры спокойно модифицируется.

Согласно описанию защиты на сетевой трафик налаживается дополнительное шифрование, что делает невозможным нормальную работу клиента без античита. Помониторим сетевой трафик.


Рис. 3. Исходящий пакет


Рис. 4. Входящий пакет

Как оказалось слой шифрование налаживается только на входящий трафик, это заметно по заголовкам пакета (в MuOnline все пакеты имеют 4 вида заголовка C1, C2, C3, C4). Причём можно легко заметить что энтропия шифротекста достаточно мала из чего следует что шифр очень простой. Повторяющиеся байты говорят нам о том, что шифр блочный и налаживается на каждый байт. Так же можно отметить, что дешифровка трафика выполняется благодаря перехвату ws2_32.recv() в таблице импорта клиента.

Этап 0×01. Поиск бреши

И так у нас есть клиент с полностью открытый для модификации памятью, следовательно, изменять алгоритмы игрового клиента нам никто не мешает. + блокировка античитом запрещённого ПО производится по жёстко прописанным именам окон, благодаря этому мы можем патчить эти имена в памяти процесса и использовать читы. Однако наша цель заключается в полном снятия защиты.

Что касается защиты сетевого трафика, то так задействован очень простой алгоритм шифрования. Так же дополнительный слой шифрование налаживается только на входящий трафик. Поэтому можно попробовать выполнить атаку с помощью реализации поддельного прокси сервера, который будет эмулировать дешифровку входящего трафика и пересылать его в чистый клиент. Но возникает вопрос, возможно ли получить этот алгоритм шифрования? Для этого попробуем исследовать функции обработки трафика.


Рис. 5. Перехватчик ws2_32.recv()

Как видно на рисунке, алгоритм шифрования достаточно прост. Вот примерный псевдокод :
for (int i = 0; i < size; i++) {
    buf[i] = 0x0B - buf[i];
    buf[i] ^= 0xC2;
    buf[i] += 0x77;
}


Следовательно, проблем для написания промежуточного прокси сервера нет. Таким образом изъяв библиотеку wzVideo.dll из клиентского приложения и перенастроив подключение на наш фейковый прокси сервер, мы сможем полностью обойти данную защиту.

Этап 0×02. Реализация атаки

Теперь перейдём непосредственно к реализации задумки. Нам потребуется выполнить 2 вещи:

1. Реализовать прокси сервер с дешифровкой входящего трафика
2. Снять библиотеку с клиента и перенаправить подключение на наш прокси сервер

Прокси сервер был реализован на базе исходного кода по обходу Enc\Dec шифрования, я внёс код расшифровки трафика в фильтр gs_recv_proxy_filter() для поддержки шифрования NSEngine. Исходный код доступен ниже.

Далее уберём загрузку модуля античита через OllyDbg замазав команды загрузки инструкциями NOP.

Этап 0×03. Заключение

Наша экспертная оценка защиты 1.0 / 5

Низкий уровень обнаружения читов, практически отсутствующие средства самозащиты и защиты игрового процесса, деструктивные действие в отношении легального ПО. Картину спасает лишь наличие шифрования протокола, которое почему-то однонаправленное и протектор Safengine. Он в оценку не вошёл, но слегка усложняет анализ из-за отсутствия скриптов снятия.

Небольшое видео демонстрирующее результат работы нашего обхода



Как видите защита была полностью снята, готовые бинарники вместе с исходным кодом вы можете скачать отсюда.

Благодарим за внимание.

2 комментария:

  1. пробывал не получилось в маине чистом прописывал свой ип не на кс и гс не пошло может я что то делал не так и сам факт обхода античита мне не понятен античит запускается при входе в игру. а как воити в игру если маин не запускается без ланчера если можно как то по подробней что куда ваш видео не плохой для вашего уровня знаний если можно обеснить по подробние у меня такой же
    античит с вашым лансером от п4ф античит работает от библиотеки вз видео

    ОтветитьУдалить
    Ответы
    1. Дело в том что автор защиты скорее всего внёс некоторые изменения в свой античит, чтобы данный гайд не работал. В любом случае основную идею и техники обхода можно понять из статьи

      Удалить