Исследование защиты программы PDF Encrypter
Скриншот программы PDF Encrypter
Программа PDF Encrypter предназначена для всяких копирастов, шароварщиков и прочих кусков мяса, которые пытаются защищать свои "аффтарские права". Она позволяет закрывать документы в формате PDF паролем, а также накладывать ограничения на содержимое: запрет копирования, изменения, печати и т.п. К счастью, все эти потуги легко снимаются не менее мощным инструментарием, в том числе программами этого же автора. Но лишать надежды перечисленные категории человеческих особей я все-таки не буду :)
Скачиваем дистрибутив, устанавливаем, запускаем. В программе установлено ограничение по количеству запусков, после чего она вроде как должна перестать работать. Что же, постараемся уложиться в отведенное нам количество попыток.
Триальное окно
На левые регистрационные данные программа реагирует сообщением "Registration failed, please check the code and try again!" Исполняемый файл упакован ASPack последней версии, его можно распаковать вручную или воспользоваться одним из универсальных распаковщиков. После распаковки файла можно поискать в нем строку, тут ничего сложного нет.
Нехорошая строка найдена
Отправляем распакованный файл в дизассемблер и поищем условие, при котором появляется сообщение о неправильной регистрации. Тут тоже никаких сложностей возникнуть не должно.
Code (Assembler) : Убрать нумерацию
- ...
- .text:00405A0A mov eax, dword ptr ValueName+4
- .text:00405A0F mov edx, [esp+8]
- ; Вызвать функцию сравнения введенного серийного номера и правильного.
- ; В регистре EAX - указатель на введенный серийный номер, в регистре EDX -
- ; указатель на правильный серийный номер.
- .text:00405A13 push eax
- .text:00405A14 push edx
- .text:00405A15 call __mbsicmp
- .text:00405A1A add esp, 8
- .text:00405A1D mov byte ptr [esp+2Ch], 3
- .text:00405A22 test eax, eax
- .text:00405A24 lea ecx, [esp+8]
- ; Если строки не равны, то вывести сообщение о неудачной регистрации
- .text:00405A28 jnz short loc_405A8D
- .text:00405A2A call sub_421E35
- ; Сообщение об удачной регистрации
- .text:00405A2F push offset aRegistrationSu
- ; "Registration successed, thank for your "...
- .text:00405A34 lea ecx, [esp+0Ch]
- .text:00405A38 call sub_421EA3
- .text:00405A3D lea eax, [esp+20h]
- .text:00405A41 mov bl, 9
- .text:00405A43 push eax
- .text:00405A44 mov ecx, offset unk_441E98
- .text:00405A49 mov [esp+30h], bl
- .text:00405A4D call sub_404450
- .text:00405A52 push 40h
- .text:00405A54 lea ecx, [esp+0Ch]
- .text:00405A58 push eax
- .text:00405A59 push ecx
- .text:00405A5A mov ecx, esi
- .text:00405A5C mov byte ptr [esp+38h], 0Ah
- .text:00405A61 call sub_405D20
- .text:00405A66 lea ecx, [esp+20h]
- .text:00405A6A mov [esp+2Ch], bl
- .text:00405A6E call sub_421E35
- .text:00405A73 lea ecx, [esp+8]
- .text:00405A77 mov byte ptr [esp+2Ch], 3
- .text:00405A7C call sub_421E35
- .text:00405A81 mov ecx, offset unk_441E98
- .text:00405A86 call sub_404EE0
- .text:00405A8B jmp short loc_405AE4
- .text:00405A8D ; --------------------------------------------------
- .text:00405A8D loc_405A8D:
- .text:00405A8D call sub_421E35
- .text:00405A92 push offset aRegistrationFa
- ; "Registration failed, please check the c"...
- .text:00405A97 lea ecx, [esp+0Ch]
- .text:00405A9B call sub_421EA3
- .text:00405AA0 lea edx, [esp+20h]
- ...
Функция проверки серийного номера
На этом можно остановиться, а можно попробовать разобрать алгоритм генерации серийного номера. Для этого поставим точку останова в самое начало процедуры обработки введенных данных по адресу 004058C0 и повторим регистрацию с любыми неправильными данными. После срабатывания точки останова пройдем процедуру до сравнения строк в пошаговом режиме. На стеке хорошо видно, что сперва берутся символы из всех 4 блоков серийного номера и слепляются в одну строку, а затем на стеке появляется такие интересные данные:
Обработка введенного имени
Введенное имя переводится в верхний регистр, все пробелы в нем заменяются на букву "B" (наверное, от слова "blank"), затем от полученной строки берутся два первых символа и к ним дописывается какая-то бредятина "5dgdfrdr". По всей видимости это исходные данные для генерации правильного серийного номера. Хорошо, едем дальше.
Строка преобразована в хеш
Дальше строка хешируется в функции по адресу 00402D30 по какому-то алгоритму. Попробуем поискать по какому. Krypto ANALyzer не оставляет сомнений, что это MD5, причем без всяких модификаций.
Использован алгоритм MD5
На всякий случай проверим нашу догадку любым другим сторонним инструментом, посчитав MD5 от строки "MA5dgdfrdr", действительно, так оно и есть, после хеширования получается строка "0d3455b4c7a3858e0f23a456a40ab24e". Первые 16 символов полученной строки и являются серийным номером. Сама регистрация и триальные счетчики в зашифрованном виде хранятся в файле %ProgramData%\1pdfenc.dll. Еще одно уродское поделие, прячущее свои данные в файле с именем динамической библиотеки. Если кому интересно, то расшифровка выполняется здесь:
Code (Assembler) : Убрать нумерацию
- ; Расшифровка регистрационных данных
- .text:00404FCC xor eax, eax
- .text:00404FCE loc_404FCE:
- .text:00404FCE mov bl, byte ptr [esp+eax+420h+Buffer]
- .text:00404FD2 xor bl, 48h
- .text:00404FD5 mov byte ptr [esp+eax+420h+Buffer], bl
- .text:00404FD9 inc eax
- .text:00404FDA cmp eax, 200h
- .text:00404FDF jl short loc_404FCE
Просмотров: 5038 | Комментариев: 5
Метки: исследование защиты, PDF
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(09.01.2011 в 04:02):
Isaev, это не только дело привычки. В отладчике неудобно исследовать перекрестные ссылки, но очень удобно смотреть что и где меняется в процессе выполнения. А HIEW у меня забинден в качестве дефолтной смотрелки для исполняемых файлов. Так что у меня используются все три инструмента. Если можешь обойтись одним, то я только рад за тебя.
Isaev
(07.01.2011 в 03:45):
Это конечно дело привычки, но зачем сначала hiew, потом дизассемблер вообще, если всё равно потом используется отладчик? Ну плаг кинуть в него для поиска строк и 2 лишние проги можно с собой не таскать...
mkn
(03.01.2011 в 01:58):
познавательно. спасибо.
AyTkACT
(02.01.2011 в 09:26):
Как всегда лаконично, чётко и внятно.
Добавить комментарий
Заполните форму для добавления комментария
Видимо, того же авторства?
Кстати, они тоже довольно успешно ковыряемы.