Исследование защиты программы Feed The Snake


Скриншот программы Feed The Snake

Давно не исследовал никаких игрушек, видимо пришло время. Как раз выходные, можно немного расслабиться и поиграть в классическую "Змейку", или, по версии разработчика, "Feed The Snake". Принцип игры простой. При помощи стрелочек на клавиатуре нужно задавать направление движения змейке на игровом поле, подбирая съедобные ягоды и фрукты, а также всякие призовые карточки. В этом варианте игры добавлены еще и несъедобные элементы: острый перец, мухоморы и кактусы. По мере насыщения змейка вырастает в длину. Ограничений по времени игры вроде бы нет, но часть игровых опций становятся доступными только после регистрации. Сейчас мы будем это исправлять.

Скачиваем дистрибутив, устанавливаем. При запуске игры появляется окно, похожее на wrapper от других дистрибьюторов, но это не так. Process Explorer подтверждает, что никаких дочерних процессов при запуске игры не создается, значит это окно встроено в саму игру.


Окно запуска игры

Главный исполняемый файл накрыт какой-то древней версией ASProtect, поэтому современные скрипты и распаковщики с ним не справляются. Зато справляется не менее древняя версия распаковщика Stripper 2.07. Из-за особенностей работы протектора и распаковщика, нормально распаковать файл удается только под Windows XP или на виртуальной машине с Windows XP (я пользуюсь чистой системой под VMWare Workstation). Под Windows 7, и даже в режиме Windows XP Mode, может ничего не получиться.


Распаковываем исполняемый файл

Файл распакован, теперь надо найти проявления триальности. Самый очевидный из них - это строка "Registered to: Unregistered" на экране главного меню игры. Ну раз такая строка присутствует на экране, значит она должна присутствовать где-то в файле. Поищем ее.


Нехорошая строка найдена

Строка в файле найдена. Теперь надо посмотреть в дизассемблере на условия ее появления. По перекрестным ссылкам найден вот такой код:
.text:004070D3                 mov     eax, ds:lpString
.text:004070D8                 mov     ebx, lstrlenA
.text:004070DE                 push    eax             ; lpString
.text:004070DF                 call    ebx ; lstrlenA
.text:004070E1                 test    eax, eax
.text:004070E3                 jnz     short loc_40710D
.text:004070E5                 mov     edi, offset aRegisteredToUn
; "Registered to: Unregistered"
.text:004070EA                 or      ecx, 0FFFFFFFFh
.text:004070ED                 repne scasb
.text:004070EF                 not     ecx
.text:004070F1                 sub     edi, ecx
.text:004070F3                 lea     edx, [ebp+Dest]
.text:004070F9                 mov     eax, ecx
.text:004070FB                 mov     esi, edi
.text:004070FD                 mov     edi, edx
.text:004070FF                 shr     ecx, 2
.text:00407102                 rep movsd
.text:00407104                 mov     ecx, eax
.text:00407106                 and     ecx, 3
.text:00407109                 rep movsb
.text:0040710B                 jmp     short loc_407128
.text:0040710D ; ------------------------------------------------
.text:0040710D loc_40710D:
.text:0040710D                 mov     ecx, ds:lpString
.text:00407113                 lea     edx, [ebp+Dest]
.text:00407119                 push    ecx
.text:0040711A                 push    offset aRegisteredToS
; "Registered to: %s"
.text:0040711F                 push    edx             ; Dest
.text:00407120                 call    _sprintf

Что он делает? По адресу 004070D3 берется строка в формате ASCIIZ по указателю ds:lpString, затем проверяется ее длина. Если она не равна нулю, то значит какое-то регистрационное имя есть и игрушка зарегистрирована. Посмотрим на указатель:
seg002:004215E4 ; LPCSTR lpString
seg002:004215E4 lpString        dd 0

По адресу 4215E4 находится двойное слово, указывающее на строку регистрационного имени. После распаковки оно равно нулю. Попробуем перенаправить указатель на какую-нибудь ненулевую строку в файле. Пусть это будет строка сообщения о незарегистрированной игре :) Да, учитывайте особенности адресации, когда младшие байты адреса идут в начале DWORD'а.


Заменяем адрес строки регистрационного имени

А саму строку перебьем на наше имя. Не забывайте, что строка должна заканчиваться нулевым символом, то есть строка должна быть в формате ASCIIZ.


Вписываем регистрационное имя

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


Окно запуска игры без регистрации

И снова чудо! Пункт в главном меню "Register" превратился в ссылку на домашнюю страничку, в левом нижнем углу мы видим надпись о регистрации на наше имя, и все ограничения при выборе игры также исчезли. То есть игра теперь полностью зарегистрирована.


Игра успешно "зарегистрирована"

Теперь можно без всяких ограничений кормить змейку до отвала. Кстати, таким же способом отучаются от жадности и другие игры от компании RealApex. Их можно узнать по строке "Games, by RealApex" в описании на сайте. Другие игры принадлежат другим дистрибьюторам, и защита у них может отличаться от описанной в статье. В любом случае, хороших вам выходных и приятного времяпровождения за откармливанием змейки.
Теги:
защита, взлом
Добавлено: 16 Сентября 2013 02:16:13 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...