Blog. Just Blog

Исследование защиты игры Amulet of Tricolor

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

Amulet of Tricolor - это классическая логическая игра в жанре "три в ряд". Геймплей типовой: собирайте цепочки из двух и более одинаковых фишек, цель уровня - собрать нужное число фишек. Если видели хоть одну такую игру, то считайте, что знаете их все. Игра старая, официальные сайты издателей уже не работают. Если захотите поиграть, то сперва придется хорошо постараться и выполнить квест, чтобы найти рабочий дистрибутив, а потом каким-то образом обойти защиту.

Как я сказал, программу продавали разные компании, мне достались "Wiredplane games", будем работать с их дистрибутивом. Устанавливаем, смотрим что тут происходит. Исполняемые файлы с очень характерными названиями - Game.exe и DRMWrapper.exe, да и по размеру можно уже примерно понять, какие файлы будут использоваться.

Триальное окно
Триальное окно

При запуске игры сперва запускается загрузчик DRMWrapper.exe, он ничем не упакован, так что отправляем файл в дизассемблер. Когда он закончит работать, проверим, как ведет себя загрузчик, если попробовать ввести левые регистрационные данные.

Сообщение незарегистрированной игры
Сообщение незарегистрированной игры

При попытке ввести неправильные данные появляется сообщение "Sorry, Registration key is not valid." Отлично, теперь надо посмотреть в листинге код, который выполняется при появлении этого сообщения. Кстати, тут же рядом обнаруживается строка, которая будет показываться при правильной регистрации, - "Registration key accepted, Thanks for registering!" Тут выполняется проверка, а затем самый обычный условный переход. Я немного сократил код, чтобы оставить только важные данные.
  1. ; Выполняется проверка
  2. .text:00415F75                 cmp     [ebp+var_10], 0
  3. ; Переход в случае ошибки
  4. .text:00415F79                 jz      loc_41603B
  5. ; Переход если все хорошо
  6. .text:00415F7F                 push    ecx
  7. .text:00415F80                 mov     ecx, esp
  8. ...
  9. ...
  10. .text:00415FB2                 push    0               ; int
  11. .text:00415FB4                 push    0               ; uType
  12. .text:00415FB6                 push    offset aRegistrationKe
  13. ; "Registration key accepted, Thanks for r"...
  14. .text:00415FBB                 push    offset aRegkey_good ; "REGKEY_GOOD"
  15. .text:00415FC0                 lea     edx, [ebp+var_14C]
  16. .text:00415FC6                 push    edx             ; int
  17. .text:00415FC7                 call    sub_411050
  18. ...
  19. ...
  20. .text:00416031                 jmp     loc_4160FF
  21. .text:0041603B ; ---------------------------------------------------
  22. .text:0041603B loc_41603B:
  23. .text:0041603B                 push    ecx
  24. .text:0041603C                 mov     ecx, esp
  25. ...
  26. ...
  27. .text:00416064                 call    sub_415BB0
  28. .text:00416069                 cmp     [ebp+arg_4], 0
  29. .text:0041606D                 jnz     short loc_4160C2
  30. .text:0041606F                 push    0               ; int
  31. .text:00416071                 push    0               ; uType
  32. .text:00416073                 push    offset aSorryRegistrat
  33. ; "Sorry, Registration key is not valid."
  34. .text:00416078                 push    offset aRegkey_bad ; "REGKEY_BAD"
  35. .text:0041607D                 lea     eax, [ebp+var_158]
  36. .text:00416083                 push    eax             ; int
  37. .text:00416084                 call    sub_411050
  38. .text:00416089                 add     esp, 0Ch
  39. ...
  40. ...
  41. .text:004160EE                 jmp     short loc_4160FF
В проверке видно, что используется переменная [ebp+var_10], и если ее значение будет равно 0, то выполнится переход на ошибку. Ну и, соответственно, любое другое значение считается успешной регистрацией. Посмотрим, как эта переменная используется.
  1. .text:00415F22                 mov     [ebp+var_128], edx
  2. .text:00415F28                 push    0               ; int
  3. .text:00415F2A                 push    offset aGaotd   ; "GAOTD"
  4. .text:00415F2F                 lea     ecx, [ebp+arg_0]
  5. .text:00415F32                 call    sub_4016A0
  6. .text:00415F37                 cmp     eax, 0FFFFFFFFh
  7. .text:00415F3A                 jz      short loc_415F4C
  8. .text:00415F3C                 cmp     [ebp+var_128], 0
  9. .text:00415F43                 jz      short loc_415F4C
  10. .text:00415F45                 mov     [ebp+var_10], 1
  11. .text:00415F4C loc_415F4C:
Похоже, что где-то используется строка "GAOTD" - игра где-то засветилась на площадке Giveaway of the Day.
  1. .text:00415E13                 push    0               ; int
  2. .text:00415E15                 push    offset a1978    ; "1978"
  3. .text:00415E1A                 lea     ecx, [ebp+arg_0]
  4. .text:00415E1D                 call    sub_4016A0
  5. .text:00415E22                 cmp     eax, 0FFFFFFFFh
  6. .text:00415E25                 jnz     short loc_415E7B
  7. .text:00415E27                 push    0               ; int
  8. .text:00415E29                 push    offset a2239    ; "2239"
  9. .text:00415E2E                 lea     ecx, [ebp+arg_0]
  10. .text:00415E31                 call    sub_4016A0
  11. .text:00415E36                 cmp     eax, 0FFFFFFFFh
  12. .text:00415E39                 jnz     short loc_415E7B
  13. .text:00415E3B                 push    0               ; int
  14. .text:00415E3D                 push    offset a1746    ; "1746"
  15. .text:00415E42                 lea     ecx, [ebp+arg_0]
  16. .text:00415E45                 call    sub_4016A0
  17. .text:00415E4A                 cmp     eax, 0FFFFFFFFh
  18. .text:00415E4D                 jnz     short loc_415E7B
  19. .text:00415E4F                 push    0               ; int
  20. .text:00415E51                 push    offset a9458    ; "9458"
  21. .text:00415E56                 lea     ecx, [ebp+arg_0]
  22. .text:00415E59                 call    sub_4016A0
Или вот такие строчки - это даже больше похоже на кусочки ключа. Так или иначе, после проверки все такие строки приводят к выполнению mov [ebp+var_10], 1. Как легко предположить, раз переменная меняется при выполнении условия, значит должна быть и инициализация. Чтобы если ни одно условие не выполнится, код перешел к ошибке.
  1. .text:00415D37                 call    sub_406A70
  2. .text:00415D3C                 lea     ecx, [ebp+arg_0]
  3. .text:00415D3F                 call    sub_416180
  4. ; Инициализация переменной
  5. .text:00415D44                 mov     [ebp+var_10], 0
  6. .text:00415D4B                 mov     [ebp+var_114], 0
  7. .text:00415D52                 push    0FFh            ; size_t
  8. .text:00415D57                 push    0               ; int
  9. .text:00415D59                 lea     eax, [ebp+var_113]
  10. .text:00415D5F                 push    eax             ; void *
  11. .text:00415D60                 call    _memset
И действительно, в самом начале функции выполняется инициализация. Заменяем mov [ebp+var_10], 0 на mov [ebp+var_10], 1 и теперь в любом раскладе всегда будет использоваться флаг "все хорошо". Получается патч в один байт. Сохраняем изменения, проверяем.

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

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

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

Ошибка активации
Ошибка активации

Отправляем исполняемый файл Game.exe в дизассемблер. Строка сообщения у нас известна, так что посмотрим, как оно появляется.
  1. ; Какая-то проверка
  2. .text:004D052C                 cmp     [ebp+var_58], 0
  3. ; Если все хорошо, то выполнить программу
  4. .text:004D0530                 jnz     short loc_4D055A
  5. ; Если ошибка, то выйти с ошибкой
  6. .text:004D0532                 push    offset aDrmError ; "DRM Error"
  7. .text:004D0537                 call    sub_42C267
  8. .text:004D053C                 add     esp, 4
  9. .text:004D053F                 push    0               ; uType
  10. .text:004D0541                 push    offset aActivationErro
  11. ; "Activation error"
  12. .text:004D0546                 push    offset aYouShouldNotRu
  13. ; "You should not run this file. Use links"...
  14. .text:004D054B                 push    0               ; hWnd
  15. .text:004D054D                 call    ds:MessageBoxA
  16. .text:004D0553                 xor     eax, eax
  17. .text:004D0555                 jmp     loc_4D05F4
Тут все просто. Заменяем условный переход JNZ по адресу 004D0530 на безусловный переход JMP. Теперь никакие DRM нам не страшны. Сохраняем изменения, проверяем.

Программа успешно зарегистрирована
Программа успешно зарегистрирована

Вот теперь действительно все. Загрузчик больше не используется, у нас получается чистый дистрибутив с игрой. Цель достигнута.

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

Комментарии

Отзывы посетителей сайта о статье
mirik (12.08.2026 в 23:08):
2й вариант после патча не рабочий. Вылазит окошко после нажатий 4х "Ок"
"Registration required"
"Trial period is over"
"Please register this game to continue playing!"
voffka (27.07.2026 в 07:35):
Или так
00404117 neg eax->not eax

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

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

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