Исследование защиты игры Theseus and the Minotaur
Скриншот игры Theseus and the Minotaur
Игра Theseus and the Minotaur от компании Kristanix - компьютерная реализация одной из классических головоломок, история которой ведется еще с 90-х годов прошлого века. Когда-то сайт Kristanix был отличным дистибьютером игр для различных платформ, там можно было скачать огромное количество оригинальных головоломок, аркад и других игр, а сейчас это какое-то унылое говно. И игру Theseus and the Minotaur вы там тоже не найдете, все ссылки битые. К счастью, у меня в закромах завалялся дистрибутив, осталось только найти Книгу Мертвых, чтобы воскресить проект из небытия.
Забираем с файлообменника дистрибутив, устанавливаем, запускаем, смотрим. первым признаком триальности является большая кнопка покупки. Нажимать ее не надо. А самое интересное проявляется при выходе из игры: счетчик запусков, ограничение по количеству уровней, триальный экран с предложением заглянуть в кассу или ввести серийник.
Окно регистрации программы
На ввод левого серийника игра реагирует следующим сообщением:
Сообщение о неправильной регистрации
Поищем строчку сообщения в исполняемом файле. Найдется одна юникодная строка. К слову, в дизассемблере эта строка превращается в нечитаемый набор символов, и найти ее просто так не получится. Кто там еще возмущался, зачем я до сих пор пользуюсь HiEW для поиска текстовых строк в файлах?
Строка сообщения
Теперь можно спокойно вернуться в дизассемблер и посмотреть, как эта строчка задействуется. Код будет следующий:
Code (Assembler) : Убрать нумерацию
- code:004E4F52 push ebp
- code:004E4F53 mov ebp, esp
- code:004E4F55 push ebx
- code:004E4F56 push esi
- code:004E4F57 mov ebx, [ebp+arg_0]
- code:004E4F5A mov esi, [ebp+arg_4]
- code:004E4F5D push ebx
- ; Вызвать функцию проверки
- code:004E4F5E call sub_4E4322
- code:004E4F63 add esp, 4
- code:004E4F66 cmp eax, 0
- ; Если она вернула 0, то серийник неправильный
- code:004E4F69 jnz short loc_4E4F8C
- ; Вывести сообщение о неправильной регистрации
- code:004E4F6B mov ebx, offset off_541AD0
- code:004E4F70 inc dword ptr [ebx+4]
- code:004E4F73 mov eax, [esi]
- code:004E4F75 dec dword ptr [eax+4]
- code:004E4F78 jnz short loc_4E4F83
- code:004E4F7A push eax
- code:004E4F7B call sub_48868E
- code:004E4F80 add esp, 4
Программа успешно "зарегистрирована"
Теперь давайте попробуем отреверсить алгоритм проверки серийного номера. Откатываем из бэкапа исполняемый файл, загоняем его в отладчик, ставим точку останова по адресу 004E4322. Дальше запускаем игру, пропускаем первую проверку пустого серийника, и второй раз останавливаемся при проверке введенной строки регистрации. Переходим в пошаговую трассировку и аккуратно смотрим на все происходящее.
Code (Assembler) : Убрать нумерацию
- code:004E4330 call sub_4BABDE
- code:004E4335 add esp, 4
- code:004E4338 mov ebx, eax
- code:004E433A push ebx
- code:004E433B call sub_486205
- code:004E4340 add esp, 4
- code:004E4343 mov ebx, eax
- code:004E4345 cmp dword ptr [ebx+8], 0Bh
- code:004E4349 jz short loc_4E4355
- code:004E434B mov eax, 0
- code:004E4350 jmp loc_4E448B
Code (Assembler) : Убрать нумерацию
- ; 7-й символ
- code:004E4355 movzx eax, word ptr [ebx+18h]
- code:004E4359 mov eax, eax
- code:004E435B push eax
- code:004E435C call sub_485D1C
- code:004E4361 add esp, 4
- code:004E4364 push eax
- code:004E4365 call sub_4863E1
- code:004E436A add esp, 4
- code:004E436D add esi, eax
- ; 8-й символ
- code:004E436F movzx eax, word ptr [ebx+1Ah]
- code:004E4373 mov eax, eax
- code:004E4375 push eax
- code:004E4376 call sub_485D1C
- code:004E437B add esp, 4
- code:004E437E push eax
- code:004E437F call sub_4863E1
- code:004E4384 add esp, 4
- code:004E4387 add esi, eax
- ; 9-й символ
- code:004E4389 movzx eax, word ptr [ebx+1Ch]
- code:004E438D mov eax, eax
- code:004E438F push eax
- code:004E4390 call sub_485D1C
- code:004E4395 add esp, 4
- code:004E4398 push eax
- code:004E4399 call sub_4863E1
- code:004E439E add esp, 4
- code:004E43A1 add esi, eax
- ; 10-й символ
- code:004E43A3 movzx eax, word ptr [ebx+1Eh]
- code:004E43A7 mov eax, eax
- code:004E43A9 push eax
- code:004E43AA call sub_485D1C
- code:004E43AF add esp, 4
- code:004E43B2 push eax
- code:004E43B3 call sub_4863E1
- code:004E43B8 add esp, 4
- code:004E43BB add esi, eax
- ; Разделить сумму на 10
- code:004E43BD mov ecx, 0Ah
- code:004E43C2 mov eax, esi
- code:004E43C4 cdq
- code:004E43C5 idiv ecx
- code:004E43C7 mov esi, edx
- ; Сравнить остаток с 11 символом
- code:004E43C9 movzx eax, word ptr [ebx+20h]
- code:004E43CD mov eax, eax
- code:004E43CF push eax
- code:004E43D0 call sub_485D1C
- code:004E43D5 add esp, 4
- code:004E43D8 push eax
- code:004E43D9 call sub_4863E1
- code:004E43DE add esp, 4
- code:004E43E1 cmp esi, eax
- code:004E43E3 jz short loc_4E43EF
- code:004E43E5 mov eax, 0
- code:004E43EA jmp loc_4E448B
Code (Assembler) : Убрать нумерацию
- code:004E43EF push offset off_5418A0
- ; 2-й символ
- code:004E43F4 movzx eax, word ptr [ebx+0Eh]
- code:004E43F8 mov eax, eax
- code:004E43FA push eax
- code:004E43FB call sub_485D1C
- code:004E4400 add esp, 4
- code:004E4403 push eax
- code:004E4404 call sub_485FA2
- code:004E4409 add esp, 8
- code:004E440C cmp eax, 0
- code:004E440F jz short loc_4E4418
- code:004E4411 mov eax, 0
- code:004E4416 jmp short loc_4E448B
Code (Assembler) : Убрать нумерацию
- ; Символ "3"
- code:004E4418 movzx eax, ds:word_5418BC
- code:004E441F mov eax, eax
- code:004E4421 push eax
- code:004E4422 call sub_485D1C
- code:004E4427 add esp, 4
- code:004E442A push eax
- ; 4-й символ
- code:004E442B movzx eax, word ptr [ebx+12h]
- code:004E442F mov eax, eax
- code:004E4431 push eax
- code:004E4432 call sub_485D1C
- code:004E4437 add esp, 4
- code:004E443A push eax
- code:004E443B call sub_485FA2
- code:004E4440 add esp, 8
- code:004E4443 cmp eax, 0
- code:004E4446 jz short loc_4E444F
- code:004E4448 mov eax, 0
- code:004E444D jmp short loc_4E448B
Code (Assembler) : Убрать нумерацию
- ; Символ "8"
- code:004E444F movzx eax, ds:word_5418BE
- code:004E4456 mov eax, eax
- code:004E4458 push eax
- code:004E4459 call sub_485D1C
- code:004E445E add esp, 4
- code:004E4461 push eax
- ; 5-й символ
- code:004E4462 movzx eax, word ptr [ebx+14h]
- code:004E4466 mov eax, eax
- code:004E4468 push eax
- code:004E4469 call sub_485D1C
- code:004E446E add esp, 4
- code:004E4471 push eax
- code:004E4472 call sub_485FA2
- code:004E4477 add esp, 8
- code:004E447A cmp eax, 0
- code:004E447D jz short loc_4E4486
- code:004E447F mov eax, 0
- code:004E4484 jmp short loc_4E448B
Осталось собрать все вместе. Итоговый серийный номер будет иметь вид "XRX38X00000". Закрываем отладчик, запускаем игру и пробуем регистрацию с найденным серийным номером.
Программа успешно зарегистрирована
Игра благодарит нас за регистрацию. Вот и все, алгоритм проверки серийного номера полностью разобран, рабочий кейген вы можете нарисовать самостоятельно.
Просмотров: 1789 | Комментариев: 8
Метки: исследование защиты, игры
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
user
(21.04.2018 в 20:54):
Что-то игруля совсем паскудно работает - замирает, дёргается..
Наверное, требует дополнительно каких-то графических библиотек в системе.
Наверное, требует дополнительно каких-то графических библиотек в системе.
user
(21.04.2018 в 13:58):
А мне такие вот игры не нравятся.
Они подразумевают, что решение существует, ( - иначе о чём игра ?..)
однако в жизни и так полно не менее сложных заморочек,
которые к тому же решение имеют далеко не всегда.
user
(21.04.2018 в 13:44):
Новая версия патчится похожим образом,
только строчки с месиджами они попрятали,
процедуру проверки найти сложнее.
только строчки с месиджами они попрятали,
процедуру проверки найти сложнее.
user
(21.04.2018 в 13:20):
Та ссылка, что я дал в прошлом посте, рабочая.
Правда, там уже качается другая версия, - не та, что описана в статье.
Правда, там уже качается другая версия, - не та, что описана в статье.
ManHunter
(21.04.2018 в 13:16):
По моей истории загрузок ссылки битые, и на сайте нет ссылок на эту страницу. Да и версия другая, алгоритм подбора серийника не срабатывает.
user
(21.04.2018 в 13:06):
>> И игру Theseus and the Minotaur вы там тоже не найдете, все ссылки битые.
--Ну почему же? - Скачивается нормально отсюда:
www.kristanix.com/theseusandtheminotaur/
Вот яндекс-диск как раз недоступен напрямую, а из-под проксей не качается.
--Ну почему же? - Скачивается нормально отсюда:
www.kristanix.com/theseusandtheminotaur/
Вот яндекс-диск как раз недоступен напрямую, а из-под проксей не качается.
бурундук
(18.04.2018 в 05:25):
Спасибо за наводку. Очень интересная игра для мозгов. Собираю такие игры
Добавить комментарий
Заполните форму для добавления комментария
Как то у вас логики нету. Открою секрет - во всех играх существует решение. Иначе - зачем тогда игры?
Подскажите - сколько всего уровней в вылеченной игре? я прошёл только 87 уровней и дальше не видно уровней. Но я ее не ломал - использовал песочницу. После очистки песочницы - счетчик прекрасно скидывается.
Сам нашёл ответ - всего 87 уровней и есть. Жаль что так мало. Я их как орешки теперь щёлкаю.