Blog. Just Blog

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

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

Chess Marvel - вариант игры в шахматы. Можно выбрать три уровня сложности или сыграть за одним компьютером с товарищем. Без регистрации доступен только самый легкий уровень. Кому-то будет интересно поразминать мозги на шахматном поле, а я предпочитаю делать это, глядя на строчки кода.

Забираем с сайта дистрибутив, устанавливаем, запускаем. При попытке сменить сложность или посмотреть информацию о программе, открывается окно регистрации:

Окно регистрации
Окно регистрации

В окне регистрации есть некий "Registration Id" и поле для ввода серийного номера. На левые данные игра реагирует вот таким сообщением:

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

Исполняемый файл ничем не упакован, отправляем его на разбор в дизассемблер. Когда листинг будет получен, поищем в нем строчку сообщения о неправильной регистрации:
  1. .text:004725C0                 lea     eax, [ebp+var_28]
  2. .text:004725C3                 push    eax
  3. .text:004725C4                 call    __vbaObjSet
  4. .text:004725C9                 mov     ebx, [eax]
  5. .text:004725CB                 push    offset aRegistrationIn
  6. ; "Registration incomplete."
  7. .text:004725D0                 push    offset asc_44A8A0 ; "\r\n"
  8. .text:004725D5                 mov     [ebp+var_7C], eax
  9. .text:004725D8                 call    __vbaStrCat
  10. .text:004725DD                 mov     edx, eax
  11. .text:004725DF                 lea     ecx, [ebp+var_1C]
  12. .text:004725E2                 call    __vbaStrMove
  13. .text:004725E7                 push    eax
  14. .text:004725E8                 push    offset aPleaseEnterReg
  15. ; "Please enter Registration Code again"
  16. .text:004725ED                 call    __vbaStrCat
  17. .text:004725F2                 mov     edx, eax
  18. .text:004725F4                 lea     ecx, [ebp+var_20]
  19. .text:004725F7                 call    __vbaStrMove
Надо найти условие, при котором выводится эта надпись. Листаем выше.
  1. .text:004724AE                 mov     [ebp+var_38], 8
  2. ; Перевод строки в верхний регистр
  3. .text:004724B5                 call    rtcUpperCaseVar
  4. .text:004724BA                 lea     eax, [ebp+var_48]
  5. .text:004724BD                 push    eax
  6. .text:004724BE                 lea     eax, [ebp+var_58]
  7. .text:004724C1                 push    eax
  8. ; Обрезать лишние пробелы по краям
  9. .text:004724C2                 call    rtcTrimVar
  10. .text:004724C7                 lea     eax, [ebp+var_78]
  11. .text:004724CA                 push    eax
  12. .text:004724CB                 lea     eax, [ebp+var_58]
  13. .text:004724CE                 push    eax
  14. ; Сравнение строк
  15. .text:004724CF                 call    __vbaVarTstEq
  16. .text:004724D4                 lea     ecx, [ebp+var_28]
  17. .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. Очевидно, что при старте игра должна считывать из реестра сохраненное значение и затем сравнивать его с нужным. Поищем в коде, где это делается.
  1. .text:0045BC08                 movsd
  2. .text:0045BC09                 movsd
  3. .text:0045BC0A                 movsd
  4. ; Прочитать серийник из реестра
  5. .text:0045BC0B                 push    offset aRegcode ; "RegCode"
  6. .text:0045BC10                 push    offset aStartup ; "Startup"
  7. .text:0045BC15                 push    dword ptr [ebp-2Ch]
  8. .text:0045BC18                 movsd
  9. .text:0045BC19                 call    rtcGetSetting
  10. .text:0045BC1E                 mov     edx, eax
  11. .text:0045BC20                 lea     ecx, [ebp-20h]
  12. .text:0045BC23                 call    __vbaStrMove
  13. .text:0045BC28                 lea     ecx, [ebp-2Ch]
  14. .text:0045BC2B                 call    __vbaFreeStr
  15. .text:0045BC30                 lea     ecx, [ebp-5Ch]
  16. .text:0045BC33                 call    __vbaFreeObj
  17. .text:0045BC38                 push    dword ptr [ebp-20h]
  18. .text:0045BC3B                 push    ebx
  19. .text:0045BC3C                 call    __vbaStrCmp
  20. .text:0045BC41                 test    eax, eax
  21. .text:0045BC43                 jz      loc_45BD08
  22. .text:0045BC49                 xor     edi, edi
  23. ...
  24. ...
  25. ...
  26. .text:0045BCE6                 lea     ecx, [ebp-1Ch]
  27. .text:0045BCE9                 mov     [ebp-2Ch], edi
  28. .text:0045BCEC                 call    __vbaStrMove
  29. .text:0045BCF1                 push    dword ptr [ebp-1Ch]
  30. .text:0045BCF4                 push    dword ptr [ebp-20h]
  31. .text:0045BCF7                 call    __vbaStrCmp
  32. .text:0045BCFC                 test    eax, eax
  33. .text:0045BCFE                 jnz     short loc_45BD08
  34. ; По итогу всех проверок записать в word_476378 значение 0FFFFh
  35. .text:0045BD00                 or      word_476378, 0FFFFh
  36. .text:0045BD08 loc_45BD08:
  37. ; Все проверки пройдены?
  38. .text:0045BD08                 cmp     word_476378, 0FFFFh
  39. ; Нет, программа не зарегистрирована
  40. .text:0045BD10                 jnz     loc_45BFDB
  41. .text:0045BD16                 cmp     dword_4768C8, 0
  42. .text:0045BD1D                 jnz     short loc_45BD2E
  43. .text:0045BD1F                 push    offset dword_4768C8
  44. .text:0045BD24                 push    offset dword_449E3C
Часть кода я пропустил, там выполняются всякие расчеты и проверки. По итогу все сводится к установке нужного значения в ячейку памяти word_476378. Можно взять и пропатчить все промежуточные условные переходы, а можно сделать красивее. Как вы видите, основная проверка выполняется командой
  1. .text:0045BD08                 cmp     word_476378, 0FFFFh
после которой находится условный переход на триальную ветку алгоритма. Правильным вариантом для патча будет замена операции проверки на принудительную инициализацию переменной нужным значением MOV word_476378, 0FFFFh, а остаток условного перехода (команда MOV на один байт длиннее CMP) надо будет забить NOPами. Сохраняем изменения, запускаем. Игра прекрасно работает на любом компьютере даже без какой-либо регистрации. Вот теперь цель точно достигнута.

Поделиться ссылкой ВКонтакте
Просмотров: 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. Можно ковырять крякмисы, а можно развлекаться на реальном софте. Я предпочитаю второй вариант. Опять же визуальный басиц для разнообразия, давно не было. Не надо воспринимать это как какие-то рекомендации по софту, я же не говорю, что это прям суперские шахматы, которые в обязательном порядке должны быть у всех. На месте этого "рудимента" мог оказаться какой-нибудь видеоконвертер или блокнот, но вот оказались шахматы.
brute (01.11.2018 в 09:18):
есть несколько вопросов:
1. почему не указан в качестве инструментов VBDecompilerPro? - по политическим мотивам?)
2. зачем ковырять этот древний рудимент? Куча программ позволяют бесплатно поиграть с разными движками и между людьми по сети. При этом имеют красивый современный интерфейс.
Лучший шахматный сайт с варезом:
http://immortalchess.net/forum/index.php

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

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

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