Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы 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, запускаем, получаем сообщение:

Сообщение защиты от распаковки
Сообщение защиты от распаковки

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

Строка сообщения найдена
Строка сообщения найдена

Иди к папочке... Ну иди же...
  1. ...
  2. ; Что-то проверяется, даже не интересно смотреть что именно
  3. CODE:00557AC2                 call    sub_557538
  4. ; Если результат не равен 13AA00h, то файл считается распакованным
  5. CODE:00557AC7                 cmp     eax, 13AA00h
  6. CODE:00557ACC                 jnz     short loc_557AF4
  7. ; Иначе считаем, что все в порядке
  8. CODE:00557ACE                 mov     ecx, ds:off_5613F8
  9. CODE:00557AD4                 mov     eax, ds:off_5615D8
  10. CODE:00557AD9                 mov     eax, [eax]
  11. CODE:00557ADB                 mov     edx, off_554B24
  12. CODE:00557AE1                 call    sub_49EC94
  13. CODE:00557AE6                 mov     eax, ds:off_5615D8
  14. CODE:00557AEB                 mov     eax, [eax]
  15. CODE:00557AED                 call    sub_49ED14
  16. CODE:00557AF2                 jmp     short loc_557B17
  17. CODE:00557AF4 ; ----------------------------------------
  18. CODE:00557AF4 loc_557AF4:
  19. CODE:00557AF4                 mov     dl, 2
  20. CODE:00557AF6                 mov     eax, offset aCorruptFilePle
  21. ; "Corrupt file, Please download the new v"...
  22. CODE:00557AFB                 call    sub_4A1340
  23. CODE:00557B00                 push    3
  24. CODE:00557B02                 push    0
  25. CODE:00557B04                 push    0
  26. CODE:00557B06                 push    offset aHttpWww_pdfdec
  27. ; "http://www.pdfdecrypter.com/download.ht"...
  28. CODE:00557B0B                 push    offset aOpen_1  ; "open"
  29. CODE:00557B10                 push    0
  30. CODE:00557B12                 call    ShellExecuteA
  31. ...
Однобайтовый патч перехода по адресу 00557ACC ставит точку в вопросе с работой распакованного файла. Первый рубеж обороны сломлен, снова запускаем программу и пытаемся снять ограничения с какого-нибудь защищенного файла. На выходе получаем вот такое уродство:

Наг-окно в PDF-документе
Наг-окно в PDF-документе

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

Маркер демо-версии
Маркер демо-версии

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

Текст скрипта в файле
Текст скрипта в файле

Чуть выше текста находится процедура, которая, похоже, и добавляет скрипт в расшифрованный документ:
  1. CODE:00556988 sub_556988      proc near
  2. CODE:00556988                 push    ebx
  3. CODE:00556989                 push    esi
  4. CODE:0055698A                 push    edi
  5. CODE:0055698B                 push    ecx
  6. CODE:0055698C                 mov     esi, edx
  7. CODE:0055698E                 mov     edi, esp
  8. CODE:00556990                 mov     dl, 1
  9. CODE:00556992                 mov     eax, off_52F194
  10. CODE:00556997                 call    sub_54703C
  11. CODE:0055699C                 mov     ebx, eax
  12. CODE:0055699E                 lea     eax, [ebx+4]
  13. CODE:005569A1                 mov     edx, offset aVarOutputNullO
  14. ; "var output = null; output = \"This PDF file"...
  15. CODE:005569A6                 call    sub_404C9C
  16. CODE:005569AB                 mov     dl, 1
  17. CODE:005569AD                 mov     eax, off_528100
  18. CODE:005569B2                 call    sub_529E88
  19. CODE:005569B7                 mov     [edi], eax
  20. ...
Однобайтовый патч, записывающий команду RET в начало этой процедуры по адресу 00556988, успокаивает наг-окна навсегда. Теперь избавляемся от маркеров в документе.

Текст маркетов в файле
Текст маркетов в файле

Тоже ничего сложного, разница только в том, что строки хранятся в юникоде. Код оформлен в отдельную процедуру:
  1. CODE:00556D88 sub_556D88      proc near
  2. CODE:00556D88 var_8           = dword ptr -8
  3. CODE:00556D88 var_4           = dword ptr -4
  4. CODE:00556D88                 push    ebp
  5. CODE:00556D89                 mov     ebp, esp
  6. CODE:00556D8B                 add     esp, 0FFFFFFF8h
  7. CODE:00556D8E                 mov     [ebp+var_4], edx
  8. CODE:00556D91                 mov     eax, [ebp+var_4]
  9. CODE:00556D94                 mov     eax, [eax]
  10. CODE:00556D96                 xor     edx, edx
  11. CODE:00556D98                 call    sub_54672C
  12. CODE:00556D9D                 mov     dl, 1
  13. CODE:00556D9F                 mov     eax, off_52F520
  14. CODE:00556DA4                 call    sub_543F30
  15. CODE:00556DA9                 mov     [ebp+var_8], eax
  16. CODE:00556DAC                 xor     eax, eax
  17. CODE:00556DAE                 push    ebp
  18. CODE:00556DAF                 push    offset loc_556E4D
  19. CODE:00556DB4                 push    dword ptr fs:[eax]
  20. CODE:00556DB7                 mov     fs:[eax], esp
  21. CODE:00556DBA                 mov     eax, [ebp+var_8]
  22. CODE:00556DBD                 add     eax, 20h
  23. CODE:00556DC0                 mov     edx, offset aPdfDecrypterDe
  24. ; "PDF Decrypter DEMO"
  25. CODE:00556DC5                 call    sub_4053A0
  26. CODE:00556DCA                 mov     eax, [ebp+var_8]
  27. CODE:00556DCD                 mov     dword ptr [eax+8], 2Dh
  28. CODE:00556DD4                 mov     eax, [ebp+var_8]
  29. CODE:00556DD7                 mov     eax, [eax+24h]
  30. CODE:00556DDA                 mov     edx, offset aTimesNewRoman
  31. ; "Times New Roman"
  32. CODE:00556DDF                 call    sub_42A460
  33. CODE:00556DE4                 mov     eax, [ebp+var_8]
  34. CODE:00556DE7                 mov     eax, [eax+24h]
  35. CODE:00556DEA                 mov     edx, 28h
  36. CODE:00556DEF                 call    sub_42A4D8
  37. ...
Такой же однобайтовый патч с командой 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
Строка вызова программы pdftk

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

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

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

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

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

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 4480 | Комментариев: 13

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

Комментарии

Отзывы посетителей сайта о статье
pawel97 (07.03.2016 в 00:22):
Ту, что сейчас качается, можно регать ключом. UPX теперь не запакован, но проверка на размер файла осталась - как будто он при бит-хаке миняется.
Смотрел в IDR, примечательно, как аффтар обозвал форму ввода ключа - frmHelp!
Там по идее хэш серийника сравнивается с захардкоденными... В общем, если патчить не заморачиваясь, то получается единственный байт по адресу 00554F0A, меняем jnz на jmp, отыскалось из обработчика создания главной формы. Вотермарки не добавляет, страницы не режет, в эбауте registered.
Что до юзабилити, сабж - бесполезная фигня. Народные целители на счёт раз делают такие декрипторы из Foxit/XChange и других pdf-комбайнов.
К слову: не работает на доках с 256 aes шифрованием, просит какой-то User or Owner Password, ввожу заведомо верный (сам же шифровал) - не принимает. С такими же капризами не снимает пароль на открытие, только на изменение/копирование.
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
Михаил (17.10.2011 в 17:52):
Распаковал  upx307w -d .
Окошко о "Каррапте" выдает и открывает сайт.
Вписал первый C3h (на 00557ACC и отдельно на 00557AC7) сохранил каждый файл отдельно.
Программы, обе, не запускаются... просто ни чего не происходит и на экране ни чего не появляется.(WinXP SP3)
UNIX (14.10.2011 в 09:07):
Детально расписано!!!!
Для людей начинающих заниматься реверсингом отличная статья!
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):
О-о жесть...в смысле круто!

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

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

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