Исследование защиты игры Peggle Deluxe
Скриншот игры Peggle Deluxe
Игра Peggle Deluxe - увлекательная смесь из арканоида, зумы и пинбола, отличная убивалка свободного времени. Авторство принадлежит знаменитой компании PopCap Games, так что и методы борьбы с первой линией защиты стандартные. Почему с первой? Потому что дальше, как в игре, начинается самое интересное.
После всех административных изменений в компании, найти рабочий дистрибутив игры стало не так просто, поэтому выкладываю его на файлообменник. После установки убираем враппер, переносим основной исполняемый файл в папку с игрой. Вроде бы все работает, но после прохождения нескольких уровней вываливается сообщение, что для доступа к следующим уровням игру надо бы зарегистрировать.
Сообщение незарегистрированной версии
Точно так же заблокированы уровни в быстрой игре и нельзя выбирать животных-помощников. Причем это абсолютно точно не какой-то оставшийся элемент навесной защиты, все ограничения выполнены в дизайне игры.
Ограничение незарегистрированной версии
Ограничение незарегистрированной версии
Почему игра требует регистрацию даже после снятия враппера? Ответ прост. Это игра их собственного производства, распространяли авторы ее через свой сайт, навесная защита была тоже их разработки. Совместить внешнюю и внутреннюю проверки регистрации при наличии исходников не составит никакого труда. Ладно, возвращаемся к исследованиям. Исполняемый файл ничем не упакован, отправляем его в дизассемблер. Поиском по строке "Trial" выходим на следующий код:
Code (Assembler) : Убрать нумерацию
- .text:0041CF05 mov large fs:0, eax
- .text:0041CF0B mov esi, ecx
- .text:0041CF0D mov ecx, [esi+878h]
- .text:0041CF13 test ecx, ecx
- .text:0041CF15 jz loc_41D247
- ; Записать в регистр EDI значение из переданного аргумента
- .text:0041CF1B mov edi, [ebp+arg_0]
- .text:0041CF1E push edi
- .text:0041CF1F call sub_4038C0
- .text:0041CF24 test al, al
- .text:0041CF26 jnz short loc_41CF45
- ; Первое значение для сравнения
- .text:0041CF28 cmp edi, 0Bh
- .text:0041CF2B jz short loc_41CF45
- ; Второе значение для сравнения
- .text:0041CF2D cmp edi, 9
- .text:0041CF30 jnz loc_41D247
- .text:0041CF36 mov ecx, esi
- .text:0041CF38 call sub_41CE00
- .text:0041CF3D test al, al
- .text:0041CF3F jnz loc_41D247
- .text:0041CF45 loc_41CF45:
- .text:0041CF45 mov eax, [esi]
- .text:0041CF47 mov edx, [eax+134h]
- .text:0041CF4D push 0Eh
- .text:0041CF4F mov ecx, esi
- .text:0041CF51 call edx
- ; Записать в EAX значение из EDI
- .text:0041CF53 mov eax, edi
- .text:0041CF55 sub eax, 9
- .text:0041CF58 jz loc_41D11C
- .text:0041CF5E sub eax, 1
- .text:0041CF61 jz loc_41D058
- .text:0041CF67 sub eax, 1
- ; Если после всех вычитаний осталось ненулевое значение, то перепрыгнуть
- ; вывод триальных окон
- .text:0041CF6A jnz loc_41D247
- .text:0041CF70 push offset aClose ; "Close"
- .text:0041CF75 lea ecx, [ebp+var_98]
- .text:0041CF7B call sub_40D9B0
- .text:0041CF80 push offset aTheRestOfAdven
- ; "The rest of Adventure mode is locked in"...
- .text:0041CF85 lea ecx, [ebp+var_60]
- .text:0041CF88 mov [ebp+var_4], 9
- .text:0041CF8F call sub_40D9B0
- .text:0041CF94 push offset aTrialVersion
- ; "Trial Version"
- .text:0041CF99 lea ecx, [ebp+var_B4]
- .text:0041CF9F mov byte ptr [ebp+var_4], 0Ah
- .text:0041CFA3 call sub_40D9B0
- .text:0041CFA8 push 3
- .text:0041CFAA lea eax, [ebp+var_98]
- .text:0041CFB0 push eax
Code (Assembler) : Убрать нумерацию
- .text:004AFD75 mov ecx, [esi+4]
- ; Вызывать функцию проверки
- .text:004AFD78 call sub_405D90
- ; Если AL=0, то перепрыгнуть вывод триального сообщения
- .text:004AFD7D test al, al
- .text:004AFD7F jz short loc_4AFD9E
- .text:004AFD81 mov ecx, [esi+4]
- ; Показать триальное сообщение
- .text:004AFD84 push 0Bh
- .text:004AFD86 call sub_41CEE0
- .text:004AFD8B mov ecx, [ebp+var_C]
- .text:004AFD8E mov large fs:0, ecx
- .text:004AFD95 pop ecx
- .text:004AFD96 pop edi
- .text:004AFD97 pop esi
- .text:004AFD98 mov esp, ebp
- .text:004AFD9A pop ebp
- .text:004AFD9B retn 4
- .text:004AFD9E ; -----------------------------------------------------
- .text:004AFD9E loc_4AFD9E:
- .text:004AFD9E mov eax, [esi+4]
- .text:004AFDA1 mov dword ptr [eax+760h], 1
- .text:004AFDAB mov ecx, [esi+4]
- .text:004AFDAE mov edx, [esi+30h]
Code (Assembler) : Убрать нумерацию
- .text:00405D90 sub_405D90 proc near
- .text:00405D90 push esi
- .text:00405D91 mov esi, ecx
- ; Вызывать функцию проверки
- .text:00405D93 call sub_4057D0
- .text:00405D98 test al, al
- ; Если AL!=0, то вернуть нужный результат
- .text:00405D9A jnz loc_405E28
- .text:00405DA0 mov ecx, esi
- .text:00405DA2 call sub_4057F0
- .text:00405DA7 test al, al
- .text:00405DA9 jz short loc_405DAF
- .text:00405DAB mov al, 1
- .text:00405DAD pop esi
- .text:00405DAE retn
- .text:00405DAF ; -----------------------------------------
- .text:00405DAF loc_405DAF:
- .text:00405DAF mov ecx, [esi+878h]
- .text:00405DB5 test ecx, ecx
- ...
- ...
- ...
- .text:00405E23 cmp [ecx+30h], edx
- .text:00405E26 jge short loc_405E2A
- .text:00405E28 loc_405E28:
- ; Правильный результат проверки
- .text:00405E28 xor al, al
- .text:00405E2A loc_405E2A:
- .text:00405E2A pop esi
- .text:00405E2B retn
- .text:00405E2B sub_405D90 endp
Code (Assembler) : Убрать нумерацию
- .text:004057D0 sub_4057D0 proc near
- .text:004057D0 mov ecx, [ecx+830h]
- .text:004057D6 test ecx, ecx
- .text:004057D8 jz short loc_4057DF
- .text:004057DA jmp sub_431760
- .text:004057DF ; ---------------------------------------
- .text:004057DF loc_4057DF:
- .text:004057DF xor al, al
- .text:004057E1 retn
- .text:004057E1 sub_4057D0 endp
Игра успешно "зарегистрирована"
С защитой покончено, никаких ограничений больше нет, цель достигнута, на этом можно остановиться. Но, как вы может быть помните по предыдущим публикациям, я предпочитаю игры со всеми включенными читами, трейнерами, бесконечными жизнями и т.п. У меня не так много свободного времени, и процесс игры должен доставлять удовольствие, а не нервяки из-за провальных попыток пройти какой-нибудь уровень. Вот и тут я тоже решил привести игрушку к нормальному бою. Ну а что, пациент уже в операционной, все инструменты наготове.
Основной игровой ресурс - шарики, с них и начнем. Дизассемблер не закрываем, он еще понадобится. Запускаем игрушку в отладчике, параллельно запускаем инструмент для поиска и отслеживания изменений значений в памяти - ArtMoney.
Отслеживание изменения значения в памяти
Надеюсь, что вы умете пользоваться ArtMoney, если нет, то бегом курить мануалы. Определив адрес в памяти, по которому хранится оставшееся количество шариков, возвращаемся в отладчик и в окне дампа переходим на нужный адрес.
Ставим точку останова на запись в память
По определенному ранее адресу устанавливаем хардварную точку останова на запись DWORD. Теперь при любом изменении количества шариков мы узнаем место в коде, где это происходит. Отпускаем игру на выполнение и играем до потери шарика.
Точка останова сработала
Когда точка останова сработает, мы окажемся на адресе, где в ячейку памяти заносится новое значение. Как видим, тут к ячейке памяти прибавляется значение регистра ECX. Я не любитель изучать код в отладчике, поэтому переходим в дизассемблер.
Code (Assembler) : Убрать нумерацию
- .text:0045D880 push ebp
- .text:0045D881 mov ebp, esp
- .text:0045D883 push esi
- .text:0045D884 mov esi, ecx
- .text:0045D886 mov eax, [esi+128h]
- ; Записать в регистр ECX значение из параметров
- .text:0045D88C mov ecx, [ebp+arg_0]
- ; Увеличить количество шаров на переданное значение
- .text:0045D88F add [esi+eax*4+17Ch], ecx
- .text:0045D896 test ecx, ecx
- .text:0045D898 lea eax, [esi+eax*4+17Ch]
- .text:0045D89F jle short loc_45D8D0
- .text:0045D8A1 cmp [ebp+arg_8], 0
- .text:0045D8A5 jz short loc_45D8BE
- .text:0045D8A7 mov ecx, [ebp+arg_4]
- .text:0045D8AA mov edx, [esi+104h]
- .text:0045D8B0 push ecx
Code (Assembler) : Убрать нумерацию
- .text:0046AD82 push 1
- .text:0046AD84 push 0
- ; Регистр EDI = -1
- .text:0046AD86 or edi, 0FFFFFFFFh
- .text:0046AD89 push edi
- .text:0046AD8A mov ecx, esi
- ; Изменить количество оставшихся шариков
- .text:0046AD8C call sub_45D880
С вечной жизнью разобрались. Но в игре есть еще один приятный момент, выражаемый числовым значением. На разных уровнях дается несколько бонусных действий в виде снайперских выстрелов, расширения уловителя, фаерболов и т.п. При каждом использовании бонусов их общее количество уменьшается, что не есть хорошо.
Возвращаемся в ArtMoney, после активации зеленого шарика и получения бонусного пакета находим адрес в памяти, где записано количество оставшихся плюшек. Действия аналогичны тем, что описаны выше. Ставим в отладчике точку останова на изменение значения.
Точка останова сработала
Тут для уменьшения значения также используется команда сложения с числом -1. В отладчике проверяем, что это не отдельная функция, а просто кусочек линейного кода.
Code (Assembler) : Убрать нумерацию
- .text:00461585 mov ecx, [esi+128h]
- .text:0046158B lea eax, [edi+edi]
- .text:0046158E add ecx, eax
- .text:00461590 cmp dword ptr [esi+ecx*4+1D4h], 0
- .text:00461598 lea ecx, [esi+ecx*4+1D4h]
- .text:0046159F jle short loc_4615A4
- ; Уменьшение количества бонусных действий
- .text:004615A1 add dword ptr [ecx], 0FFFFFFFFh
- .text:004615A4 loc_4615A4:
- .text:004615A4 mov edx, [esi+128h]
- .text:004615AA add edx, eax
- .text:004615AC cmp dword ptr [esi+edx*4+1D4h], 0
- .text:004615B4 mov ecx, esi
- .text:004615B6 setnz al
- .text:004615B9 push eax
- .text:004615BA push edi
Просмотров: 1423 | Комментариев: 6
Метки: исследование защиты, игры
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(16.09.2022 в 11:21):
Спасибо!
Серый
(16.09.2022 в 11:19):
85 PopCap Games official links
https://pastebin.com/tDrHB0ij
https://pastebin.com/tDrHB0ij
ManHunter
(16.09.2022 в 10:59):
Серый, вот еще бы какую-нибудь стартовую страницу со списком установщиков, и было бы вообще замечательно.
Серый
(16.09.2022 в 10:15):
Игра, как и все 85 установщиков игр PopCap, до сих пор доступна по официальному адресу:
static-www.ec.popcap.com/binaries/popcap_downloads/PeggleSetup.exe
Оптимальным вариантом регистрации обычному пользователю (всех 85 игр PopCap) является
Universal.PopCap.keygen.v1.2-THETA.zip
static-www.ec.popcap.com/binaries/popcap_downloads/PeggleSetup.exe
Оптимальным вариантом регистрации обычному пользователю (всех 85 игр PopCap) является
Universal.PopCap.keygen.v1.2-THETA.zip
NobootRecord
(08.09.2022 в 19:48):
Ооооо, легендарная игра, рубился в неё несколько лет назад на ноутбуке с Intel Pentium IV и Windows XP. Помнится, даже играл в пиратскую версию Peggle Nights Deluxe с русским интерфейсом. Это был 2017-2018 год, классные времена были...
Добавить комментарий
Заполните форму для добавления комментария
http://web.archive.org/web/201...mes/pc-games