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

Скриншот программы PDF Decrypter Pro
PDF Decrypter Pro, как можно догадаться из названия, очередной продукт для снятия защиты с документов PDF. Вообще, это хорошо, что таких программ становится все больше. Непонятно только, почему программы, заведомо нарушающие чьи-то авторские права и снимающие установленные авторами ограничения, пытаются распространяться за деньги. Придется внести некоторые коррективы для восстановления гармонии.
Исследуем сперва офсайт на предмет наличия ссылок на закачку. Такая ссылка есть, но меня в ней смущает слово "DEMO". Ладно, за неимением лучшего качаем что дают, разбираться будем дальше. После установки дистрибутива выясняется, что опасения не напрасны, это действительно демонстрационная версия, причем без какой-либо возможности регистрации. Версия без ограничений предоставляется только после покупки, но нас это не интересует. Попробуем превратить демо-версию в аналог полной версии.
Сперва посмотрим, что за исполняемые файлы используются в PDF Decrypter Pro. Основной файл PDFDecrypter.exe и деинсталлятор unins000.exe, тут все понятно, вопросов нет. А вот что такое pdftk.exe и pdfinfo.exe? Первый файл после запуска в консоли честно сообщил, что это бесплатная программа PDF Toolkit, предназначенная для манипулирования PDF-файлами. Кому интересно, запустите ее в консоли с параметром --help и посмотрите на возможности. Со вторым пришлось повозиться чуть дольше, в итоге выяснилось, что это составная часть не менее бесплатного пакета Xpdf, предназначенная для получения информации о PDF-файле. И есть у меня подозрение, что всю работу выполняют эти две бесплатные программы, а PDF Decrypter - это всего лишь красивая обертка над ними, к тому же платная. Интересно, авторам этих бесплатных утилит хоть что-то перепадает от продаж? Ладно, возвращаемся к обертке. Визуальный осмотр показывает, что PDFDecrypter.exe упакован UPX. Распаковываем его самим UPX, запускаем, получаем сообщение:

Сообщение защиты от распаковки
После чего в браузере открывается страница загрузки на офсайте. Ну надо же, какой ужас, защита от распаковки! Загоняем распакованный файл в дизассемблер, параллельно поищем это сообщение в файле.

Строка сообщения найдена
Иди к папочке... Ну иди же...
Code (Assembler) : Убрать нумерацию
- ...
- ; Что-то проверяется, даже не интересно смотреть что именно
- CODE:00557AC2 call sub_557538
- ; Если результат не равен 13AA00h, то файл считается распакованным
- CODE:00557AC7 cmp eax, 13AA00h
- CODE:00557ACC jnz short loc_557AF4
- ; Иначе считаем, что все в порядке
- CODE:00557ACE mov ecx, ds:off_5613F8
- CODE:00557AD4 mov eax, ds:off_5615D8
- CODE:00557AD9 mov eax, [eax]
- CODE:00557ADB mov edx, off_554B24
- CODE:00557AE1 call sub_49EC94
- CODE:00557AE6 mov eax, ds:off_5615D8
- CODE:00557AEB mov eax, [eax]
- CODE:00557AED call sub_49ED14
- CODE:00557AF2 jmp short loc_557B17
- CODE:00557AF4 ; ----------------------------------------
- CODE:00557AF4 loc_557AF4:
- CODE:00557AF4 mov dl, 2
- CODE:00557AF6 mov eax, offset aCorruptFilePle
- ; "Corrupt file, Please download the new v"...
- CODE:00557AFB call sub_4A1340
- CODE:00557B00 push 3
- CODE:00557B02 push 0
- CODE:00557B04 push 0
- CODE:00557B06 push offset aHttpWww_pdfdec
- ; "http://www.pdfdecrypter.com/download.ht"...
- CODE:00557B0B push offset aOpen_1 ; "open"
- CODE:00557B10 push 0
- CODE:00557B12 call ShellExecuteA
- ...

Наг-окно в PDF-документе
Наг-окно, сделанное на JavaScript и встроенное в документ. Оно появляется при открытии документа и при его закрытии.

Маркер демо-версии
Маркер поперек и внизу каждой страницы. Судя по всему, текст скрипта и эти маркеры хранятся в текстовом виде, значит их можно поискать в исполняемом файле и обойти код, который их добавляет. Сперва погасим скрипты:

Текст скрипта в файле
Чуть выше текста находится процедура, которая, похоже, и добавляет скрипт в расшифрованный документ:
Code (Assembler) : Убрать нумерацию
- CODE:00556988 sub_556988 proc near
- CODE:00556988 push ebx
- CODE:00556989 push esi
- CODE:0055698A push edi
- CODE:0055698B push ecx
- CODE:0055698C mov esi, edx
- CODE:0055698E mov edi, esp
- CODE:00556990 mov dl, 1
- CODE:00556992 mov eax, off_52F194
- CODE:00556997 call sub_54703C
- CODE:0055699C mov ebx, eax
- CODE:0055699E lea eax, [ebx+4]
- CODE:005569A1 mov edx, offset aVarOutputNullO
- ; "var output = null; output = \"This PDF file"...
- CODE:005569A6 call sub_404C9C
- CODE:005569AB mov dl, 1
- CODE:005569AD mov eax, off_528100
- CODE:005569B2 call sub_529E88
- CODE:005569B7 mov [edi], eax
- ...

Текст маркетов в файле
Тоже ничего сложного, разница только в том, что строки хранятся в юникоде. Код оформлен в отдельную процедуру:
Code (Assembler) : Убрать нумерацию
- CODE:00556D88 sub_556D88 proc near
- CODE:00556D88 var_8 = dword ptr -8
- CODE:00556D88 var_4 = dword ptr -4
- CODE:00556D88 push ebp
- CODE:00556D89 mov ebp, esp
- CODE:00556D8B add esp, 0FFFFFFF8h
- CODE:00556D8E mov [ebp+var_4], edx
- CODE:00556D91 mov eax, [ebp+var_4]
- CODE:00556D94 mov eax, [eax]
- CODE:00556D96 xor edx, edx
- CODE:00556D98 call sub_54672C
- CODE:00556D9D mov dl, 1
- CODE:00556D9F mov eax, off_52F520
- CODE:00556DA4 call sub_543F30
- CODE:00556DA9 mov [ebp+var_8], eax
- CODE:00556DAC xor eax, eax
- CODE:00556DAE push ebp
- CODE:00556DAF push offset loc_556E4D
- CODE:00556DB4 push dword ptr fs:[eax]
- CODE:00556DB7 mov fs:[eax], esp
- CODE:00556DBA mov eax, [ebp+var_8]
- CODE:00556DBD add eax, 20h
- CODE:00556DC0 mov edx, offset aPdfDecrypterDe
- ; "PDF Decrypter DEMO"
- CODE:00556DC5 call sub_4053A0
- CODE:00556DCA mov eax, [ebp+var_8]
- CODE:00556DCD mov dword ptr [eax+8], 2Dh
- CODE:00556DD4 mov eax, [ebp+var_8]
- CODE:00556DD7 mov eax, [eax+24h]
- CODE:00556DDA mov edx, offset aTimesNewRoman
- ; "Times New Roman"
- CODE:00556DDF call sub_42A460
- CODE:00556DE4 mov eax, [ebp+var_8]
- CODE:00556DE7 mov eax, [eax+24h]
- CODE:00556DEA mov edx, 28h
- CODE:00556DEF call sub_42A4D8
- ...
Remove 'page 13' from in1.pdf to create out1.pdf
pdftk in.pdf cat 1-12 14-end output out1.pdf
or:
pdftk A=in1.pdf cat A1-12 A14-end output out1.pdf
Поищем в файле вызов pdftk с параметром cat:

Строка вызова программы pdftk
Какая прелесть. И тут аффтары облажались, обещали оставить хотя бы половину документа, а отрезают от него вообще все, кроме первой страницы. Открываем файл в hex-редакторе и забиваем фрагмент строки "cat 1-1" пробелами (0x20). Получается обычное конвертирование вместо удаления страниц. Проверяем работу программы, все ограничения демо-версии сняты, программа работает как полная версия. Осталась косметическая доработка - надо убрать все внешние признаки демонстрационной версии, а именно надпись в заголовке главного окна, строку в окне About и кнопку "Buy Now". Строчки легко меняются в любом hex-редакторе, а кнопку можно убрать, изменив в редакторе ресурсов окно диалога следующим образом:

Изменения в ресурсах
Сохраняем изменения, запускаем. Красота да и только!

Программа успешно изменена
Вот так, потратив некоторое количество времени, можно сделать из демо-версии программы ее полную версию. Обычно демонстрационные версии программ не только урезаны по функционалу, но в них вообще отсутствуют нужные участки кода, так что здесь нам просто повезло.
Просмотров: 6291 | Комментариев: 13
Метки: исследование защиты, PDF

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

ManHunter
(04.10.2014 в 15:38):
Kast, слышь, петух ебаный, ты не дохуя ли раскукарекался? Если мозгов нет, то просто иди нахуй, не засоряй интернет своим присутствием.

Kast
(04.10.2014 в 13:04):
Чисто по-русски - повые-вался и в кусты!
Доделай до конца: сделай кряк или выложи в сеть рабочую версию проги )
Так нет, еби-есь все!
Доделай до конца: сделай кряк или выложи в сеть рабочую версию проги )
Так нет, еби-есь все!

EmORDA
(02.01.2013 в 20:34):
хорошо.какой использовался отладчик?

Ingvar
(15.12.2011 в 10:28):
Спасибо за исследование. Повторил "по буквам", всё работает. Респект и уважуха!!! :)

Михаил
(18.10.2011 в 13:36):
Да, действительно, вы же по русски написали "переход", а я RET леплю.
Все получилось и завелось. Спасибо.
Все получилось и завелось. Спасибо.

ManHunter
(17.10.2011 в 17:55):
Статьи по реверсингу подразумевают знание Ассемблера, а не просто книжки с картинками.
http://yandex.ru/yandsearch?te...%D0%B5%D1%80
http://yandex.ru/yandsearch?te...%D0%B5%D1%80

Михаил
(17.10.2011 в 17:52):
Распаковал upx307w -d .
Окошко о "Каррапте" выдает и открывает сайт.
Вписал первый C3h (на 00557ACC и отдельно на 00557AC7) сохранил каждый файл отдельно.
Программы, обе, не запускаются... просто ни чего не происходит и на экране ни чего не появляется.(WinXP SP3)
Окошко о "Каррапте" выдает и открывает сайт.
Вписал первый C3h (на 00557ACC и отдельно на 00557AC7) сохранил каждый файл отдельно.
Программы, обе, не запускаются... просто ни чего не происходит и на экране ни чего не появляется.(WinXP SP3)

UNIX
(14.10.2011 в 09:07):
Детально расписано!!!!
Для людей начинающих заниматься реверсингом отличная статья!
2ManHunter
Хорошо что находишь время и делишься опытом с людьми!!!
Очень порадовали твои инструменты для армы ))) а то обычно всё по старинке приходилось делать )))))
В общем респект Вам ManHunter!!!
2 Contago Реверсинг для Mac Os b Ios не сильно отличается от взлома под Win но есть одно но нужен человек который будет официально покупать программы в Аппсторе (донатор) которые потом будут отучиватся от жадности))))) просто что бы отучить программу от жадности для систем от яблока нужно хотябы получить эту программу )))) а они как всегда платные (((( Как говорится есть материал а вскрытие покажет что там и как )))
Для людей начинающих заниматься реверсингом отличная статья!
2ManHunter
Хорошо что находишь время и делишься опытом с людьми!!!
Очень порадовали твои инструменты для армы ))) а то обычно всё по старинке приходилось делать )))))
В общем респект Вам ManHunter!!!
2 Contago Реверсинг для Mac Os b Ios не сильно отличается от взлома под Win но есть одно но нужен человек который будет официально покупать программы в Аппсторе (донатор) которые потом будут отучиватся от жадности))))) просто что бы отучить программу от жадности для систем от яблока нужно хотябы получить эту программу )))) а они как всегда платные (((( Как говорится есть материал а вскрытие покажет что там и как )))

ManHunter
(13.10.2011 в 23:21):
Нет, я пока обзаводиться яблочной продукцией не планирую.

Contango
(13.10.2011 в 19:50):
manhunter как всегда на высоте!!! Так держать!!! Никогда реверсингом прожек для MAC OS X не занимался? Было бы не плохо и их от жадности отучать...

Dimas
(13.10.2011 в 15:09):
Вот блин даже добавить нечего - все разобрано)
И шваромаршики как всегда на высоте...
И шваромаршики как всегда на высоте...

Morfius
(13.10.2011 в 14:51):
О-о жесть...в смысле круто!

Добавить комментарий
Заполните форму для добавления комментария

Смотрел в IDR, примечательно, как аффтар обозвал форму ввода ключа - frmHelp!
Там по идее хэш серийника сравнивается с захардкоденными... В общем, если патчить не заморачиваясь, то получается единственный байт по адресу 00554F0A, меняем jnz на jmp, отыскалось из обработчика создания главной формы. Вотермарки не добавляет, страницы не режет, в эбауте registered.
Что до юзабилити, сабж - бесполезная фигня. Народные целители на счёт раз делают такие декрипторы из Foxit/XChange и других pdf-комбайнов.
К слову: не работает на доках с 256 aes шифрованием, просит какой-то User or Owner Password, ввожу заведомо верный (сам же шифровал) - не принимает. С такими же капризами не снимает пароль на открытие, только на изменение/копирование.