Blog. Just Blog

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

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

DVD Audio Extractor - полезная программа для извлечения аудиодорожек из DVD-дисков. DVD Audio Extractor пригождается, например, когда хочется сделать бутлегерский альбом в формате OGG, MP3, Wave или FLAC из концертного DVD любимой группы. Программа имеет очень простой и удобный интерфейс, работает быстро и качественно. Так что все хорошо за исключением того, что для полноценной работы требуется расстаться с некоторой суммой вечнозеленых денег.

Качаем с офсайта дистрибутив, устанавливаем, запускаем. Сразу получаем окно регистрации с напоминанием о 30-дневном сроке и предложением ввести серийный номер.

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

На ввод левых данных программа реагирует сообщением "The registration code you inputed is invalid". Замечательно, поищем строчку в исполняемом файле. Файл ничем не упакован, строка находится без проблем. Небольшая тонкость, что строка записана в юникоде, впрочем как и все остальные текстовые строки внутри файла.

Нехорошая строка найдена
Нехорошая строка найдена

Отправляем файл в дизассемблер и идем наливать себе кружку кофе. Когда дизассемблер закончит работу, посмотрим код, который ссылается на сообщение о неправильной регистрации и попробуем выяснить условия его появления.
  1. ...
  2. .text:0041DF50                 push    ecx
  3. .text:0041DF51                 mov     ecx, offset unk_7BC968
  4. .text:0041DF56                 mov     byte ptr [esp+0DCh+var_4], 3
  5. ; Вызвать процедуру проверки регистрации
  6. .text:0041DF5E                 call    sub_5F0310
  7. .text:0041DF63                 test    al, al
  8. ; Если она вернула AL=0, то перейти к триальной ветке алгоритма
  9. .text:0041DF65                 jz      loc_41E0CC
  10. ; Регистрация прошла успешно
  11. .text:0041DF6B                 lea     edx, [esp+0D4h+var_7C]
  12. .text:0041DF6F                 push    edx
  13. .text:0041DF70                 mov     ecx, offset unk_7BC968
  14. .text:0041DF75                 call    sub_5EFCE0
  15. ...
Легкий путь - пропатчить функцию по адресу 005F0310, чтобы она всегда возвращала AL=1 и программа принимала любой ключ как правильный. Это вы уже можете сделать самостоятельно без моей помощи. Более сложный путь - разобрать алгоритм проверки регистрационного ключа. По нему и пойдем. Под отладчиком будем пошагово идти проверку ключа в реальном времени, а параллельно будем смотреть алгоритм в дизассемблере. Просто запустить программу под отладчиком не получится, она при регистрации запускает свою вторую копию, тем самым немного затрудняя отладку. Поэтому приаттачимся отладчиком к дочернему процессу DVD Audio Extractor, когда откроется окно ввода серийного номера, и поставим точку останова на адрес 005F0310. Сразу после ввода серийного номера отладчик остановится там. Начинаем пошаговую трассировку, при этом внимательно смотрим на содержимое стека и указатели в регистрах.
  1. ...
  2. .text:005F0616                 push    eax
  3. .text:005F0617                 lea     ecx, [esp+0ECh+var_7C]
  4. .text:005F061B                 call    sub_540CF0
  5. ; Положить на стек адрес строки для проверки
  6. .text:005F0620                 push    offset aDa1x    ; "DA1X"
  7. ; Указатель на 4 первых символа введенного серийника
  8. .text:005F0625                 push    eax
  9. .text:005F0626                 mov     byte ptr [esp+0ECh+var_4], 5
  10. .text:005F062E                 call    sub_472E60
  11. .text:005F0633                 mov     ecx, [esp+0ECh+var_B4]
  12. ...
Вот и первая проверка: серийный номер должен начинаться со строки "DA1X" (без кавычек, естественно). Теперь выясним, по какому правилу генерируются оставшиеся символы. Поле ввода серийного номера не дает ввести более 12 символов, первые 4 мы уже знаем, значит их осталось не более 8. Перезапускаем программу и теперь попробуем ввести серийный номер, начинающийся на "DA1X", чтобы пройти первую проверку. Остальные символы произвольные. Например, "DA1X11223344". После этого пройдем в пошаговом режиме под отладчиком остальные стадии проверки. По адресу 005F0724 вызывается интересная функция. В ней отчетливо прослеживаются манипуляции со вторыми четырьмя символами введенного серийника. В отладчике видно, как они преобразуются в этом месте:
  1. ...
  2. .text:005F029B loc_5F029B:
  3. .text:005F029B                 mov     edx, [esp+3Ch+var_24]
  4. ; Получить следующий символ из строки в юникоде
  5. .text:005F029F                 movsx   eax, [esp+3Ch+var_25]
  6. .text:005F02A4                 lea     edi, [esi+edx*2]
  7. .text:005F02A7                 cdq
  8. .text:005F02A8                 mov     ecx, 19h
  9. .text:005F02AD                 idiv    ecx
  10. .text:005F02AF                 mov     esi, edx
  11. ; В регистре ESI содержится преобразованный символ
  12. .text:005F02B1                 add     esi, 41h
  13. ...
  14. ; Записать в память младший WORD (юникод) из регистра ESI
  15. .text:005F02DF                 mov     eax, [esp+3Ch+var_24]
  16. .text:005F02E3                 mov     ecx, [esp+3Ch+var_1C]
  17. .text:005F02E7                 inc     eax
  18. .text:005F02E8                 mov     [edi], si
  19. ...
После преобразований из строки "1122" получается строка "YYAA". Дальше выполняется сравнение последних четырех символов серийного номера с полученной строкой. В стеке видны адреса обеих строк.
  1. ...
  2. ; Указатель на последние 4 символа серийника
  3. .text:005F073E                 push    eax
  4. ; Указатель на преобразованную строку
  5. .text:005F073F                 lea     ecx, [esp+0E8h+var_7C]
  6. ; Вызвать функцию сравнения строк
  7. .text:005F0743                 call    sub_53E7D0
  8. .text:005F0748                 test    eax, eax
  9. ; Установить флаг, в зависимости от результатов сравнения
  10. .text:005F074A                 setz    bl
  11. ...
После сообщения о неудачной регистрации попробуем ввести серийный номер, но теперь последние 4 символа будут "YYAA", то есть "DA1X1122YYAA". Снова пройдем процедуру проверки под отладчиком, на этот раз она вернет AL=1. Отлично, значит серийный номер правильный.

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

Подведем итоги. Длина серийного номера 12 символов. Первые 4 символа номера обязательно должны быть "DA1X", следующие 4 символа произвольные буквы и цифры, а последние 4 символа получаются из предыдущих по формуле: код символа делится на 19h, к остатку прибавляется 41h, это и будет нужный код символа. Имя при регистрации нигде не учитывается и может быть любым, но не менее 4 символов. После ввода найденного серийного номера DVD Audio Extractor благодарит за регистрацию и переходит в нормальный режим работы. Лицензия сохраняется в файл dvdae.lic, который расположен в папке с установленной программой, и после регистрации DVD Audio Extractor становится портативным. Ну а рабочий кейген теперь вы можете написать самостоятельно.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 3606 | Комментариев: 13

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

Комментарии

Отзывы посетителей сайта о статье
brute (22.11.2015 в 23:41):
старая версия 5.2.1(неожиданно!) легко пропатчилась по адресу 0002C9C4 je на jmp, а новая - 7.2.0 (с сайта http://www.dvdae.com/download)  ещё легче по адресу 0040CC68 je на jmp. В первом случае понажимал: F4/F7 на call'ы и нашёл переход, которые вызывает наг, а во втором - в иде всё строки открыты. По строке:"30 days trial period passed.." поднялся выше и (с первой же попытки) заменил переход..
ManHunter (25.03.2012 в 09:25):
там сейчас онлайн-активация, а вот на счет остального не смотрел, может и добавили чего
brute (25.03.2012 в 06:42):
Версия программы изменилась, и не только в этом дело... "Легкий путь - пропатчить функцию по адресу 005F0310" - не патчится нифига! Программа защищается от изменений и от отладки: пропатченная(особенно в местах критических переходов и функций) не запускается, "чистая" олька палится как отладчик, и бряки на переходы и вызовы не ставятся. Можно отлаживать в OllySND_portable или в отладчике IDA_5.0 с целью разгадать принцип генерации ключа, но "просто пропатчить" здесь не пойдёт.
mrX (07.08.2010 в 20:35):
Мне кажется, что данный тип статей, для человека хорошо разбирающегося в инструменте реверса данная статья не нужна, а вот тем кто плохо знаком с инструментарием статья, таки тоже мало чем поможет - затруднения "куда жать то".

По смыслу: я знаю куда жать в программе "взлома" = мне уже и так понятна и знакома техника из статьи. Если не знаю, то у меня проблема, с пониманием статьи. Возможно лучше чтобы в статье были указанны комбинации клавиш инструментария взлома, так сказать горячие клавиши.
ManHunter (05.08.2010 в 11:10):
Isaev, в статье я пишу КАК это делается, и ЧТО надо искать. И если программу каждый раз не переписывают с нуля, то найти те же самые адреса в новой версии не составит большого труда.
Isaev (05.08.2010 в 02:25):
Дело то не в ключике
ты бы о чём пишешь складывал куда-нибудь, т.к. старую версию попробуй найди потом...
т.к. поменялись все адреса, если человек не шарит он просто в тупике будет, а если шарит ему статья не нужна...
ManHunter (04.08.2010 в 08:35):
Isaev, это я статью долго писал, версия успела поменяться :) А ключик подходит.
Isaev (04.08.2010 в 03:56):
"чтобы в подобного рода статьях отражалась линия мышления хакинга(крекинга)."
mrX, так статья так и построена... По моему всё вполне обосновано!
Isaev (04.08.2010 в 03:27):
За 2 дня уже версию сменили... Палят тебя? )))
Isaev (03.08.2010 в 23:31):
Вот! Наконец ))) Ты понял о чём я ;)
mrX (03.08.2010 в 20:43):
Спасибо, за очередную инфу. Но хотелось бы, чтобы в подобного рода статьях отражалась линия мышления хакинга(крекинга). Ведь польза от таких статьей в том, чтобы научить интересующихся понимать суть процесса, углубить их в творчество. А учить клацать кнопки, это не метод. Пусть каждый получить удочку и будет добывать рыбу сам, а давать готовое - плохой пример. Ждём обещанных статей про создание лоадров и патчеров.

Это лишь моё мнение, удачи.
semiono (03.08.2010 в 04:36):
Большое спасибо! Всегда эту прогу держу при себе.
Теперь можно ещё и внутри исследовать с пользой!
Аноним (01.08.2010 в 00:36):
Как всегда всё ясно и лаконично. =))
з.ы. HyperSnap доделали?

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

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

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