Как декодировать поток PDF?
Я хочу проанализировать объект потока в PDF файле, который закодирован с помощью /FlateDecode
.
Существуют ли какие-либо инструменты, позволяющие декодировать такое кодирование (ASCII85decode, LZWDecode, RunlenghtDecode и т.д.), используемые в PDF файлах?
Содержимое потока, скорее всего, представляет собой структуру файлов PE, которую PDF, вероятно, будет использовать позже в эксплоите.
Кроме того, в PDF есть две таблицы xref
, это хорошо, но также два %% EOF, которые следуют за xref
.
Является ли присутствие этих прав? (Примечание: второй xref
указывает на 1-й xref
, используя имя /prev
.
это xref
относится ко второй xref
:
xref
5 6
0000000618 00000 n
0000000658 00000 n
0000000701 00000 n
0000000798 00000 n
0000045112 00000 n
0000045219 00000 n
1 1
0000045753 00000 n
3 1
0000045838 00000 n
trailer
>
startxref
46090
%%EOF
второй xref
:
xref
0 5
0000000000 65535 f
0000000010 00000 n
0000000067 00000 n
0000000136 00000 n
0000000373 00000 n
trailer
>
startxref
429
%%EOF
Ответы
Ответ 1
-
"Две таблицы xref
и два %%EOF
"?
Это само по себе не является признаком вредоносного файла PDF. Может быть два или даже более экземпляров каждого, если файл был создан с помощью функции "инкрементного обновления". (Каждый файл PDF с цифровой подписью подобен этому, и каждый файл, который был изменен в Acrobat и сохранен с использованием кнопки/меню "Сохранить" вместо кнопки/меню "Сохранить как...", также похож.)
-
"Как декодировать сжатый поток PDF из определенного объекта"?
Взгляните на скрипт Python Дидье Стивенса pdf-parser.py
. С помощью этого инструмента командной строки вы можете выгружать декодированный поток любого объекта PDF в файл. Пример команды для выгрузки потока объекта PDF с номером 13:
pdf-parser.py -o 13 -f -d obj13.dump my.pdf
Ответ 2
В конце файла должен присутствовать комментарий A %%EOF
, любые другие комментарии (любое начало строки %
) могут присутствовать в любой точке файла. Так что да, 2 %%EOF
комментарии совершенно верны. Это описано в PDF Reference. Пример 3.11 в Справочном руководстве по документу 1.7 на стр. 112 приведен в примере, описанном в спецификации, которая имеет структуру, которую вы описываете. Это файл PDF, который был поэтапно обновлен.
Обратите внимание, что более свежие версии PDF могут иметь перекрестные потоки ссылок, которые сами сжаты.
Самый простой способ декодирования файла PDF - использовать инструмент, предназначенный для этого, например, MuPDF может сделать это с помощью "mutool clean -d <input pdf file> <output PDF file>
" будет распаковывать (-d
) все сжатые потоки в файле PDF и писать вывод в новый файл PDF.
В противном случае вам нужно будет использовать что-то вроде zlib для декомпрессии Flate и LZW, вам нужно будет написать собственную декомпрессию RunLength, а также ASCIIHex85, я думаю. Не говоря уже о JBIG, JPEG и JPEG2000, если вы хотите, чтобы изображения также декодировались.
Ответ 3
Вы можете использовать RUPS для анализа PDF и экспорта или просто посмотреть на уже декодированный поток. О %% EOF вы можете иметь столько же, сколько добавлено в PDF.
Ответ 4
Что касается инструментов, как указано в других ответах, существует ряд инструментов, которые можно использовать для распаковки потоков (в командной строке или другим способом). Тем не менее, существует также ряд инструментов, которые облегчают просмотр PDF файла, позволяя вам легко перемещаться по дереву объектов и легко просматривать содержимое сжатых потоков. Два, которые я использовал:
1) callas pdfToolbox Desktop (осторожно, я связан с этой компанией). В pdfToolbox есть опция "Исследовать PDF", которая позволяет вам видеть объекты, связанные со страницей, вплоть до реальных операторов страницы.
2) Enfocus Browser. Я не уверен, что это еще нужно найти, но этот инструмент позволит вам открыть корень дерева объектов PDF файла и затем представить иерархию объектов так же, как это делает Finder на Mac с файлом системы. Браузер даже позволит вам редактировать PDF файлы (вы должны действительно знать, что вы делаете в этом случае), редактируя низкоуровневые объекты, создавая новые объекты или изменяя содержимое потоков. Очень круто.