Исследование защиты игры Multris
Скриншот игры Multris
Multris - классический тетрис с возможностью играть по сети. Лично я вырос в те времена, когда ни у кого даже не возникало мысли, что игры и софт надо покупать, если не считать стоимости компакт-диска на радиорынке. Вот и тут для меня совершенно непонятно, как можно выкладывать деньги за игру.
Забираем с офсайта дистрибутив, устанавливаем, запускаем. Сразу же появляется окно с предложением зарегистрироваться.
Окно регистрации
На ввод левых данных игра реагирует сообщением "Bad key". В главном исполняемом файле ничего похожего нет, зато эта строка обнаруживается в ресурсах динамической библиотеки multrsus.dll.
Строка сообщения в ресурсах
Индекс строки в ресурсах 10094 или 276Eh в шестнадцатеричной системе счисления. Отправляем главный исполняемый файл в дизассемблер, ждем окончания создания листинга и ищем в нем строку "276Eh". Найдется одно вхождение.
Code (Assembler) : Убрать нумерацию
- .text:00402D5D push 10h ; uType
- .text:00402D5F push 1
- .text:00402D61 push 272Ah
- .text:00402D66 call ChaineRes
- .text:00402D6B add esp, 8
- .text:00402D6E push eax ; lpCaption
- .text:00402D6F push 0
- .text:00402D71 push 276Eh
- .text:00402D76 call ChaineRes
- .text:00402D7B add esp, 8
- .text:00402D7E push eax ; lpText
- .text:00402D7F push esi ; hWnd
- .text:00402D80 call ds:MessageBoxA
Code (Assembler) : Убрать нумерацию
- ; Получить текстовое значение из поля Name
- .text:00402C42 mov edi, ds:GetDlgItemTextA
- .text:00402C48 push 33h ; cchMax
- .text:00402C4A push offset String ; lpString
- .text:00402C4F push 142h ; nIDDlgItem
- .text:00402C54 push esi ; hDlg
- .text:00402C55 call edi ; GetDlgItemTextA
- ...
- ...
- ; Получить числовое значение из поля Serial
- .text:00402C91 push 0 ; bSigned
- .text:00402C93 lea edx, [esp+28h+Translated]
- .text:00402C97 push edx ; lpTranslated
- .text:00402C98 push 143h ; nIDDlgItem
- .text:00402C9D push esi ; hDlg
- .text:00402C9E call ds:GetDlgItemInt
- .text:00402CA4 cmp [esp+24h+Translated], 0
- .text:00402CA9 mov uValue, eax
- ...
- ...
- ; Получить текстовое значение из поля Key
- .text:00402CBF push 9 ; cchMax
- .text:00402CC1 lea eax, [esp+28h+String]
- .text:00402CC5 push eax ; lpString
- .text:00402CC6 push 144h ; nIDDlgItem
- .text:00402CCB push esi ; hDlg
- .text:00402CCC call edi ; GetDlgItemTextA
- .text:00402CCE test eax, eax
- .text:00402CD0 jz loc_402DA8
- .text:00402CD6 lea ecx, [esp+24h+var_18]
- .text:00402CDA push ecx
- .text:00402CDB lea edx, [esp+28h+String]
- ; Преобразовать его в HEX-число
- .text:00402CDF push offset aLx ; "%lX"
- .text:00402CE4 push edx ; char *
- .text:00402CE5 call _sscanf
Code (Assembler) : Убрать нумерацию
- .text:00402CF6 mov eax, [esp+24h+var_18]
- .text:00402CFA mov Data, eax
- .text:00402CFF add eax, uValue
- ; EAX = сумма Serial и Key
- .text:00402D05 test bl, bl
- .text:00402D07 mov [esp+24h+var_18], eax
- ; Указатель на строку имени
- .text:00402D0B mov edi, offset String
- .text:00402D10 jle short loc_402D48
- .text:00402D12 movsx eax, bl
- .text:00402D15 push ebp
- ; EBP = длина имени * 3
- .text:00402D16 lea ebp, [eax+eax*2]
- .text:00402D19 lea esp, [esp+0]
- ; Основной цикл подсчета
- .text:00402D20 loc_402D20:
- .text:00402D20 sub ebp, 3
- .text:00402D23 mov eax, ebp
- .text:00402D25 cdq
- .text:00402D26 mov ecx, 1Bh
- .text:00402D2B idiv ecx
- .text:00402D2D movsx eax, byte ptr [edi]
- .text:00402D30 add bl, 0FFh
- .text:00402D33 add edi, 1
- .text:00402D36 mov ecx, edx
- .text:00402D38 shl eax, cl
- .text:00402D3A sub eax, 14CFh
- ; EAX = очередное значение для XOR
- .text:00402D3F xor [esp+28h+var_18], eax
- .text:00402D43 test bl, bl
- .text:00402D45 jg short loc_402D20
- .text:00402D47 pop ebp
- .text:00402D48 loc_402D48:
- .text:00402D48 mov eax, [esp+24h+var_18]
- ; Вычесть из результата значение Serial
- .text:00402D4C sub eax, uValue
- ; Итоговый результат должен быть равен 4D4C3130h
- .text:00402D52 cmp eax, 4D4C3130h
(Key + Serial) ^ N1 ^ N2 ^ N3 .. ^ Ni = (4D4C3130 + Serial)
Значение Serial придумываем сами, например, пусть это будет красивое число "777" или 309h в шестнадцатеричной системе. Значит итоговое значение должно получиться 4D4C3130h + 309h = 4D4C3439h. Чтобы получить значение Key, а точнее (Key + 309h), надо последовательно проXORить 4D4C3439h с каждым из чисел, соответствующих каждому символу имени. Где их взять? Запускаем программу под отладчиком, ставим точку останова по адресу 00402D3F, регистрируем с именем "ManHunter / PCL", серийником "777" и произвольным значением "Key". На каждое срабатывание точки останова сохраняем значение регистра EAX. У меня получилась последовательность чисел 00266B31h, 0005FB31h, 0000C731h, FFFFFD31h, FFFFEED9h, FFFFEB9Fh, 73FFEB31h, 0C9FEB31h, 01C7EB31h, 000FEB31h, 0002DB31h, 00002B31h, FFFFFF31h, FFFFED49h и FFFFEB7Dh. Поочередно XORим 4D4C3439h с этими числами и получаем в итоге значение 33C5927A. Но мы помним, что это сумма Key и числа 309h, поэтому вычитаем 309h и получаем значение Key = 33C58F71h.
Закрываем отладчик и повторяем регистрацию с найденными значениями: Name = "ManHunter / PCL", Serial = "777", Key = "33C58F71". Окно регистрации закрывается, в заголовке игрового окна появляется просьба не распространять. Ок, не будем.
Игра успешно зарегистрирована
В окне "О программе" отображается введенное имя и серийник, окно регистрации при старте больше не появляется. Цель достигнута. Теперь можно скоротать время за любимой игрушкой. При желании можно рипнуть алгоритм генерации последовательности чисел из имени и сделать свой генератор ключей.
Просмотров: 1821 | Комментариев: 20
Метки: исследование защиты, игры
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(24.02.2020 в 22:54):
Жека, а при чем тут Resource Hacker? Вопрос был задан про eXeScope, ответ был дан про него же.
Жека
(24.02.2020 в 22:40):
ManHunter, последние версии Resource Hacker отлично работают с 64-битными файлами, вы разве этого не знали?
Все тот же Ламер
(03.02.2020 в 15:33):
Спасибо большое за подсказку)
ManHunter
(03.02.2020 в 15:25):
eXeScope не работает с 64-битными файлами. Надо искать другой редактор ресурсов.
Все тот же Ламер
(03.02.2020 в 13:55):
А что делать, если ресурсы приложения не получается посмотреть, так как ExeScope падает с неизвестной ошибкой ?
Yoshida
(18.01.2020 в 05:19):
Привет! С новым годом!
License
(06.01.2020 в 11:35):
Vnv, Спасибо Большое !!! :)
Vnv
(04.01.2020 в 22:59):
License, берешь Excel, заходишь Visual Basic и вставляешь в модуль:
Function Gen()
Randomize
a = "Vnv" 'Name
b = Int(1000 * Rnd) 'Serial
c = &H4D4C3130
l = Len(a)
s = l * 3
k = 0
For i = 1 To l
s = s - 3
x = s Mod 27
t = Asc(Mid(a, i, 1))
y = 2 ^ s
d = t * y
d = d - 5327
k = k Xor d
Next i
e = c + b
f = e Xor k
g = Hex(f - b)
MsgBox ("Name: " & a & vbCrLf & "Serial: " & b & vbCrLf & "Key: " & g)
End Function
License
Name: License
Serial: 2008
Key: 4C510D0E
Function Gen()
Randomize
a = "Vnv" 'Name
b = Int(1000 * Rnd) 'Serial
c = &H4D4C3130
l = Len(a)
s = l * 3
k = 0
For i = 1 To l
s = s - 3
x = s Mod 27
t = Asc(Mid(a, i, 1))
y = 2 ^ s
d = t * y
d = d - 5327
k = k Xor d
Next i
e = c + b
f = e Xor k
g = Hex(f - b)
MsgBox ("Name: " & a & vbCrLf & "Serial: " & b & vbCrLf & "Key: " & g)
End Function
License
Name: License
Serial: 2008
Key: 4C510D0E
License
(04.01.2020 в 18:01):
Поделитесь пожалуйста кейгеном, или помогите с регистрацией на имя:
Name: License
Serial: 2008
Key:
Буду очень, благодарна за помощь.
Name: License
Serial: 2008
Key:
Буду очень, благодарна за помощь.
Vnv
(24.12.2019 в 09:16):
xussr,
Я пошел чуть по другому:
1. Входные данные (Key + Serial) - установил в "0".
2. После прохода всего цикла получил число для имени, с которым надо ксорить (Nx).
3. Осталась формула: (Key + Serial) ^ Nx = (4D4C3130 + Serial).
Я пошел чуть по другому:
1. Входные данные (Key + Serial) - установил в "0".
2. После прохода всего цикла получил число для имени, с которым надо ксорить (Nx).
3. Осталась формула: (Key + Serial) ^ Nx = (4D4C3130 + Serial).
xussr
(24.12.2019 в 07:58):
Поочередно XORим 4D4C3439h это как ...просто мы тут не все математики и если можно чуть распишите операции
Vnv
(23.12.2019 в 19:04):
Luna, статьи пишутся для Вашего саморазвития, тренируйтесь. Могу только ключ дать.
Name: Luna
Serial: 666
Key: 4D4CBB1F
Name: Luna
Serial: 666
Key: 4D4CBB1F
Luna
(20.12.2019 в 15:21):
Всем привет)
А кто нибудь накидайте генератор пожалуйста, очень надо.
Спасибо.
А кто нибудь накидайте генератор пожалуйста, очень надо.
Спасибо.
ManHunter
(20.12.2019 в 07:29):
Alex, нет
xussr
(20.12.2019 в 02:27):
Один хер читаем кому надо!!! а что то спрашивать не всегда требуется и так все разжованно
Alex
(19.12.2019 в 19:41):
Всем привет!
А вы внимательно читаете вопрос?
Я не просил его сломать или посмотреть...
Я спросил "не пробовали отвязать Avocode?"
Просто скажите "Да" или "Нет"
А вы внимательно читаете вопрос?
Я не просил его сломать или посмотреть...
Я спросил "не пробовали отвязать Avocode?"
Просто скажите "Да" или "Нет"
ManHunter
(19.12.2019 в 17:20):
tilikum, хорошо же :)
tilikum
(19.12.2019 в 17:18):
Почему же "никто"? Я вот несколько лет назад прочитал, а сейчас перечитал. Со всеми правилами согласен. У меня на сайте вообще ни форума, ни комментов - для обратной связи только почта/аська/телега - пишут всего лишь несколько раз в год, кому действительно надо (обычно на почту). Народ настолько ленив, что если нельзя развести срач сразу и тут же - то на этом весь порыв и заканчивается.
ManHunter
(17.12.2019 в 18:53):
http://www.manhunter.ru/rules/
Даже красным цветом специально выделил. Да только один хер никто не читает.
Даже красным цветом специально выделил. Да только один хер никто не читает.
Alex
(17.12.2019 в 18:52):
Здравствуйте! Давно посещаю ваш сайт, нашел много полезного и интересного.
Всё хотел спросить, не пробовали отвязать Avocode? Хорошая программа, но ...
Всё хотел спросить, не пробовали отвязать Avocode? Хорошая программа, но ...
Добавить комментарий
Заполните форму для добавления комментария