Blog. Just Blog

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

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

Tetris XP - очень приятный вариант тетриса, хоть и старенький, но прекрасно работающий на современных системах. Есть несколько вариантов игры - для спокойного времяпрепровождения и режим со всякими усложнениями типа внезапно возникающих корявых мега-фигур. За давностью лет офсайт игры прекратил существование, приобрести лицензию негде. А поиграть очень хочется.

Распаковываем исполняемый файл
Распаковываем исполняемый файл

Забираем с файлообменника дистрибутив, устанавливаем, смотрим. Главный исполняемый файл защищен навесным протектором ASProtect какой-то древней версии. С ней легко справляется даже статический распаковщик CASPR. На всякий случай убедимся, что распакованный файл запускается, после чего отправляем его на разбор в дизассемблер.

Триальная версия программы
Триальная версия программы

Для ознакомления с игрой дается всего 50 запусков, после чего триал заканчивается и кнопка запуска становится неактивной.

Триальный период закончился
Триальный период закончился

С этим понятно. У нас есть строки "Unregistered version", есть строка счетчика "NN executions left for evaluation", для начала этого достаточно. Поиском по листингу дизассемблера выходим на следующий код:
  1. seg000:004191D2                 push    0FAh            ; nSize
  2. seg000:004191D7                 push    offset byte_47E810 ; lpReturnedString
  3. seg000:004191DC                 push    offset aHttpWww_alawar
  4. ; "http://www.alawar.com/games/tetris4000"
  5. seg000:004191E1                 push    offset aHomepageUrl
  6. ; "Homepage URL"
  7. seg000:004191E6                 push    offset aRegistrationIn
  8. ; "Registration info"
  9. seg000:004191EB                 call    esi ; GetPrivateProfileStringA
  10. seg000:004191ED                 push    1               ; nCmdShow
  11. seg000:004191EF                 push    edi             ; hWnd
  12. seg000:004191F0                 call    ds:ShowWindow
  13. ; Проверить флаг регистрации
  14. seg000:004191F6                 mov     al, ds:byte_4494F0
  15. ; Если AL=0, то программа зарегистрирована
  16. seg000:004191FB                 test    al, al
  17. seg000:004191FD                 jz      loc_41938F      ; default
  18. seg000:00419203                 mov     ebx, ds:GetDlgItem
  19. seg000:00419209                 push    3EBh            ; nIDDlgItem
  20. seg000:0041920E                 push    edi             ; hDlg
  21. seg000:0041920F                 call    ebx ; GetDlgItem
  22. seg000:00419211                 push    3ECh            ; nIDDlgItem
  23. seg000:00419216                 mov     esi, eax
  24. seg000:00419218                 push    edi             ; hDlg
  25. seg000:00419219                 mov     [esp+69Ch+var_684], esi
  26. seg000:0041921D                 call    ebx ; GetDlgItem
  27. seg000:0041921F                 mov     edx, ds:lpString
  28. seg000:00419225                 mov     ebx, ds:lstrlenA
  29. seg000:0041922B                 push    edx             ; lpString
  30. seg000:0041922C                 mov     [esp+698h+hWnd], eax
  31. seg000:00419230                 call    ebx ; lstrlenA
  32. seg000:00419232                 test    eax, eax
  33. seg000:00419234                 jg      short loc_419264
  34. seg000:00419236                 mov     eax, ds:wParam
  35. seg000:0041923B                 push    eax
  36. seg000:0041923C                 lea     ecx, [esp+698h+var_550]
  37. seg000:00419243                 push    offset aDExecutionsLef
  38. ; "%d executions left for evaluation"
  39. seg000:00419248                 push    ecx
  40. seg000:00419249                 call    sub_43088D
  41. seg000:0041924E                 mov     eax, [esp+6A0h+hWnd]
  42. seg000:00419252                 add     esp, 0Ch
  43. seg000:00419255                 lea     edx, [esp+694h+var_550]
Что тут происходит, надеюсь, подробно пояснять не надо. Проверяется значение байта-флага, по результатам проверки или выводится сообщение со счетчиком запусков или этот участок кода перепрыгивается. Давайте посмотрим, где и как этот флаг инициализируется.

Флаг в сегменте данных
Флаг в сегменте данных

Мы видим, что этот байт сразу же инициализирован значением 1, то есть программа не зарегистрирована, а по перекрестным ссылкам выясняем, что значение флага нигде не меняется, только считывается его значение. Если посмотреть две оставшиеся перекрестные ссылки, то в коде по одной из них также выводится или не выводится строка "Unregistered...", это уже про основное окно игры.
  1. seg000:0041850A                 jg      short loc_418554
  2. ; Проверить флаг регистрации
  3. seg000:0041850C                 mov     al, ds:byte_4494F0
  4. ; Если AL=0, то программа зарегистрирована
  5. seg000:00418511                 test    al, al
  6. seg000:00418513                 jz      short loc_418554
  7. seg000:00418515                 fild    ds:dword_449B2C
  8. seg000:0041851B                 push    1               ; char
  9. seg000:0041851D                 push    0               ; color
  10. seg000:0041851F                 push    0FFFFFFh        ; int
  11. seg000:00418524                 fmul    ds:flt_43B01C
  12. seg000:0041852A                 push    offset h        ; int
  13. seg000:0041852F                 push    offset aUnregistered__
  14. ; "Unregistered..."
  15. seg000:00418534                 call    sub_430818
  16. seg000:00418539                 fild    ds:dword_449B28
  17. seg000:0041853F                 push    eax             ; y
  18. seg000:00418540                 fmul    ds:flt_43B008
  19. seg000:00418546                 call    sub_430818
Открываем исполняемый файл в HEX-редакторе, заменяем байт по смещению 488F0 с 01 на 00, сохраняем изменения.

Игра успешно "зарегистрирована"
Игра успешно "зарегистрирована"

При запуске в стартовом окне красуется надпись "Full version", все ограничения по запускам пропали, цель достигнута. Теперь можно играть сколько угодно.

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

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

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

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

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