Исследование защиты игры Chess Marvel
Скриншот игры Chess Marvel
Chess Marvel - вариант игры в шахматы. Можно выбрать три уровня сложности или сыграть за одним компьютером с товарищем. Без регистрации доступен только самый легкий уровень. Кому-то будет интересно поразминать мозги на шахматном поле, а я предпочитаю делать это, глядя на строчки кода.
Забираем с сайта дистрибутив, устанавливаем, запускаем. При попытке сменить сложность или посмотреть информацию о программе, открывается окно регистрации:
Окно регистрации
В окне регистрации есть некий "Registration Id" и поле для ввода серийного номера. На левые данные игра реагирует вот таким сообщением:
Сообщение о неправильной регистрации
Исполняемый файл ничем не упакован, отправляем его на разбор в дизассемблер. Когда листинг будет получен, поищем в нем строчку сообщения о неправильной регистрации:
Code (Assembler) : Убрать нумерацию
- .text:004725C0 lea eax, [ebp+var_28]
- .text:004725C3 push eax
- .text:004725C4 call __vbaObjSet
- .text:004725C9 mov ebx, [eax]
- .text:004725CB push offset aRegistrationIn
- ; "Registration incomplete."
- .text:004725D0 push offset asc_44A8A0 ; "\r\n"
- .text:004725D5 mov [ebp+var_7C], eax
- .text:004725D8 call __vbaStrCat
- .text:004725DD mov edx, eax
- .text:004725DF lea ecx, [ebp+var_1C]
- .text:004725E2 call __vbaStrMove
- .text:004725E7 push eax
- .text:004725E8 push offset aPleaseEnterReg
- ; "Please enter Registration Code again"
- .text:004725ED call __vbaStrCat
- .text:004725F2 mov edx, eax
- .text:004725F4 lea ecx, [ebp+var_20]
- .text:004725F7 call __vbaStrMove
Code (Assembler) : Убрать нумерацию
- .text:004724AE mov [ebp+var_38], 8
- ; Перевод строки в верхний регистр
- .text:004724B5 call rtcUpperCaseVar
- .text:004724BA lea eax, [ebp+var_48]
- .text:004724BD push eax
- .text:004724BE lea eax, [ebp+var_58]
- .text:004724C1 push eax
- ; Обрезать лишние пробелы по краям
- .text:004724C2 call rtcTrimVar
- .text:004724C7 lea eax, [ebp+var_78]
- .text:004724CA push eax
- .text:004724CB lea eax, [ebp+var_58]
- .text:004724CE push eax
- ; Сравнение строк
- .text:004724CF call __vbaVarTstEq
- .text:004724D4 lea ecx, [ebp+var_28]
- .text:004724D7 mov [ebp+var_84], eax
Программа написана на древнем VB5, так что автоматические инструменты для отслеживания функций сравнения строк типа vbaStrCmp 2.1 от RESURRECTiON тут не помогут. Придется поискать в ручном режиме. Загружаем игрушку в отладчик, ставим точку останова на начало функции проверки по адресу 00472366 и повторяем попытку регистрации. Когда точка останова сработает, пройдем в отладчике в пошаговом режиме до момента сравнения строк. Достигнув пункта назначения, обратим внимание на стек:
Серийники на стеке
Получается, что введенный левый серийник сравнивается с красивой строкой "613F-0B3E-1B3D-1053". Сохраним строчку в сухом прохладном месте и еще раз повторим регистрацию, но уже с найденной строкой. На этот раз сравнение пройдет удачно и игра поблагодарит нас за регистрацию:
Игра успешно зарегистрирована
После перезапуска игры в обычном режиме регистрация сохраняется, все ограничения сняты и все работает как надо. Цель вроде бы достигнута, но есть одно "но". Активация привязана к компьютеру, так что если вы вдруг захотите перекинуть игру на флешку и поиграть на другом компьютере, то регистрацию придется повторять заново, причем совершенно другими данными. Неудобно. Придется сделать так, чтобы игра работала или с любым серийником, или вообще без него. Для этого будем использовать точечную бинарную хирургию, или, проще говоря, патч.
Введенный серийник и прочие свои настройки игра хранит в ключе реестра HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Chess Marvel\Startup, за серийник отвечает строковый параметр RegCode. Очевидно, что при старте игра должна считывать из реестра сохраненное значение и затем сравнивать его с нужным. Поищем в коде, где это делается.
Code (Assembler) : Убрать нумерацию
- .text:0045BC08 movsd
- .text:0045BC09 movsd
- .text:0045BC0A movsd
- ; Прочитать серийник из реестра
- .text:0045BC0B push offset aRegcode ; "RegCode"
- .text:0045BC10 push offset aStartup ; "Startup"
- .text:0045BC15 push dword ptr [ebp-2Ch]
- .text:0045BC18 movsd
- .text:0045BC19 call rtcGetSetting
- .text:0045BC1E mov edx, eax
- .text:0045BC20 lea ecx, [ebp-20h]
- .text:0045BC23 call __vbaStrMove
- .text:0045BC28 lea ecx, [ebp-2Ch]
- .text:0045BC2B call __vbaFreeStr
- .text:0045BC30 lea ecx, [ebp-5Ch]
- .text:0045BC33 call __vbaFreeObj
- .text:0045BC38 push dword ptr [ebp-20h]
- .text:0045BC3B push ebx
- .text:0045BC3C call __vbaStrCmp
- .text:0045BC41 test eax, eax
- .text:0045BC43 jz loc_45BD08
- .text:0045BC49 xor edi, edi
- ...
- ...
- ...
- .text:0045BCE6 lea ecx, [ebp-1Ch]
- .text:0045BCE9 mov [ebp-2Ch], edi
- .text:0045BCEC call __vbaStrMove
- .text:0045BCF1 push dword ptr [ebp-1Ch]
- .text:0045BCF4 push dword ptr [ebp-20h]
- .text:0045BCF7 call __vbaStrCmp
- .text:0045BCFC test eax, eax
- .text:0045BCFE jnz short loc_45BD08
- ; По итогу всех проверок записать в word_476378 значение 0FFFFh
- .text:0045BD00 or word_476378, 0FFFFh
- .text:0045BD08 loc_45BD08:
- ; Все проверки пройдены?
- .text:0045BD08 cmp word_476378, 0FFFFh
- ; Нет, программа не зарегистрирована
- .text:0045BD10 jnz loc_45BFDB
- .text:0045BD16 cmp dword_4768C8, 0
- .text:0045BD1D jnz short loc_45BD2E
- .text:0045BD1F push offset dword_4768C8
- .text:0045BD24 push offset dword_449E3C
Code (Assembler) : Убрать нумерацию
- .text:0045BD08 cmp word_476378, 0FFFFh
Просмотров: 1874 | Комментариев: 5
Метки: исследование защиты, игры
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(27.01.2019 в 22:52):
Потому что дизассемблер - это IDA Pro
Амир
(27.01.2019 в 22:43):
Попробовал повторить Ваши действия используя дизассемблер "Hacher`s Disassembler 1.06". Использовал поиск, но нужные строчки не нашлись. Перешел к адресам указанным в Вашем описании и увидел, что закомментированных строк (; "Registration incomplete.") в моем листинге нет. Вопрос их вы добавили или мой дизассемблер работает по-другому?
xussr
(17.11.2018 в 21:27):
Совсем ничего не понятно как найти параметр сравнивания там черт ногу сломит может каким то конкретным инструментом ну не сильны мы в теории как бы это по простому можно решить тем паче что шахматы не интересуют а вот с доменом поиграться только там кажется какой то приват протектор навешан
ManHunter
(01.11.2018 в 10:40):
1. Сперва думал и его задействовать, но обошелся отладчиком и IDA
2. Можно ковырять крякмисы, а можно развлекаться на реальном софте. Я предпочитаю второй вариант. Опять же визуальный басиц для разнообразия, давно не было. Не надо воспринимать это как какие-то рекомендации по софту, я же не говорю, что это прям суперские шахматы, которые в обязательном порядке должны быть у всех. На месте этого "рудимента" мог оказаться какой-нибудь видеоконвертер или блокнот, но вот оказались шахматы.
2. Можно ковырять крякмисы, а можно развлекаться на реальном софте. Я предпочитаю второй вариант. Опять же визуальный басиц для разнообразия, давно не было. Не надо воспринимать это как какие-то рекомендации по софту, я же не говорю, что это прям суперские шахматы, которые в обязательном порядке должны быть у всех. На месте этого "рудимента" мог оказаться какой-нибудь видеоконвертер или блокнот, но вот оказались шахматы.
brute
(01.11.2018 в 09:18):
есть несколько вопросов:
1. почему не указан в качестве инструментов VBDecompilerPro? - по политическим мотивам?)
2. зачем ковырять этот древний рудимент? Куча программ позволяют бесплатно поиграть с разными движками и между людьми по сети. При этом имеют красивый современный интерфейс.
Лучший шахматный сайт с варезом:
http://immortalchess.net/forum/index.php
1. почему не указан в качестве инструментов VBDecompilerPro? - по политическим мотивам?)
2. зачем ковырять этот древний рудимент? Куча программ позволяют бесплатно поиграть с разными движками и между людьми по сети. При этом имеют красивый современный интерфейс.
Лучший шахматный сайт с варезом:
http://immortalchess.net/forum/index.php
Добавить комментарий
Заполните форму для добавления комментария