Исследование защиты программы PDF Encrypter


Скриншот программы PDF Encrypter

Программа PDF Encrypter предназначена для всяких копирастов, шароварщиков и прочих кусков мяса, которые пытаются защищать свои "аффтарские права". Она позволяет закрывать документы в формате PDF паролем, а также накладывать ограничения на содержимое: запрет копирования, изменения, печати и т.п. К счастью, все эти потуги легко снимаются не менее мощным инструментарием, в том числе программами этого же автора. Но лишать надежды перечисленные категории человеческих особей я все-таки не буду :)

Скачиваем дистрибутив, устанавливаем, запускаем. В программе установлено ограничение по количеству запусков, после чего она вроде как должна перестать работать. Что же, постараемся уложиться в отведенное нам количество попыток.


Триальное окно

На левые регистрационные данные программа реагирует сообщением "Registration failed, please check the code and try again!" Исполняемый файл упакован ASPack последней версии, его можно распаковать вручную или воспользоваться одним из универсальных распаковщиков. После распаковки файла можно поискать в нем строку, тут ничего сложного нет.


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

Отправляем распакованный файл в дизассемблер и поищем условие, при котором появляется сообщение о неправильной регистрации. Тут тоже никаких сложностей возникнуть не должно.
...
.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]
...

Если запустить программу под отладчиком, поставить точку останов адресу 00405A13, то после ввода имени и любого серийного номера в регистре EAX будет 16 символов введенного серийника (4 поля по 4 символа), а в регистре EDX - 16 символов серийного номера, который считается правильным для введенного имени. Для этого примера валидной парой будет регистрационное имя ManHunter / PCL и серийный номер 0d34-55b4-c7a3-858e.


Функция проверки серийного номера

На этом можно остановиться, а можно попробовать разобрать алгоритм генерации серийного номера. Для этого поставим точку останова в самое начало процедуры обработки введенных данных по адресу 004058C0 и повторим регистрацию с любыми неправильными данными. После срабатывания точки останова пройдем процедуру до сравнения строк в пошаговом режиме. На стеке хорошо видно, что сперва берутся символы из всех 4 блоков серийного номера и слепляются в одну строку, а затем на стеке появляется такие интересные данные:


Обработка введенного имени

Введенное имя переводится в верхний регистр, все пробелы в нем заменяются на букву "B" (наверное, от слова "blank"), затем от полученной строки берутся два первых символа и к ним дописывается какая-то бредятина "5dgdfrdr". По всей видимости это исходные данные для генерации правильного серийного номера. Хорошо, едем дальше.


Строка преобразована в хеш

Дальше строка хешируется в функции по адресу 00402D30 по какому-то алгоритму. Попробуем поискать по какому. Krypto ANALyzer не оставляет сомнений, что это MD5, причем без всяких модификаций.


Использован алгоритм MD5

На всякий случай проверим нашу догадку любым другим сторонним инструментом, посчитав MD5 от строки "MA5dgdfrdr", действительно, так оно и есть, после хеширования получается строка "0d3455b4c7a3858e0f23a456a40ab24e". Первые 16 символов полученной строки и являются серийным номером. Сама регистрация и триальные счетчики в зашифрованном виде хранятся в файле %ProgramData%\1pdfenc.dll. Еще одно уродское поделие, прячущее свои данные в файле с именем динамической библиотеки. Если кому интересно, то расшифровка выполняется здесь:
; Расшифровка регистрационных данных 
.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

Подводим итог. Алгоритм генерации серийного номера следующий: сперва регистрационное имя переводится в верхний регистр, пробелы в заменяются на символ "B". От обработанной строки берутся два первых символа, к ним добавляется строка "5dgdfrdr" и от полученной строки считается MD5. Первые 16 символов результата хеширования являются серийным номером, для удобства они разбиты на группы по 4 символа. Кейген напишете сами.
Теги:
защита, взлом
Добавлено: 20 Сентября 2013 02:06:06 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...