Дабы не утомлять читателя долгим отступлением, скажу сразу, что механизм защиты игр от Alawar неоднократно менялся на протяжении последних лет, каждый раз оставаясь при этом неприглядным образцом лени разработчиков и нежелания компании навести порядок в своем хозяйстве.
Компания Alawar является ведущим дистрибьютором игр, произведенных сторонними разработчиками. Отчасти это оправдывает слабость защиты, поскольку программисты компании не имеют доступа к исходному коду публикуемых игр, и вынуждены довольствоваться внешней «навесной» защитой собственной разработки. Другое дело, что эта защита не представляет собой сколько-нибудь серьезного препятствия. Внешне она проявляется в том, что все игрушки имеют временное ограничение (от 20 минут до часа); по истечении этого времени игрушка отказывается запускаться, предлагая приобрести лицензию на ее использование («купить игру»).
Действующий в данное время механизм основан на использовании программы-оболочки (так называемый, «wrapper») производства Alawar, проверяющей наличие лицензии на игру и факт «легитимности» ее запуска. В случае, если все проверки проходят удачно, оболочка запускает непосредственно саму игру. Давайте рассмотрим все это на примере игры "Римская империя" (я зашел на страничку Alawar-a, и скачал первую попавшуюся):
После установки игрушка создает ярлык в Главном меню:
Видим, что он ссылается на файл Romopolis.exe
в папке, в которую установилась игра. Следуем за «белым кроликом»:
По соседству с нашим Romopolis.exe
можно заметить файл Romopolis.wrp.exe
. Так вот, Romopolis.exe
– это wrapper-оболочка от Alawar, производящая вышеупомянутые действия, а Romopolis.wrp.exe
– исполнимый файл игры, который запускается оболочкой по окончании проверок. Не торопитесь его запускать, сейчас он работать не будет.
Существует два варианта защиты игрушки от Alawar, различающихся лишь деталями:
Program Entry Point
) в оригинальном файле игры;
Если говорить вкратце, то точка входа в PE-файле указывает, с какого места в секции кода начинается выполнение программы. Смотрим на инструкции в точке входа Romopolis.wrp.exe
:
Совсем не похоже на типичный Entry Point
для Delphi, в котором в действительности скомпилировано приложение. Обратите также внимание на самую первую инструкцию («RET»
), которая служит для немедленного возврата в вызывающую функцию. То есть, в данном случае, при прямом запуске выполнение программы прекращается на первом же операнде после точки входа, и результатом будет выход в систему. «Почему же тогда программа может запускаться через оболочку Alawar?», - спросите вы. А вот почему: Alawar-овский wrapper сначала загружает Romopolis.wrp.exe
в память, затем прописывает в коде переход на настоящую точку входа («защита первого рода», см. выше) или исправляет данные по адресу точки входа («защита второго рода»), и лишь потом передает ему управление. Дело остается за малым: чтобы для запуска Romopolis.wrp.exe
обойтись без оболочки, нужно:
Для новичков, самым простым способом узнать тип защиты (и, соответственно, в зависимости от типа защиты – настоящее значение точки входа программы или данных по ее адресу), является «подглядывание» за wrapper-ом. Запускаем оболочку, жмем «Играть» и некоторое время ждем, пока игрушка полностью запустится…
..после чего сворачиваем окно по Alt+Tab, запускаем утилиту PETools, и видим в списке процессов наш Romopolis.wrp.exe
:
Логично предположить, что его уже обработал Alawar-овский wrapper, и на данный момент исполняемый файл имеет все нужные нам параметры. Загружаем исполнимый образ файла из памяти («дампим» образ):
Нас интересует текущее значение Entry Point
, щелкаем на «Optional Header»
, и правее поля «Entry Point»
щелкаем на кнопке «D»
. Откроется окно дизассемблера:
В первую очередь, нас интересует код программы в точке входа. В данном случае, нет никаких подозрительных переходов, что могло бы свидетельствовать о переносе точки входа. Мы видим, что в теле программы, по сравнению с исходным файлом, изменился лишь первый операнд по адресу Program Entry Point
. Таким образом, мы имеем дело с защитой «второго рода». Сравниваем данные по адресу точки входа в исходном и «сдампленном» файле (здесь они различаются только первым байтом), узнаем ее физическое смещение в файле (можно через PeID, см. выше – параметр «File Offset»
). Записываем в исходный файл изменения:
Вот и все дела. Можете удалять оболочку Romopolis.exe
(больше она нам не понадобится), переименовывать Romopolis.wrp.exe
в Romopolis.exe
и играть без ограничений.
В случае, если бы мы столкнулись с защитой «первого рода», различие было бы в том, что по адресу точки входа в «дампе» будет инструкция безусловного перехода на настоящую точку входа (вида «JMP [ADDRESS], RET»
). Нужно было бы запомнить это значение и прописать его в качестве точки входа для оригинального файла Romopolis.wrp.exe
, с помощью того же PETools.