
Скриншот программы 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: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
...
Однобайтовый патч перехода по адресу 00557ACC ставит точку в вопросе с работой распакованного файла. Первый рубеж обороны сломлен, снова запускаем программу и пытаемся снять ограничения с какого-нибудь защищенного файла. На выходе получаем вот такое уродство:

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

Маркер демо-версии
Маркер поперек и внизу каждой страницы. Судя по всему, текст скрипта и эти маркеры хранятся в текстовом виде, значит их можно поискать в исполняемом файле и обойти код, который их добавляет. Сперва погасим скрипты:
https://pp.vk.me/c411316/v411316982/8b5f/m7ku5gii-0k.jpg
Текст скрипта в файле
Чуть выше текста находится процедура, которая, похоже, и добавляет скрипт в расшифрованный документ:
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
...
Однобайтовый патч, записывающий команду RET в начало этой процедуры по адресу 00556988, успокаивает наг-окна навсегда. Теперь избавляемся от маркеров в документе.
https://pp.vk.me/c411316/v411316982/8b66/ljAIfgIwfa0.jpg
Текст маркетов в файле
Тоже ничего сложного, разница только в том, что строки хранятся в юникоде. Код оформлен в отдельную процедуру:
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
...
Такой же однобайтовый патч с командой RET по адресу 00556D88 и маркеры из документа бесследно исчезают. Осталось решить проблему с главным ограничением - в полученном документа остается только первая страница, остальные вырезаются. Помните, в самом начале я говорил, что для манипуляций с документами используется бесплатная программа pdftk.exe? Давайте посмотрим ее документацию поподробнее. Там описан пример удаления страниц из PDF-документа:
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-редакторе, а кнопку можно убрать, изменив в редакторе ресурсов окно диалога следующим образом:
https://pp.vk.me/c411316/v411316982/8b75/Ma0Ep9Php4A.jpg
Изменения в ресурсах
Сохраняем изменения, запускаем. Красота да и только!

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