Исследование защиты программы 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". Замечательно, поищем строчку в исполняемом файле. Файл ничем не упакован, строка находится без проблем. Небольшая тонкость, что строка записана в юникоде, впрочем как и все остальные текстовые строки внутри файла.


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

Отправляем файл в дизассемблер и идем наливать себе кружку кофе. Когда дизассемблер закончит работу, посмотрим код, который ссылается на сообщение о неправильной регистрации и попробуем выяснить условия его появления.
...
.text:0041DF50                 push    ecx
.text:0041DF51                 mov     ecx, offset unk_7BC968
.text:0041DF56                 mov     byte ptr [esp+0DCh+var_4], 3
; Вызвать процедуру проверки регистрации
.text:0041DF5E                 call    sub_5F0310
.text:0041DF63                 test    al, al
; Если она вернула AL=0, то перейти к триальной ветке алгоритма
.text:0041DF65                 jz      loc_41E0CC
; Регистрация прошла успешно
.text:0041DF6B                 lea     edx, [esp+0D4h+var_7C]
.text:0041DF6F                 push    edx
.text:0041DF70                 mov     ecx, offset unk_7BC968
.text:0041DF75                 call    sub_5EFCE0
...

Легкий путь - пропатчить функцию по адресу 005F0310, чтобы она всегда возвращала AL=1 и программа принимала любой ключ как правильный. Это вы уже можете сделать самостоятельно без моей помощи. Более сложный путь - разобрать алгоритм проверки регистрационного ключа. По нему и пойдем. Под отладчиком будем пошагово идти проверку ключа в реальном времени, а параллельно будем смотреть алгоритм в дизассемблере. Просто запустить программу под отладчиком не получится, она при регистрации запускает свою вторую копию, тем самым немного затрудняя отладку. Поэтому приаттачимся отладчиком к дочернему процессу DVD Audio Extractor, когда откроется окно ввода серийного номера, и поставим точку останова на адрес 005F0310. Сразу после ввода серийного номера отладчик остановится там. Начинаем пошаговую трассировку, при этом внимательно смотрим на содержимое стека и указатели в регистрах.
...
.text:005F0616                 push    eax
.text:005F0617                 lea     ecx, [esp+0ECh+var_7C]
.text:005F061B                 call    sub_540CF0
; Положить на стек адрес строки для проверки
.text:005F0620                 push    offset aDa1x    ; "DA1X"
; Указатель на 4 первых символа введенного серийника
.text:005F0625                 push    eax
.text:005F0626                 mov     byte ptr [esp+0ECh+var_4], 5
.text:005F062E                 call    sub_472E60
.text:005F0633                 mov     ecx, [esp+0ECh+var_B4]
...

Вот и первая проверка: серийный номер должен начинаться со строки "DA1X" (без кавычек, естественно). Теперь выясним, по какому правилу генерируются оставшиеся символы. Поле ввода серийного номера не дает ввести более 12 символов, первые 4 мы уже знаем, значит их осталось не более 8. Перезапускаем программу и теперь попробуем ввести серийный номер, начинающийся на "DA1X", чтобы пройти первую проверку. Остальные символы произвольные. Например, "DA1X11223344". После этого пройдем в пошаговом режиме под отладчиком остальные стадии проверки. По адресу 005F0724 вызывается интересная функция. В ней отчетливо прослеживаются манипуляции со вторыми четырьмя символами введенного серийника. В отладчике видно, как они преобразуются в этом месте:
...
.text:005F029B loc_5F029B:
.text:005F029B                 mov     edx, [esp+3Ch+var_24]
; Получить следующий символ из строки в юникоде
.text:005F029F                 movsx   eax, [esp+3Ch+var_25]
.text:005F02A4                 lea     edi, [esi+edx*2]
.text:005F02A7                 cdq
.text:005F02A8                 mov     ecx, 19h
.text:005F02AD                 idiv    ecx
.text:005F02AF                 mov     esi, edx
; В регистре ESI содержится преобразованный символ
.text:005F02B1                 add     esi, 41h
...
; Записать в память младший WORD (юникод) из регистра ESI
.text:005F02DF                 mov     eax, [esp+3Ch+var_24]
.text:005F02E3                 mov     ecx, [esp+3Ch+var_1C]
.text:005F02E7                 inc     eax
.text:005F02E8                 mov     [edi], si
...

После преобразований из строки "1122" получается строка "YYAA". Дальше выполняется сравнение последних четырех символов серийного номера с полученной строкой. В стеке видны адреса обеих строк.
...
; Указатель на последние 4 символа серийника
.text:005F073E                 push    eax
; Указатель на преобразованную строку
.text:005F073F                 lea     ecx, [esp+0E8h+var_7C]
; Вызвать функцию сравнения строк
.text:005F0743                 call    sub_53E7D0
.text:005F0748                 test    eax, eax
; Установить флаг, в зависимости от результатов сравнения
.text:005F074A                 setz    bl
...

После сообщения о неудачной регистрации попробуем ввести серийный номер, но теперь последние 4 символа будут "YYAA", то есть "DA1X1122YYAA". Снова пройдем процедуру проверки под отладчиком, на этот раз она вернет AL=1. Отлично, значит серийный номер правильный.


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

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