воскресенье, 2 марта 2014 г.

Anti-cheat crackme или обход MuGuard.ru

И снова вас приветствую, в этой статье мы опять затронем тему реверс инжиниринга и обхода игровых защит. На этот раз гостем в нашей студии будет опять-таки защита для ММОРПГ MuOnline, так называемая MuGuard Protection, расположенная по адресу http://muguard.ru. В отличии от предыдущего NSEngine, эта защита является на порядок старше своего конкурента, хотя и особой популярности не имеет, якобы приватная поделка поставленная на пару других серверов. Стоимость 200$.

Если перейти на сайт, то там можно увидеть описание данного продукта, но к сожалению эти описания как завелось, никакого отношения к реальности не имеют, что мы сейчас и докажем.


Так же отмечу, что не стоит путать этот MuGuard.ru с MuGuard.org, т.к. это совершенно разные продукты, даже несмотря на то что эмблема у них одинаковая. Второй античит будет рассмотрен в следующей статье.

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

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

Клиентское приложение main.exe накрыто протектором Enigma Protector. Как выяснилось Античит как находится в библиотеке wz.dll и так же накрыт Энигмой. Для упрощения анализа воспользуемся скриптом от известного крекера LCF-AT и распакуем main.exe и wz.dll. Теперь все необходимые модули подготовлены для анализа.

Так же если взглянуть на трафик можно заметить что он циркулирует без стороннего навесного шифрования, защита пакетов базируется на уникальных ключах Enc\Dec, в чём можно убедится сравнив файлы enc1.dat, dec2.dat со стандартными.

Вернёмся к модулю библиотеки и посмотрим что в нём есть. Фрагмент кода загрузки библиотеки из DllMain выглядит следующим образом:



Как видно античит устанавливает свои перехватчики на события ввода\вывода клавиатуры и мыши. Так же вешается перехватчик на winsock функцию send. В перехватчиках реализованы различные методы детектирования кликеров, к примеру вот как реализовано обнаружение клавиатурных кликеров в перехватчике событий клавиатуры:



Далее взглянем на перехватчик функции send, откуда как видно на рисунке ниже вызывается процедура проверки системы. Такой перехватчик удобен тем, что он выполняет код из основного потока игры, таким образом создавая препятствия для остановки потоков античита. В самом начале функции send выполняется прямая запись распакованных ключей в память main.exe:



Сама процедура StartProtection первоначально выполняет примитивную проверку наличия отладчика, выполняет запущенных процессов, проверку на наличие SpeedHack и сравнивает содержимое кодовой секции main.exe с предварительным снимком, подготовленным ранее в DllMain. В ней так же передаётся 10 раз привет некому SmallHabit:



Теперь вернёмся к функции DllMain и посмотрим как происходит инициализация в процедуре Init(), там меня заинтересовали 2 участка, это примитивная проверка запуска через лаунчер:



и функция проверки контрольных сумм критических файлов, которая реализована на жестко вписанных MD5 хешах, которые легко идентифицируются как строки:



Еще в библиотеке замечено множество участков кода, которые выполняют прямые модификации памяти main.exe, из чего можно сделать вывод о наличии кастомизаций клиента в самой библиотеки античита, это подтверждают так же строки найденные в библиотеке:



Таким образом мы сделали краткое исследование защиты и собрали всю необходимую информацию, перейдём к следующему этапу.

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

Наша цель заключается в полном снятии защиты, однако как мы заметили в библиотеке содержится часть кастомизаций клиента. Если из клиента полностью снять библиотеку, то кастомизации пропадут, что конечно неприятный момент. Поэтому в сегодняшней статье мы попробуем отключить защиту не извлекая её из клиента. Тут сразу возникает несколько проблем, ведь файлы клиента и защиты упакованы (распакованная версия очень кривая), а нам нужно как-то внедрится в процесс и пропатчить библиотеку. Но и библиотека упакована, её патчить нужно в определённый момент: после того, как она сама себя распакует и до того как она начнёт выполнять свои проверки. Задача вполне решима.

Клиент так же использует не стандартные ключи шифрования, для защиты трафика. Думать как обходойти эту защиту нам не нужно, так как это уже сделано в статье про атаку на шифрование MuOnline.

Для того чтобы загрузить свою библиотеку, мы можем воспользоваться старой доброй техникой dll hijacking, подменив библиотеку wzVideo.dll нашей библиотекой, из которой мы бы загрузились в процесс и догрузили оригинальную wzVideo.dll. Теперь нам надо отловить нужный момент и пропатчить библиотеку античита, для этого давайте взглянем на самую первую картинку из нашей статьи, там видно что перед вызовами инициализации защиты, происходит вызов функции LoadRegConfigInt, которая содержит WinAPI вызов RegOpenKeyExA. Мы можем перехватить этот вызов до загрузки библиотеки античита, и по нему определить что наша библиотека запущена и выполняет инициализацию. Этот промежуток идеален для того чтобы мы могли установить наш hotfix.

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

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

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

Небрежный код и алгоритмы программы, на пару с несоответствующим на 60% описанию продуктом не оставили нам выбора в оценке качества. Так же важно отметить что не малую роль в протекте играли стандартные средства защиты игры, которые в оценку не вошли, по понятным причинам.

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



Бинарники и исходные коды можно скачать отсюда.

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


Комментариев нет:

Отправить комментарий