Защита игр от Alawar

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

Компания Alawar является ведущим дистрибьютором игр, произведенных сторонними разработчиками. Отчасти это оправдывает слабость защиты, поскольку программисты компании не имеют доступа к исходному коду публикуемых игр, и вынуждены довольствоваться внешней «навесной» защитой собственной разработки. Другое дело, что эта защита не представляет собой сколько-нибудь серьезного препятствия. Внешне она проявляется в том, что все игрушки имеют временное ограничение (от 20 минут до часа); по истечении этого времени игрушка отказывается запускаться, предлагая приобрести лицензию на ее использование («купить игру»).

Действующий в данное время механизм основан на использовании программы-оболочки (так называемый, «wrapper») производства Alawar, проверяющей наличие лицензии на игру и факт «легитимности» ее запуска. В случае, если все проверки проходят удачно, оболочка запускает непосредственно саму игру. Давайте рассмотрим все это на примере игры "Римская империя" (я зашел на страничку Alawar-a, и скачал первую попавшуюся):

10.jpg

После установки игрушка создает ярлык в Главном меню:

11.jpg

Видим, что он ссылается на файл Romopolis.exe в папке, в которую установилась игра. Следуем за «белым кроликом»:

12.jpg

По соседству с нашим Romopolis.exe можно заметить файл Romopolis.wrp.exe. Так вот, Romopolis.exe – это wrapper-оболочка от Alawar, производящая вышеупомянутые действия, а Romopolis.wrp.exe – исполнимый файл игры, который запускается оболочкой по окончании проверок. Не торопитесь его запускать, сейчас он работать не будет.

Существует два варианта защиты игрушки от Alawar, различающихся лишь деталями:

Если говорить вкратце, то точка входа в PE-файле указывает, с какого места в секции кода начинается выполнение программы. Смотрим на инструкции в точке входа Romopolis.wrp.exe:

13.jpg

14.jpg

Совсем не похоже на типичный Entry Point для Delphi, в котором в действительности скомпилировано приложение. Обратите также внимание на самую первую инструкцию («RET»), которая служит для немедленного возврата в вызывающую функцию. То есть, в данном случае, при прямом запуске выполнение программы прекращается на первом же операнде после точки входа, и результатом будет выход в систему. «Почему же тогда программа может запускаться через оболочку Alawar?», - спросите вы. А вот почему: Alawar-овский wrapper сначала загружает Romopolis.wrp.exe в память, затем прописывает в коде переход на настоящую точку входа («защита первого рода», см. выше) или исправляет данные по адресу точки входа («защита второго рода»), и лишь потом передает ему управление. Дело остается за малым: чтобы для запуска Romopolis.wrp.exe обойтись без оболочки, нужно:

Для новичков, самым простым способом узнать тип защиты (и, соответственно, в зависимости от типа защиты – настоящее значение точки входа программы или данных по ее адресу), является «подглядывание» за wrapper-ом. Запускаем оболочку, жмем «Играть» и некоторое время ждем, пока игрушка полностью запустится…

15.jpg

..после чего сворачиваем окно по Alt+Tab, запускаем утилиту PETools, и видим в списке процессов наш Romopolis.wrp.exe:

16.jpg

Логично предположить, что его уже обработал Alawar-овский wrapper, и на данный момент исполняемый файл имеет все нужные нам параметры. Загружаем исполнимый образ файла из памяти («дампим» образ):

17.jpg

Нас интересует текущее значение Entry Point, щелкаем на «Optional Header», и правее поля «Entry Point» щелкаем на кнопке «D». Откроется окно дизассемблера:

18.jpg

В первую очередь, нас интересует код программы в точке входа. В данном случае, нет никаких подозрительных переходов, что могло бы свидетельствовать о переносе точки входа. Мы видим, что в теле программы, по сравнению с исходным файлом, изменился лишь первый операнд по адресу Program Entry Point. Таким образом, мы имеем дело с защитой «второго рода». Сравниваем данные по адресу точки входа в исходном и «сдампленном» файле (здесь они различаются только первым байтом), узнаем ее физическое смещение в файле (можно через PeID, см. выше – параметр «File Offset»). Записываем в исходный файл изменения:

19.jpg

Вот и все дела. Можете удалять оболочку Romopolis.exe (больше она нам не понадобится), переименовывать Romopolis.wrp.exe в Romopolis.exe и играть без ограничений.

В случае, если бы мы столкнулись с защитой «первого рода», различие было бы в том, что по адресу точки входа в «дампе» будет инструкция безусловного перехода на настоящую точку входа (вида «JMP [ADDRESS], RET»). Нужно было бы запомнить это значение и прописать его в качестве точки входа для оригинального файла Romopolis.wrp.exe, с помощью того же PETools.