Blog. Just Blog

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

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

Multris - классический тетрис с возможностью играть по сети. Лично я вырос в те времена, когда ни у кого даже не возникало мысли, что игры и софт надо покупать, если не считать стоимости компакт-диска на радиорынке. Вот и тут для меня совершенно непонятно, как можно выкладывать деньги за игру.

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

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

На ввод левых данных игра реагирует сообщением "Bad key". В главном исполняемом файле ничего похожего нет, зато эта строка обнаруживается в ресурсах динамической библиотеки multrsus.dll.

Строка сообщения в ресурсах
Строка сообщения в ресурсах

Индекс строки в ресурсах 10094 или 276Eh в шестнадцатеричной системе счисления. Отправляем главный исполняемый файл в дизассемблер, ждем окончания создания листинга и ищем в нем строку "276Eh". Найдется одно вхождение.
  1. .text:00402D5D                 push    10h             ; uType
  2. .text:00402D5F                 push    1
  3. .text:00402D61                 push    272Ah
  4. .text:00402D66                 call    ChaineRes
  5. .text:00402D6B                 add     esp, 8
  6. .text:00402D6E                 push    eax             ; lpCaption
  7. .text:00402D6F                 push    0
  8. .text:00402D71                 push    276Eh
  9. .text:00402D76                 call    ChaineRes
  10. .text:00402D7B                 add     esp, 8
  11. .text:00402D7E                 push    eax             ; lpText
  12. .text:00402D7F                 push    esi             ; hWnd
  13. .text:00402D80                 call    ds:MessageBoxA
Тут все понятно, из ресурсов загружаются заголовок и текст сообщения, затем это все выводится на экран. Выше находится проверка с условным переходом, а вот перед ней все самое интересное. Сперва из формы регистрации получаются значения всех трех полей ввода. Имя - строка, Serial - десятичное число, Key - строка, которая затем преобразуется в hex-значение.
  1. ; Получить текстовое значение из поля Name
  2. .text:00402C42                 mov     edi, ds:GetDlgItemTextA
  3. .text:00402C48                 push    33h             ; cchMax
  4. .text:00402C4A                 push    offset String   ; lpString
  5. .text:00402C4F                 push    142h            ; nIDDlgItem
  6. .text:00402C54                 push    esi             ; hDlg
  7. .text:00402C55                 call    edi ; GetDlgItemTextA
  8. ...
  9. ...
  10. ; Получить числовое значение из поля Serial
  11. .text:00402C91                 push    0               ; bSigned
  12. .text:00402C93                 lea     edx, [esp+28h+Translated]
  13. .text:00402C97                 push    edx             ; lpTranslated
  14. .text:00402C98                 push    143h            ; nIDDlgItem
  15. .text:00402C9D                 push    esi             ; hDlg
  16. .text:00402C9E                 call    ds:GetDlgItemInt
  17. .text:00402CA4                 cmp     [esp+24h+Translated], 0
  18. .text:00402CA9                 mov     uValue, eax
  19. ...
  20. ...
  21. ; Получить текстовое значение из поля Key
  22. .text:00402CBF                 push    9               ; cchMax
  23. .text:00402CC1                 lea     eax, [esp+28h+String]
  24. .text:00402CC5                 push    eax             ; lpString
  25. .text:00402CC6                 push    144h            ; nIDDlgItem
  26. .text:00402CCB                 push    esi             ; hDlg
  27. .text:00402CCC                 call    edi ; GetDlgItemTextA
  28. .text:00402CCE                 test    eax, eax
  29. .text:00402CD0                 jz      loc_402DA8
  30. .text:00402CD6                 lea     ecx, [esp+24h+var_18]
  31. .text:00402CDA                 push    ecx
  32. .text:00402CDB                 lea     edx, [esp+28h+String]
  33. ; Преобразовать его в HEX-число
  34. .text:00402CDF                 push    offset aLx      ; "%lX"
  35. .text:00402CE4                 push    edx             ; char *
  36. .text:00402CE5                 call    _sscanf
После того, как все три значения получены, начинается основной цикл вычисления контрольного значения и затем проверяется, правильные были регистрационные данные или нет. Сперва приведу код с комментариями, затем поясню словами.
  1. .text:00402CF6                 mov     eax, [esp+24h+var_18]
  2. .text:00402CFA                 mov     Data, eax
  3. .text:00402CFF                 add     eax, uValue
  4. ; EAX = сумма Serial и Key
  5. .text:00402D05                 test    bl, bl
  6. .text:00402D07                 mov     [esp+24h+var_18], eax
  7. ; Указатель на строку имени
  8. .text:00402D0B                 mov     edi, offset String
  9. .text:00402D10                 jle     short loc_402D48
  10. .text:00402D12                 movsx   eax, bl
  11. .text:00402D15                 push    ebp
  12. ; EBP = длина имени * 3
  13. .text:00402D16                 lea     ebp, [eax+eax*2]
  14. .text:00402D19                 lea     esp, [esp+0]
  15. ; Основной цикл подсчета
  16. .text:00402D20 loc_402D20:
  17. .text:00402D20                 sub     ebp, 3
  18. .text:00402D23                 mov     eax, ebp
  19. .text:00402D25                 cdq
  20. .text:00402D26                 mov     ecx, 1Bh
  21. .text:00402D2B                 idiv    ecx
  22. .text:00402D2D                 movsx   eax, byte ptr [edi]
  23. .text:00402D30                 add     bl, 0FFh
  24. .text:00402D33                 add     edi, 1
  25. .text:00402D36                 mov     ecx, edx
  26. .text:00402D38                 shl     eax, cl
  27. .text:00402D3A                 sub     eax, 14CFh
  28. ; EAX = очередное значение для XOR
  29. .text:00402D3F                 xor     [esp+28h+var_18], eax
  30. .text:00402D43                 test    bl, bl
  31. .text:00402D45                 jg      short loc_402D20
  32. .text:00402D47                 pop     ebp
  33. .text:00402D48 loc_402D48:
  34. .text:00402D48                 mov     eax, [esp+24h+var_18]
  35. ; Вычесть из результата значение Serial
  36. .text:00402D4C                 sub     eax, uValue
  37. ; Итоговый результат должен быть равен 4D4C3130h
  38. .text:00402D52                 cmp     eax, 4D4C3130h
Начальное значение контрольного числа - сумма чисел из полей Key и Serial. Затем в цикле для каждого символа регистрационного имени считается определенное значение и контрольное число последовательно XORится с каждым из этих значений. После вычисления из результата вычитается значение поля Serial и итоговый результат должен равняться 4D4C3130h. К счастью, операция XOR полностью обратима, поэтому, зная результат и последовательность операций, можно легко вычислить начальное значение контрольного числа. Все сводится к формуле:

(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". Окно регистрации закрывается, в заголовке игрового окна появляется просьба не распространять. Ок, не будем.

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

В окне "О программе" отображается введенное имя и серийник, окно регистрации при старте больше не появляется. Цель достигнута. Теперь можно скоротать время за любимой игрушкой. При желании можно рипнуть алгоритм генерации последовательности чисел из имени и сделать свой генератор ключей.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 836 | Комментариев: 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
License (04.01.2020 в 18:01):
Поделитесь пожалуйста кейгеном, или помогите с регистрацией на имя:

Name: License
Serial: 2008

Key:

Буду очень, благодарна за помощь.
Vnv (24.12.2019 в 09:16):
xussr,
Я пошел чуть по другому:
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
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?"
Просто скажите "Да" или "Нет"
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? Хорошая программа, но ...

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

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

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