
Исследование защиты игры 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!" Тут выполняется проверка, а затем самый обычный условный переход. Я немного сократил код, чтобы оставить только важные данные.
Code (Assembler) : Убрать нумерацию
- ; Выполняется проверка
- .text:00415F75 cmp [ebp+var_10], 0
- ; Переход в случае ошибки
- .text:00415F79 jz loc_41603B
- ; Переход если все хорошо
- .text:00415F7F push ecx
- .text:00415F80 mov ecx, esp
- ...
- ...
- .text:00415FB2 push 0 ; int
- .text:00415FB4 push 0 ; uType
- .text:00415FB6 push offset aRegistrationKe
- ; "Registration key accepted, Thanks for r"...
- .text:00415FBB push offset aRegkey_good ; "REGKEY_GOOD"
- .text:00415FC0 lea edx, [ebp+var_14C]
- .text:00415FC6 push edx ; int
- .text:00415FC7 call sub_411050
- ...
- ...
- .text:00416031 jmp loc_4160FF
- .text:0041603B ; ---------------------------------------------------
- .text:0041603B loc_41603B:
- .text:0041603B push ecx
- .text:0041603C mov ecx, esp
- ...
- ...
- .text:00416064 call sub_415BB0
- .text:00416069 cmp [ebp+arg_4], 0
- .text:0041606D jnz short loc_4160C2
- .text:0041606F push 0 ; int
- .text:00416071 push 0 ; uType
- .text:00416073 push offset aSorryRegistrat
- ; "Sorry, Registration key is not valid."
- .text:00416078 push offset aRegkey_bad ; "REGKEY_BAD"
- .text:0041607D lea eax, [ebp+var_158]
- .text:00416083 push eax ; int
- .text:00416084 call sub_411050
- .text:00416089 add esp, 0Ch
- ...
- ...
- .text:004160EE jmp short loc_4160FF
Code (Assembler) : Убрать нумерацию
- .text:00415F22 mov [ebp+var_128], edx
- .text:00415F28 push 0 ; int
- .text:00415F2A push offset aGaotd ; "GAOTD"
- .text:00415F2F lea ecx, [ebp+arg_0]
- .text:00415F32 call sub_4016A0
- .text:00415F37 cmp eax, 0FFFFFFFFh
- .text:00415F3A jz short loc_415F4C
- .text:00415F3C cmp [ebp+var_128], 0
- .text:00415F43 jz short loc_415F4C
- .text:00415F45 mov [ebp+var_10], 1
- .text:00415F4C loc_415F4C:
Code (Assembler) : Убрать нумерацию
- .text:00415E13 push 0 ; int
- .text:00415E15 push offset a1978 ; "1978"
- .text:00415E1A lea ecx, [ebp+arg_0]
- .text:00415E1D call sub_4016A0
- .text:00415E22 cmp eax, 0FFFFFFFFh
- .text:00415E25 jnz short loc_415E7B
- .text:00415E27 push 0 ; int
- .text:00415E29 push offset a2239 ; "2239"
- .text:00415E2E lea ecx, [ebp+arg_0]
- .text:00415E31 call sub_4016A0
- .text:00415E36 cmp eax, 0FFFFFFFFh
- .text:00415E39 jnz short loc_415E7B
- .text:00415E3B push 0 ; int
- .text:00415E3D push offset a1746 ; "1746"
- .text:00415E42 lea ecx, [ebp+arg_0]
- .text:00415E45 call sub_4016A0
- .text:00415E4A cmp eax, 0FFFFFFFFh
- .text:00415E4D jnz short loc_415E7B
- .text:00415E4F push 0 ; int
- .text:00415E51 push offset a9458 ; "9458"
- .text:00415E56 lea ecx, [ebp+arg_0]
- .text:00415E59 call sub_4016A0
Code (Assembler) : Убрать нумерацию
- .text:00415D37 call sub_406A70
- .text:00415D3C lea ecx, [ebp+arg_0]
- .text:00415D3F call sub_416180
- ; Инициализация переменной
- .text:00415D44 mov [ebp+var_10], 0
- .text:00415D4B mov [ebp+var_114], 0
- .text:00415D52 push 0FFh ; size_t
- .text:00415D57 push 0 ; int
- .text:00415D59 lea eax, [ebp+var_113]
- .text:00415D5F push eax ; void *
- .text:00415D60 call _memset

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

Ошибка активации
Отправляем исполняемый файл Game.exe в дизассемблер. Строка сообщения у нас известна, так что посмотрим, как оно появляется.
Code (Assembler) : Убрать нумерацию
- ; Какая-то проверка
- .text:004D052C cmp [ebp+var_58], 0
- ; Если все хорошо, то выполнить программу
- .text:004D0530 jnz short loc_4D055A
- ; Если ошибка, то выйти с ошибкой
- .text:004D0532 push offset aDrmError ; "DRM Error"
- .text:004D0537 call sub_42C267
- .text:004D053C add esp, 4
- .text:004D053F push 0 ; uType
- .text:004D0541 push offset aActivationErro
- ; "Activation error"
- .text:004D0546 push offset aYouShouldNotRu
- ; "You should not run this file. Use links"...
- .text:004D054B push 0 ; hWnd
- .text:004D054D call ds:MessageBoxA
- .text:004D0553 xor eax, eax
- .text:004D0555 jmp loc_4D05F4

Программа успешно зарегистрирована
Вот теперь действительно все. Загрузчик больше не используется, у нас получается чистый дистрибутив с игрой. Цель достигнута.
Просмотров: 310 | Комментариев: 2
Метки: исследование защиты, игры
Комментарии
Отзывы посетителей сайта о статье
voffka
(27.07.2026 в 07:35):
Или так
00404117 neg eax->not eax
00404117 neg eax->not eax
Добавить комментарий
Заполните форму для добавления комментария


"Registration required"
"Trial period is over"
"Please register this game to continue playing!"