Исследование защиты программы 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: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

Изменения в ресурсах

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


Программа успешно изменена

Вот так, потратив некоторое количество времени, можно сделать из демо-версии программы ее полную версию. Обычно демонстрационные версии программ не только урезаны по функционалу, но в них вообще отсутствуют нужные участки кода, так что здесь нам просто повезло.
Теги:
защита, взлом
Добавлено: 18 Сентября 2013 03:17:05 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...