ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Низкоуровневое исследование клиента игровой платформы Garena
  #1  
Старый 14.08.2009, 17:04
Аватар для Dosia
Dosia
Участник форума
Регистрация: 05.06.2009
Сообщений: 127
Провел на форуме:
1313455

Репутация: 249
Post Низкоуровневое исследование клиента игровой платформы Garena

Низкоуровневое исследование игровой платформы Garena (или попросту реверсинг популярного игрового клиента)

0) Небольшое вступление (собственно о самом пациенте)

Гарена (англ. Garena, сокр. от Global Arena, до этого называлась GG client) представляет собой платформу для игр через интернет и мгновенного обмена сообщениями, чем-то похожую на Xfire. Распространяется на основе принципа «Free 2 Play», что позволяет не тратить на неё деньги либо тратить деньги на микроплатежи, оплачивая дополнительные возможности. Основной аудиторией являются игроки в DotA Allstars — пользовательскую карту игры Warcraft III The Frozen Throne. Garena набрала популярность среди игроков благодаря возможности играть без лицензионной версии игры с хорошим пингом, наличию защиты от программ-читов и ненадобности производить какие-либо настройки (например, Hamachi имеет аналогичные функции, но требует немало действий для начала игры).

Источник (Более подробное описание)

Так как игровой клиент распространяется на основе принципа «Free 2 Play», см выше, то в нем существует ряд ограничений, которые доступны только после покупки “Gold” статуса. Собственно о возможности снятия этих ограничений и будет рассказано в данной статье.

1) План действий:

a) Уберем защиту от отладки
b) Уберем проверку изменений модулей
c) Уберем проверку изменений исполняемого файла
d) Уберем таймер на вход в комнату
e) Показ ping’a пользователей цифрами
f) Уберем проверку на использование запрещенных программ (читов, например maphack’a)
g) Уберем flood защиту из чата
h) Уберем ограничение на запуск одной копии программы
На этом я предлагаю остановится, так как цель данной статьи (показать основные принципы) считаю достигнутой, а все остальное вы уже сможете сделать и сами.

2) Принятые обозначения:

Что то очень важное
Обозначение разделов
Обозначение чего то что следует выделить (ключевые слова)
Первое упоминание о команде
Справка по команде (функции)
Адрес команды
Переходы
Команда
Название API функций

3) Кнопки на панели инструментов:


  1. Reopen- Отладчик перезагрузит файл и остановится на точке входа. Hotkey ("Ctrl+F2")
  2. Run - Запуск программы на выполнение. Hotkey ("F9")
  3. Pause - Остановка выполнения программы. Hotkey ("F12")
  4. Step into - Трассируя программу в этом режиме отладчик будет заходить во все вызываемые функции и процедуры. Hotkey ("F7")
  5. Step over - Отладчик не будет заходить в функцию (он конечно это сделает, но без нас ;D а мы в свою очередь попадем на следующую за только что выполненной командой строку программы). Hotkey ("F8")
  6. Executable modules - Исполняемые модули программы. Hotkey ("ALT+E")
  7. Call stack - Отображение текущего стека вызова. Hotkey ("ALT+K")
  8. Breakpoints - Отображение списка точек останова. Hotkey ("ALT+B")

4) Подготовка

a) Нам потребуется отладчик (1.3 МБ)
b) Справочник по api функциям (16.1 МБ)
Можно скачать уже распакованную версию (6.99 МБ)
c) Сам пациент – клиент игровой платформы Garena (5.6 МБ)
Зеркало (5.61 МБ)
d) Так же желательно наличие поверхностных знания команд ассемблера

5) Настройка отладчика

Запускаем отладчик, идем в меню “Options” -> “Debugging options”. В появившемся окне выбираем вкладку "Exceptions" (Исключения), устанавливаем все переключатели (отмечаем их галочкой). Правее есть кнопка “Add range”, жмем, в поле “First exceptions in range“ вводим “00000000” (8 нулей), в поле “Last exceptions in range“ вводим “FFFFFFFF” (8 букв “F”), жмем “OK”.


Закрываем окно настроек отладчика нажатием “OK”. Теперь в случае возникновения исключения во время работы программы, она не будет прерываться и требовать нашего вмешательства ;D
Для более глубокого понимания темы я попросил вас скачать справочную документацию по API функциям os windows. Настроим отладчик на использование данного справочника следующим образом:
Выбираем меню “Help” -> “Select API help file”, указываем путь к win32.hlp (извлеченного из “MSHELP.exe”)
Все, теперь все готово и можно приступать к основной части статьи

6) Исследование программы

a) Уберем защиту от отладки


Апдейт игрового клиента от 11.09.09 приподнес нам небольшой сюрприз в виде защиты от отладки.

Сразу хочу сказать что с антиотладкой мне помог Flint_ta, за что ему огромное спасибо.

Суть антиотладки заключается в загрузке драйвера, который бы скрывал процесс “garena.exe” от диспетчера задач и от оли собственно тоже, вызывается функция “CreateServiceW” из библиотеки “ADVAPI32.dll”, которая в свою очередь вызвана из “Gengine.dll”. Рассмотрим антиотладку более подробно:

В оле уже загружена “Garena.exe”, но отладчик не запущен на выполнение, мы находимся на точке входа в программу, жмем на листинге правой кнопкой “Search for” -> “Name (label) in current module” или жмем “Ctrl+N”. Начинаем набор текста (активное окно – окно отладчика): “LoadLibrary”:

Функция LoadLibrary отображает заданный исполняемый модуль в адресное пространство вызывающего процесса. Для загрузки с дополнительными параметрами, используется функция LoadLibraryEx.

СинтаксисHMODULE LoadLibrary(
LPCTSTR lpFileName
);

Параметры:

lpFileName
Указатель на символьную строку с нулем в конце, которая именует исполняемый модуль (или .dll или .exe файл). Указанное имя - это имя файла модуля и оно не связано с именем самого сохраняемого в библиотеке модуля, как это определено ключевым словом LIBRARY в (.def) файле определения модуля.

Если строка определяет путь, но файл не существует в указанном каталоге, функция завершается ошибкой. Когда определяется путь, убедитесь, что использованы наклонные черты влево(обратные слэши (\)), а не прямые слэши (/).

Если символьная строка не определяет путь, функция использует стандартную стратегию поиска файла. Дополнительную информацию см. в разделе Замечания.

Возвращаемые значения:
Если функция завершается успешно, возвращаемое значение - дескриптор модуля.


Функция найдена “LoadLibraryW”, кликаем на строчку, вызываем контекстное меню, жмем “Set breakpoint on every reference”, только что мы поставили точку останова каждом вызове этой функции. Теперь можно и запустить отладчик, жмем “F9”. Грузится какая то библиотека:



Название этой библиотеки мы можем увидеть в стеке (на рисунке отмечено синим прямоугольником). Скажу наперед, нас эта библиотека не интересует (чтобы не терять время мы сразу перейдем к нужной, если хотите, можете методом проб и ошибок выйти на нее ;D). И так нас интересует загрузка библиотеки “Gengine.dll”, если вы пошли методом проб и ошибок, то после её загрузки вы можете увидеть абсолютно чистую олю, без опкодов, таким образом вам сразу станет ясно, почему стоит уделить внимание именно этой библиотеке. Жмем “F9”, пока не окажемся тут 4F85DD:



Сейчас происходит загрузка библиотеки “AvoidCrackPlugin.dll” (название в синем прямоугольнике). Но если вы нажмете “F9”, то увидите, что по этому же адресу 4F85DD происходит загрузка следующей библиотеки: “Gengine.dll”. Жмем “ALT+E” или идем в меню “View” -> “Executable modules”, после чего перед нами появляется список всех модулей используемых программой (“Garena.exe”). Нас, как уже было сказано выше, интересует библиотека “ADVAPI32.dll”. В колонке “Name” находим название “ADVAPI32”:



Оля любезно сообщила нам что это системная библиотека, написав после её названия “(system)”. Двойной щелчек по строке с названием “ADVAPI32” и мы находимся непосредственно в ней. Жмем “Ctrl+N”, так как нас интересует список всех функций данного модуля. Начинаем набирать текст: “CreateService”:

Функция CreateService создает сервис (службу)

SC_HANDLE CreateService(

SC_HANDLE hSCManager, // Указывает на указатель, возвращенный функцией OpenSCManager
LPCTSTR lpServiceName, // Указывает на имя службы
LPCTSTR lpDisplayName, // Указывает на имя, которое будет использовано пользовательским интерфейсом
DWORD dwDesiredAccess, // Флаги определяющие права доступа к службе
DWORD dwServiceType, // Тип создаваемого сервиса
DWORD dwStartType, // Определяет способ запуска службы
DWORD dwErrorControl, // Указывает на способ обработки возникающих ошибок
LPCTSTR lpBinaryPathName, // Указатель на строку (заканчивающуюся нулём), которая содержит полный путь к исполняемому файлу сервиса
LPCTSTR lpLoadOrderGroup, // Указатель на строку (заканчивающуюся нулём), которая содержит имя группы, членом которой является сервис.
LPDWORD lpdwTagId, // Указатель на переменную, в которую будет записан уникальное значение тэга, которое идентифицирует группу, указанную в параметре lpLoadOrderGroup.
LPCTSTR lpDependencies, // Указатель на массив (завершающийся двумя нулями) имён (разделённых нулями) сервисов или групп сервисов, которые система должна запустить до запуска этого сервиса.
LPCTSTR lpServiceStartName, // Указатель на строку (завершающуюся нулём), которая содержит имя аккаунта, с правами которого будет запущен сервис.
LPCTSTR lpPassword // Указатель на строку (заканчивающуюся нулём), которая содержит пароль к аккаунту, указанному в параметре lpServiceStartName.
);


Более подробно о функции можно почитать тут

Функция найдена “CreateServiceW”, жмем на ней “F2”, Смотрим список бряков – все ок:



После чего, жмем “F9” и мы оказываемся тут:



Из рисунка отчетливо видно, что мы сейчас стоим на вызове той самой функции создания сервиса “ CreateServiceW ”, вызванной из модуля “GEngine”. Параметры вызова с которыми была вызвана функция вы можете увидеть в стеке. Переходим по адресу с которого был произведен вызов: 04874B88 (на рисунке – синий прямоугольник) . Для этого жмем “ALT+E”, Выбираем в колонке “Name” модуль “Gengine”, который собственно только что был загружен (“LoadLibraryW” по адресу 4F85DD в модуле “Garena”). Переходим в модуль “Gengine” по двойному щелчку, после чего жмем “Ctrl+G”, вводим адрес с которого произошел вызов (04874B88), после чего оказываемся тут:



Что мы тут видим? По адресу 04874B88 происходит вызов “ADVAPI32. CreateServiceW”. Также мы можем увидеть имя драйвера создаваемого драйвера: “sys_GarenaPEngine.sys”. Нас интересуют переход выше вызова “ CreateServiceW ”, находящийся по адресу 04874B64. Поставим туда брейкпоинт (точку останова), жмем правой кнопкой по адресу перехода: 04874B64, вызываем контекстное меню (правая кнопка мыши) после чего, выбираем “Breakpoint” -> “Hardware, on execution”. Убираем бряк с адреса вызова функции “CreateServiceW” из модуля “ADVAPI32”, для этого идем в “View” -> “Breakpoints”, выделяем строку (она там будет 1), в колонке "Name" у которой будет написано “ADVAPI32”, жмем “Del”. Теперь перезапускаем программу в отладчике, жмем “F9”. Жмем “F9” на вызове “LoadLibraryW” в модуле “Garena” (дважды, так как сначала грузится “AvoidCrackPlugin.dll”) , после чего прерываемся на бряке. Что говорит оля по поводу перехода?



Меняем флаг “Z” на противоположный, дважды щелкнув по нему:



Смотрим что с переходом: “Jump is taken”. Отлично. Заменим условный переход по адресу: 04874B64 на безусловный “JE” заменим на “JMP”. Проходим по переходу с помощью “F8”. Тут надо сказать вам, почему мы не отпускаем программу в свободное плавание, нажав “F9”, а словно ожидая подвоха, трассируем по “F8”: Дело в том что я уже само собой проделал все это перед написанием данной статьи и могу вам сказать, что после того как мы выйдем из этого вызова, мы окажемся тут (4874448):



Что же мы тут видим? А все очень просто, программа предпринимает еще одну попытку создания сервиса, по адресу 487444F видим переход, который может избавить нас от участи сидеть перед окном пустого отладчика. Меняем условный переход “JNZ SHORT 048744CB” на “JMP SHORT 048744CB”. Отлично. При желании можно немного потрассировать программу по “F8” и убедится, что теперь все в порядке. Но я надеюсь, вы поверите мне на слово. Итак, подведем итог, мы только что сделали 2 изменения в модуле “Gengine”, который является динамической библиотекой. Мы должны сохранить результат нашей работы. Жмем правую кнопку мыши на листинге, вызывая контекстное меню, выбираем:
Copy to executable” -> “All modifications”, после чего нас спросят действительно ли мы хотим копировать все изменения сделанные в коде программы, жмем “Copy all”, в появившемся окне жмем правую кнопку, вызывая всплывающее меню, выбираем “Save file”, указываем имя файла и его местоположение (%Garena%\plugins\UI\GEngine.dll), после чего жмем “Сохранить”. Хочу обратить ваше внимание на то, что не лишним будет переименовать оригинальный файл “GEngine.dll”, на всякий случай ;D После чего уже сохранять изменный. Убираем все брейкпоинты, в том числе и hardware, для этого идем в меню "Debug" -> "Hardware breakpoints", удаляем их и перезапускаем клиента игровой платформы в отладчике. Запускаем на выполнение “F9”. Опс, что же мы видим?



Garena сообщает нам о ошибке проверки файла. Что тут можно сказать? Не стоит ничего проверять и сейчас мы отучим garen’у делать это.

Еще раз хочу сказать спасибо Flint_ta, за помощь с антиотладкой.

b) Уберем проверку изменений модулей


Перезагружаем программу “Ctrl+F2”, что же происходит? При загрузке библиотеке garena проверяет контрольную сумму файла, так как мы файл изменили, то и контрольная сумма теперь другая, что же делать? В начале мы с вами уже были на загрузки “Gengine.dll”, помните? “LoadLibraryW” по адресу 4F85DD в модуле “Garena”. Именно оттуда мы начали свой путь. Идем по этому адресу “Gtrl+G”, вводим “4F85DD”, “OK”. Смотрим что у нас тут:



Выше загрузки библиотеки, по адресу 4F85DA видим переход непосредственно на наш наг, информирующий о ошибке проверки файла (на рисунке выделен зеленым цветом). Выше по адресу: 4F85C8 видим переход, который переносит нас через “плохой переход”. После загрузки библиотеки по адресу: 4F85E5 также существует проверка условия, в случае если переход будет выполнен (на рисунке отмечен коричневым цветом), мы можем получить еще одно плохое сообщение, которое будет вызвано примерно тут:



Делаем следующее:
1) По адресу 4F85C8 меняем условный переход “JE SHORT 004F85DC” на безусловный “JMP SHORT 004F85DC ”, что позволит нам избавится от первого плохого сообщения.
2) По адресу 4F85E5 занопаем переход (забьем командами “NOP” = ничего не делать). Этим мы избавимся от второго плохого сообщения.
Собственно это все, теперь мы сохраняем сделанные изменения в файле “Garena.exe” (как? смотри выше).

c) Уберем проверку изменений исполняемого файла


Собственно эта проверка не дает клиенту успешно соединится с сервером игры и авторизовать клиента.

В далеком прошлом, когда еще не было антиотладки и все мапхакеры и прочие читеры жили припеваючи, была написана данная статья: "Снимаем таймер подключения в Garena Client". Именно по ней вы должны убрать проверку изменения исполняемого файла "Garena.exe" сомостоятельно. Зачем я тогда описал пункт "b"? Чтобы вам было удобнее и понятнее, так как были изменения в коде и виртуальные адреса сместились. Ну а проверка изменения исполняемого файла происходит из "AvoidCrackPlugin.dll", который был изменен еще в незапамятные времена, соответсвенно все адреса для этого модуля остались прежними и вам будет довольно удобно (я надеюсь) проделать все описанные в статье изменения. Для тех же у кого возникли трудности, в конце статьи вы найдете файл со всеми изменнеными нами файлами, которые вы сможете поковырять сами ;D

Последний раз редактировалось Dosia; 19.09.2009 в 23:41..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аккаунт от игрового клиента Garena. Ne1s0n Разное - Покупка, продажа, обмен 2 11.06.2009 23:11



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ