Blog. Just Blog

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

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

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

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

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

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

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

Отправляем распакованный файл в дизассемблер и поищем условие, при котором появляется сообщение о неправильной регистрации. Тут тоже никаких сложностей возникнуть не должно.
  1. ...
  2. .text:00405A0A                 mov     eax, dword ptr ValueName+4
  3. .text:00405A0F                 mov     edx, [esp+8]
  4. ; Вызвать функцию сравнения введенного серийного номера и правильного.
  5. ; В регистре EAX - указатель на введенный серийный номер, в регистре EDX -
  6. ; указатель на правильный серийный номер.
  7. .text:00405A13                 push    eax
  8. .text:00405A14                 push    edx
  9. .text:00405A15                 call    __mbsicmp
  10. .text:00405A1A                 add     esp, 8
  11. .text:00405A1D                 mov     byte ptr [esp+2Ch], 3
  12. .text:00405A22                 test    eax, eax
  13. .text:00405A24                 lea     ecx, [esp+8]
  14. ; Если строки не равны, то вывести сообщение о неудачной регистрации
  15. .text:00405A28                 jnz     short loc_405A8D
  16. .text:00405A2A                 call    sub_421E35
  17. ; Сообщение об удачной регистрации
  18. .text:00405A2F                 push    offset aRegistrationSu
  19. ; "Registration successed, thank for your "...
  20. .text:00405A34                 lea     ecx, [esp+0Ch]
  21. .text:00405A38                 call    sub_421EA3
  22. .text:00405A3D                 lea     eax, [esp+20h]
  23. .text:00405A41                 mov     bl, 9
  24. .text:00405A43                 push    eax
  25. .text:00405A44                 mov     ecx, offset unk_441E98
  26. .text:00405A49                 mov     [esp+30h], bl
  27. .text:00405A4D                 call    sub_404450
  28. .text:00405A52                 push    40h
  29. .text:00405A54                 lea     ecx, [esp+0Ch]
  30. .text:00405A58                 push    eax
  31. .text:00405A59                 push    ecx
  32. .text:00405A5A                 mov     ecx, esi
  33. .text:00405A5C                 mov     byte ptr [esp+38h], 0Ah
  34. .text:00405A61                 call    sub_405D20
  35. .text:00405A66                 lea     ecx, [esp+20h]
  36. .text:00405A6A                 mov     [esp+2Ch], bl
  37. .text:00405A6E                 call    sub_421E35
  38. .text:00405A73                 lea     ecx, [esp+8]
  39. .text:00405A77                 mov     byte ptr [esp+2Ch], 3
  40. .text:00405A7C                 call    sub_421E35
  41. .text:00405A81                 mov     ecx, offset unk_441E98
  42. .text:00405A86                 call    sub_404EE0
  43. .text:00405A8B                 jmp     short loc_405AE4
  44. .text:00405A8D ; --------------------------------------------------
  45. .text:00405A8D loc_405A8D:
  46. .text:00405A8D                 call    sub_421E35
  47. .text:00405A92                 push    offset aRegistrationFa
  48. ; "Registration failed, please check the c"...
  49. .text:00405A97                 lea     ecx, [esp+0Ch]
  50. .text:00405A9B                 call    sub_421EA3
  51. .text:00405AA0                 lea     edx, [esp+20h]
  52. ...
Если запустить программу под отладчиком, поставить точку останов адресу 00405A13, то после ввода имени и любого серийного номера в регистре EAX будет 16 символов введенного серийника (4 поля по 4 символа), а в регистре EDX - 16 символов серийного номера, который считается правильным для введенного имени. Для этого примера валидной парой будет регистрационное имя ManHunter / PCL и серийный номер 0d34-55b4-c7a3-858e.

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

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

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

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

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

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

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

На всякий случай проверим нашу догадку любым другим сторонним инструментом, посчитав MD5 от строки "MA5dgdfrdr", действительно, так оно и есть, после хеширования получается строка "0d3455b4c7a3858e0f23a456a40ab24e". Первые 16 символов полученной строки и являются серийным номером. Сама регистрация и триальные счетчики в зашифрованном виде хранятся в файле %ProgramData%\1pdfenc.dll. Еще одно уродское поделие, прячущее свои данные в файле с именем динамической библиотеки. Если кому интересно, то расшифровка выполняется здесь:
  1. ; Расшифровка регистрационных данных 
  2. .text:00404FCC                 xor     eax, eax
  3. .text:00404FCE loc_404FCE:
  4. .text:00404FCE                 mov     bl, byte ptr [esp+eax+420h+Buffer]
  5. .text:00404FD2                 xor     bl, 48h
  6. .text:00404FD5                 mov     byte ptr [esp+eax+420h+Buffer], bl
  7. .text:00404FD9                 inc     eax
  8. .text:00404FDA                 cmp     eax, 200h
  9. .text:00404FDF                 jl      short loc_404FCE
Подводим итог. Алгоритм генерации серийного номера следующий: сперва регистрационное имя переводится в верхний регистр, пробелы в заменяются на символ "B". От обработанной строки берутся два первых символа, к ним добавляется строка "5dgdfrdr" и от полученной строки считается MD5. Первые 16 символов результата хеширования являются серийным номером, для удобства они разбиты на группы по 4 символа. Кейген напишете сами.

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

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

Комментарии

Отзывы посетителей сайта о статье
user (30.07.2013 в 07:22):
Что-то триальное окно мне напомнило о продуктах AAAPdf.
Видимо, того же авторства?

Кстати, они тоже довольно успешно ковыряемы.
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):
Как всегда лаконично, чётко и внятно.

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

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

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