
Скриншот программы 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" в описании на сайте. Другие игры принадлежат другим дистрибьюторам, и защита у них может отличаться от описанной в статье. В любом случае, хороших вам выходных и приятного времяпровождения за откармливанием змейки.