Blog. Just Blog

Исследование защиты программы Ultra Audio Ripper

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

Программа Ultra Audio Ripper предназначена для извлечения звуковых дорожек из видеофайлов различных форматов. Иногда бывает полезно когда, например, надо сделать MP3-альбом из концертного DVD, или что-то подобное. Без регистрации имеются ограничения, будем с ними бороться.

Забираем с офсайта дистрибутив, устанавливаем, запускаем, смотрим. На ввод произвольных регистрационных данных программа реагирует следующим сообщением:

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

Главный исполняемый файл ничем не защищен, отправим его в дизассемблер и попутно поищем строчку сообщения. Найдется одна юникодная строка:

Строка сообщения в файле
Строка сообщения в файле

По перекрестным ссылкам в дизассемблере выходим на код, где эта строка используется:
  1. CODE:005385BE                 mov     eax, ebx
  2. ; Вызвать функцию проверки регистрации
  3. CODE:005385C0                 call    sub_53877C
  4. CODE:005385C5                 test    eax, eax
  5. CODE:005385C7                 jz      short loc_5385E2
  6. CODE:005385C9                 mov     edx, offset aThankYouForReg
  7. ; "Thank you for registration! All limitat"...
  8. CODE:005385CE                 mov     eax, [ebx+35Ch]
  9. CODE:005385D4                 call    sub_4CC888
  10. CODE:005385D9                 mov     eax, ebx        ; this
  11. CODE:005385DB                 call    sub_538964
  12. CODE:005385E0                 jmp     short loc_538600
  13. CODE:005385E2 ; ---------------------------------------------------
  14. CODE:005385E2 loc_5385E2:
  15. CODE:005385E2                 mov     edx, offset aInvalidRegistr
  16. ; "Invalid registration code!"
  17. CODE:005385E7                 mov     eax, [ebx+35Ch]
  18. CODE:005385ED                 call    sub_4CC888
  19. CODE:005385F2                 mov     eax, [ebx+33Ch]
  20. CODE:005385F8                 mov     edx, [eax]
Пока никаких сюрпризов. Вызывается некая функция проверки, по ее результатам выполняется условный переход на сообщение о неправильной регистрации или же выводится благодарность за покупку.

Первый и самый простой вариант решения проблемы с шароварностью - патч функции проверки. Достаточно записать пару команд MOV EAX,1 и RET в ее начало, чтобы любой серийный номер принимался как правильный.

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

Хорошо и быстро, даже сгодится для домашнего использования. Но в качестве полноценного релиза не так красиво, как некоторым хотелось бы. Поэтому попробуем обратить функцию проверки регистрации, чтобы выяснить алгоритм генерации правильных серийный номеров. Запускаем программу под отладчиком, ставим точку останова на начало функции проверки и повторяем процесс регистрации.
  1. CODE:005387BD                 mov     eax, [ebp+var_8]
  2. ; Посчитать длину серийного номера
  3. CODE:005387C0                 call    unknown_libname_90
  4. ; Если она не равна 16h (22 dec), то вернуть ошибку
  5. CODE:005387C5                 cmp     eax, 16h
  6. CODE:005387C8                 jnz     loc_53892B
  7. CODE:005387CE                 lea     ecx, [ebp+var_14]
  8. CODE:005387D1                 mov     edx, 3
  9. CODE:005387D6                 mov     eax, [ebx+42Ch]
  10. ; Взять первые три символа серийного номера
  11. CODE:005387DC                 call    unknown_libname_648
  12. CODE:005387E1                 mov     eax, [ebp+var_14]
  13. CODE:005387E4                 mov     edx, offset _str_UAR.Text
  14. ; Сравнить их со строкой "UAR"
  15. CODE:005387E9                 call    @System@@LStrCmp$qqrv
  16. ; Если не равно, то вернуть ошибку
  17. CODE:005387EE                 jnz     loc_53892B
  18. CODE:005387F4                 lea     ecx, [ebp+var_8]
Тут мы выяснили, что серийный номер должен начинаться с символов "UAR" и его длина должна быть 22 символа.
  1. CODE:0053881D loc_53881D:
  2. CODE:0053881D                 mov     eax, [ebp+var_8]
  3. CODE:00538820                 mov     bl, [eax+esi]
  4. CODE:00538823                 cmp     bl, 2Dh
  5. CODE:00538826                 jz      short loc_53883D
  6. CODE:00538828                 lea     eax, [ebp+var_18]
  7. CODE:0053882B                 mov     edx, ebx
  8. CODE:0053882D                 call    unknown_libname_85
  9. CODE:00538832                 mov     edx, [ebp+var_18]
  10. CODE:00538835                 lea     eax, [ebp+var_C]
  11. CODE:00538838                 call    @System@@LStrCat$qqrv
  12. CODE:0053883D loc_53883D:
  13. CODE:0053883D                 inc     esi
  14. CODE:0053883E                 cmp     esi, 13h
  15. CODE:00538841                 jnz     short loc_53881D
  16. CODE:00538843                 lea     eax, [ebp+var_8]
  17. CODE:00538846                 mov     edx, [ebp+var_C]
  18. CODE:00538849                 call    @System@@LStrLAsg$qqrpvpxv
  19. CODE:0053884E                 lea     eax, [ebp+var_C]
  20. CODE:00538851                 call    @System@@LStrClr$qqrpv
  21. CODE:00538856                 mov     eax, [ebp+var_8]
  22. CODE:00538859                 call    unknown_libname_90
  23. CODE:0053885E                 cmp     eax, 10h
  24. CODE:00538861                 jnz     loc_53892B
  25. CODE:00538867                 xor     esi, esi
На этом шаге берется строка серийника, начиная с третьего символа (19 символов), затем из нее удаляются все символы "-". Остаток строки должен быть длиной 16 символов. Нехитрой математикой получаем, что в серийнике должны быть три разделителя "-", что-то типа "UAR12-34567-89012-3456". Повторяем процесс регистрации, на этот раз проверка пройдена. Двигаемся дальше.
  1. CODE:00538869 loc_538869:
  2. CODE:00538869                 mov     eax, esi
  3. CODE:0053886B                 and     eax, 80000001h
  4. CODE:00538870                 jns     short loc_538877
  5. CODE:00538872                 dec     eax
  6. CODE:00538873                 or      eax, 0FFFFFFFEh
  7. CODE:00538876                 inc     eax
  8. CODE:00538877 loc_538877:
  9. CODE:00538877                 test    eax, eax
  10. CODE:00538879                 jnz     short loc_538896
  11. CODE:0053887B                 lea     eax, [ebp+var_1C]
  12. CODE:0053887E                 mov     edx, [ebp+var_8]
  13. CODE:00538881                 mov     dl, [edx+esi]
  14. CODE:00538884                 call    unknown_libname_85
  15. CODE:00538889                 mov     edx, [ebp+var_1C]
  16. CODE:0053888C                 lea     eax, [ebp+var_10]
  17. CODE:0053888F                 call    @System@@LStrCat$qqrv
  18. CODE:00538894                 jmp     short loc_5388AF
  19. CODE:00538896 ; ----------------------------------
  20. CODE:00538896 loc_538896:
  21. CODE:00538896                 lea     eax, [ebp+var_20]
  22. CODE:00538899                 mov     edx, [ebp+var_8]
  23. CODE:0053889C                 mov     dl, [edx+esi]
  24. CODE:0053889F                 call    unknown_libname_85
  25. CODE:005388A4                 mov     edx, [ebp+var_20]
  26. CODE:005388A7                 lea     eax, [ebp+var_C]
  27. CODE:005388AA                 call    @System@@LStrCat$qqrv
  28. CODE:005388AF loc_5388AF:
  29. CODE:005388AF                 inc     esi
  30. CODE:005388B0                 cmp     esi, 10h
  31. CODE:005388B3                 jnz     short loc_538869
  32. CODE:005388B5                 lea     eax, [ebp+var_4]
  33. CODE:005388B8                 call    @System@@LStrClr$qqrpv
  34. CODE:005388BD                 xor     esi, esi
Листинг не самый понятный, зато под отладчиком хорошо видно, что из строки серийника берутся четные символы и записываются в одну строчку, затем берутся нечетные и также по очереди записываются в другую строчку.
  1. CODE:005388E6                 lea     edx, [ebp+var_28]
  2. ; Указатель на строку с нечетными символами
  3. CODE:005388E9                 mov     eax, [ebp+var_10]
  4. ; Посчитать MD5 от строки
  5. CODE:005388EC                 call    sub_52BC64
  6. CODE:005388F1                 mov     edx, [ebp+var_28]
  7. CODE:005388F4                 lea     eax, [ebp+var_10]
Здесь берется строка с нечетными символами и от нее считается какой-то хэш. Любая программа для поиска криптоалгоритмов в файле подсказывает, что в файле есть расчет MD5. По размеру полученной строки хэша, а также по результатам подсчета хэша другими инструментами стоит согласиться, что это действительно так.
  1. CODE:005388F7                 call    @System@@LStrLAsg$qqrpvpxv
  2. CODE:005388FC                 lea     ecx, [ebp+var_2C]
  3. CODE:005388FF                 mov     edx, 8
  4. CODE:00538904                 mov     eax, [ebp+var_10]
  5. CODE:00538907                 call    sub_439BC0
  6. CODE:0053890C                 mov     edx, [ebp+var_2C]
  7. CODE:0053890F                 lea     eax, [ebp+var_10]
  8. CODE:00538912                 call    @System@@LStrLAsg$qqrpvpxv
  9. CODE:00538917                 mov     eax, [ebp+var_4]
  10. CODE:0053891A                 mov     edx, [ebp+var_10]
  11. CODE:0053891D                 call    @System@@LStrCmp$qqrv
  12. CODE:00538922                 jnz     short loc_538929
  13. CODE:00538924                 or      edi, 0FFFFFFFFh
  14. CODE:00538927                 jmp     short loc_53892B
От строки хэша отрезаются последние 8 символов и сравниваются со строкой, полученной из четных символов серийника. По результатам этой последней проверки выносится вердикт о корректности серийного номера. Регистрационное имя нигде в процессе проверки не используется.

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

Таким образом, корректный серийник будет, например, "UAR02-0F060-E0A03-0109". После разбора алгоритма вы можете теперь написать кейген самостоятельно.

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

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
xuser (18.11.2017 в 12:43):
Нечего туткейгенет ноп с переходом и все....
wet (18.11.2017 в 11:40):
Вот не могу я понять все эти изуверства с придумыванием таких "супер алгоритмов" для генерирования серийного номера. Особо бессмысленно выглядит это занятие, если программа ни чем не защищена. Для любого честного человека более чем достаточно просто скажем проверять хеш вводимого серийника, полученный любым стандартным способом. Для "нечестного" пытливого ума нет смысла выдумывать такой мозговыверт, если всё можно решить простой подменой результата с 0 на 1 или типа того.
ManHunter (08.11.2017 в 23:45):
Лишаешь радости аффтора, освоившего движок скинов :)
Vladimir (08.11.2017 в 20:26):
Я за такие интерфейсы, как у этой софтины, руки рвал бы! Кругленькое всё, синенькое... А как цветовая схема чуть изменена, так и ползёт вся эта красивость.
ManHunter (08.11.2017 в 14:16):
Так это же подопытный кролик, а не рекомендованная для использования софтина. DVD Audio Extractor рулит.
pawel97 (08.11.2017 в 14:09):
Насколько понял, в отличие от DVD Audio Extractor, не умеет делить на главы (актуально для dvd с сотней клипов) и сохранять без перекодирования в оригинальном aac формате. Для остального сгодится любой нормальный аудиоредактор (тот же GoldWave).

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

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

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