Blog. Just Blog

Исследование защиты игры Challenger Tetris

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот игры Challenger Tetris
Скриншот игры Challenger Tetris

Вы считаете, что хорошо играете в Тетрис? Что ж, игра Challenger Tetris от Terminal Studio готова вас в этом переубедить. Здесь на каждом уровне даются задания, например, очистить сколько-то одинарных и сколько-то двойных линий, продержаться некоторое время при сумасшедшей скорости падения фигурок, зачистить мусорные блоки и тому подобное. И нужно успеть завершить задание за определенное время. Отличная графика, качественное звуковое сопровождение, приятный геймплей - все это портят несколько моментов, например, необходимость покупки игры для снятия лимита по запускам.

На шароварности косяки не заканчиваются. С офсайта скачать игру не получится, ссылки ведут на 404-ю страницу. На серверах софтохранилищ можно найти несколько разновидностей версии 1.0, тогда как на сайте заявлена последняя версия 1.1. Так что будем работать с тем, что есть. Дистрибутив можно скачать, например, отсюда. Устанавливаем, смотрим. Игру можно запускать как напрямую через файл ChallengerTetris.exe, так и с помощью вспомогательного RUNNER.EXE. В первом случае игра просто запустится, во втором варианте можно настроить графику и другие параметры игры, а также произвести регистрацию.

Сообщение незарегистрированной игры
Сообщение незарегистрированной игры

Начнем с главного исполняемого файла. Он ничем не накрыт, отправляем его в дизассемблер. Основным признаком отсутствия регистрации будет строка "UNREGISTERED", которая болтается в окне настроек и на игровом поле. Поиском по этой строке выходим на следующий код:
  1. CODE:004621C9                 cmp     ds:byte_474B20, 0
  2. CODE:004621D0                 jz      short loc_4621DC
  3. CODE:004621D2                 mov     eax, 3
  4. CODE:004621D7                 call    sub_45BD1C
  5. CODE:004621DC loc_4621DC:
  6. ; Проверить состояние регистрации
  7. CODE:004621DC                 cmp     ds:byte_47B780, 0
  8. ; Если байт больше нуля, то строку "Unregistered" не выводить
  9. CODE:004621E3                 jnz     short loc_462221
  10. CODE:004621E5                 fld     tbyte_4635F4
  11. CODE:004621EB                 fsubr   dword ptr [esi]
  12. CODE:004621ED                 add     esp, 0FFFFFFFCh
  13. CODE:004621F0                 fstp    [esp+0A4h+var_A4]
  14. CODE:004621F3                 wait
  15. CODE:004621F4                 fld     tbyte_463600
  16. CODE:004621FA                 fadd    dword ptr [edi]
  17. CODE:004621FC                 add     esp, 0FFFFFFFCh
  18. CODE:004621FF                 fstp    [esp+0A8h+var_A8]
  19. CODE:00462202                 wait
  20. CODE:00462203                 push    40800000h       ; float
  21. CODE:00462208                 push    0BFC00000h      ; int
  22. ; Вывести строку "Unregistered"
  23. CODE:0046220D                 mov     ecx, 0FFh
  24. CODE:00462212                 mov     edx, offset aUnregistered
  25. ; "Unregistered"
  26. CODE:00462217                 mov     eax, 3
  27. CODE:0046221C                 call    sub_46C3BC
  28. CODE:00462221 loc_462221:
  29. CODE:00462221                 fld     ds:flt_47B974
  30. CODE:00462227                 fcomp   flt_463624
  31. CODE:0046222D                 fnstsw  ax
  32. CODE:0046222F                 sahf
Как видно, за регистрацию отвечает байт byte_474B20. Нам надо узнать все места, где он инициализируется правильным или неправильным значением. Это все хорошо видно в списке перекрестных ссылок:

Перекрестные ссылки на байт регистрации
Перекрестные ссылки на байт регистрации

Таких мест всего два, за установку того или иного значения отвечает пара команд SETZ, во всех остальных случаях выполняются или проверки, или какие-то операции с установленным ранее значением этого флага. Смотрим листинг дизассемблера в месте нахождения команд инициализации флага:
  1. CODE:00466988                 lea     eax, [ebp+var_4]
  2. CODE:0046698B                 push    eax
  3. CODE:0046698C                 mov     ecx, offset aReggame ; "RegGame"
  4. CODE:00466991                 mov     edx, offset aSoftwareChalle
  5. ; "Software\\Challenger Tetris\\"
  6. CODE:00466996                 mov     eax, 80000001h
  7. CODE:0046699B                 call    sub_466898
  8. CODE:004669A0                 mov     eax, [ebp+var_4]
  9. CODE:004669A3                 push    eax
  10. CODE:004669A4                 mov     eax, offset a54039 ; "54039"
  11. CODE:004669A9                 call    sub_408774
  12. CODE:004669AE                 lea     edx, [ebp+var_8]
  13. CODE:004669B1                 call    sub_408710
  14. CODE:004669B6                 mov     edx, [ebp+var_8]
  15. CODE:004669B9                 pop     eax
  16. CODE:004669BA                 call    sub_403E60
  17. ; Установить значение флага
  18. CODE:004669BF                 setz    ds:byte_47B780
  19. ; Проверка пройдена?
  20. CODE:004669C6                 cmp     ds:byte_47B780, 0
  21. CODE:004669CD                 jz      loc_466AA3
  22. CODE:004669D3                 lea     eax, [ebp+var_C]
  23. CODE:004669D6                 push    eax
  24. CODE:004669D7                 mov     ecx, offset aCode ; "Code"
  25. CODE:004669DC                 mov     edx, offset aSoftwareChalle
  26. ; "Software\\Challenger Tetris\\"
  27. CODE:004669E1                 mov     eax, 80000001h
  28. CODE:004669E6                 call    sub_466898
  29. CODE:004669EB                 mov     edx, [ebp+var_C]
  30. CODE:004669EE                 mov     eax, offset dword_47B784
  31. CODE:004669F3                 call    sub_403B24
  32. CODE:004669F8                 mov     eax, ds:dword_47B784
  33. CODE:004669FD                 call    sub_403D50
  34. CODE:00466A02                 cmp     eax, 10h
  35. ; Установить значение флага
  36. CODE:00466A05                 setz    ds:byte_47B780
  37. ; Проверка пройдена?
  38. CODE:00466A0C                 cmp     ds:byte_47B780, 0
  39. CODE:00466A13                 jz      loc_466AAD
  40. CODE:00466A19                 lea     eax, [ebp+var_10]
  41. CODE:00466A1C                 push    eax
  42. CODE:00466A1D                 mov     ecx, offset aName ; "Name"
  43. CODE:00466A22                 mov     edx, offset aSoftwareChalle
  44. ; "Software\\Challenger Tetris\\"
  45. CODE:00466A27                 mov     eax, 80000001h
  46. CODE:00466A2C                 call    sub_466898
  47. CODE:00466A31                 mov     edx, [ebp+var_10]
  48. CODE:00466A34                 mov     eax, offset dword_47B788
  49. CODE:00466A39                 call    sub_403B24
Тут из реестра читаются значения, судя по названиям, однозначно относящиеся к регистрации. После проверок в двух местах инициализируется флаг зарегистрированности. Чтобы флаг не зависел от результатов проверок, обе команды SETZ DS:byte_47B780 надо заменить на совпадающие по длине команды MOV DS:byte_47B780,1 и сохранить изменения. В этом случае флаг регистрации будет сразу же иметь правильное значение. Проверяем, при любом варианте запуска никаких посторонних надписей в интерфейсе игры не появляется, а триальный счетчик не уменьшается. Цель достигнута.

Все настройки игры хранятся в папке с программой в файле CONFIG.INI, стартер больше не нужен, поэтому пропатченную игру можно хранить на флешке и брать с собой в дорогу. Запускать, соответственно, только через основной исполняемый файл.

Поделиться ссылкой ВКонтакте
Просмотров: 759 | Комментариев: 11

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Илья (08.05.2023 в 19:49):
Товарищ ManHunter, ваш метод взлома данной игры, описанный в статье, не валиден. В игре появляются баги: нет окна паузы "ABORT THIS GAME (Y/N)", нет надписи "GAME OVER", ненужная "пауза" в местах (по времени) бывшего наг-скрина (отвисает при нажатии любой стрелочки), а также глухое зависание на слове "экселент".

Мой способ взлома:

RUNNER.EXE
004641C7 - заNOPить


ChallengerTetris.exe
Поменять переходы, помеченные "*", для _ckeck_trial_off_474F14:
* 0045D938 - вызов наг-окна при выходе из игры
* 0045DCE3 - механизм запрета пунктов "PANIC" и "BRICKLAYER" в меню "NEW GAME"
* 0045EC86 - вызов слова "UNREGISTERED" в главном меню
* 0045F79A - вызов слова "UNREGISTERED" в меню "OPTIONS"
* 0045FC2D - вызов надписи "AVAILABLE IN THE REGISTERED VERSION ONLY!" в меню "NEW GAME" в пунктах "PANIC" и "BRICKLAYER"
* 0045FCD5 - вызов слова "UNREGISTERED" в меню "NEW GAME"
* 004605BC - вызов слова "UNREGISTERED" в меню "HIGH SCORES"
* 00460BCB - вызов слова "UNREGISTERED" в меню "GAME INFO"

Поменять переходы, помеченные "*", для _CHECK_TRIAL_byte_47C3A0:
004635C1 - неизвестно, разницы не заметил (вызовы рандомов)
0046369D - неизвестно, разницы не заметил (вызовы рандомов)
00464942 - неизвестно, разницы не заметил (однотипные обходы)
0046496B - неизвестно, разницы не заметил (однотипные обходы)
* 00468C87 - вызов слова "UNREGISTERED" в самой игре в верхней части, откуда летят новые фигуры
0046D471 - запрос "Code" из реестра
0046D4B7 - запрос "Name" из реестра, если заменить этот и предыдущий переход,
           то появляется баг - нет окна паузы "ABORT THIS GAME (Y/N)",
           механизм проверки на фейковую регистрацию внутри игры с последующим выбросом из неё
0046DCDB - не понятно, вызов _str___2 символа '.' (точка)
0046FF4B - неизвестно (вызовы рандомов)
00470FAC - не понятно, вызов _str___3 символа '.' (точка)

Опционально - в реестре
Компьютер\HKEY_CURRENT_USER\Software\Challenger Tetris
поставить своё имя в параметр "Name"

Пока багов, проявлений триальности не наблюдаю.
Илья (08.05.2023 в 00:01):
И ещё один недостаток: в момент смены музыки, когда по идее должен был бы выскочить наг-скрин, игра зависает (ставится типа на паузу), и отвисает при нажатии на любую стрелочку.
Илья (07.05.2023 в 23:42):
У меня в игре, когда убираются сразу 4 линии кубиков игра зависает на слове "экселент". Нажатие на любую клавишу приводит к проигрыванию "грейд", "фантастик", но игра не отвисает.
user (22.04.2023 в 01:07):
У этой фирмочки есть ещё неплохая игрулька Линии (5 в ряд),
там защита немного другая, но тоже довольно гуманная.
Вообще, у  них в разных играх разные же и заморочки, не по шаблону.
user (21.04.2023 в 03:12):
Для игры, которая по ссылке -

Файл REG.CRK:

;--------------------------->8
ChallengerTetris 1.0

Unlimited Trial
RUNNER.EXE
.0046414E: 92 82 ;0006354E:

Set Registered
ChallengerTetris.exe
.0046D463: 0F C6 ;0006C863:
.0046D464: 94 05 ;0006C864:
.0046D465: 05 A0 ;0006C865:
.0046D466: A0 C3 ;0006C866:
.0046D467: C3 47 ;0006C867:
.0046D468: 47 00 ;0006C868:
.0046D469: 00 01 ;0006C869:
ChallengerTetris.exe
.0046D4A9: 0F C6 ;0006C8A9:
.0046D4AA: 94 05 ;0006C8AA:
.0046D4AB: 05 A0 ;0006C8AB:
.0046D4AC: A0 C3 ;0006C8AC:
.0046D4AD: C3 47 ;0006C8AD:
.0046D4AE: 47 00 ;0006C8AE:
.0046D4AF: 00 01 ;0006C8AF:
;---------------------------->8
Илья (18.04.2023 в 13:14):
Так и есть, я уже сам заметил.
ManHunter (18.04.2023 в 13:04):
О, да. Теперь зарегай игру этим серийником и попробуй пройти пару-тройку уровней, будешь сильно удивлен.
Есть такая штука, как комментарии к статьям, там иногда тоже встречается много интересного.
Илья (18.04.2023 в 13:00):
Спасибо за статью.
Благодаря вчерашнему вашему ответу про дебаггер OllyDbg, а также этой статье, я исследовал эту программу, а именно RUNNER.EXE

Ключ должен быть 16 символов и от имени не зависит
Сумма ASCII кодов символов (в 16-ричной системе) должна быть равна 545 (в 16-ричной системе), например "TTTTTTTTTTTTTTTY" или любая их перестановка
Кейген написать не сложно.

Чтобы удалить регистрацию, надо удалить папку программы в реестре по адресу:
Компьютер\HKEY_CURRENT_USER\Software\Challenger Tetris
zor (08.03.2023 в 12:06):
Поделитесь, пожалуйста, hex-патчем (в виде текста) на эту игру.
ManHunter (06.03.2023 в 23:00):
voffka, это только в регистраторе. В самой игре еще до жопы проверок, причем на разных уровнях.
voffka (06.03.2023 в 22:57):
Для любителей ключей:
Имя не учавствует
Длина 16 символов
Сумма символов должна быть 0х545

Брутите )))

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0064 сек.) / Память: 4.5 Mb
Наверх