如何解码 PDF 流?

How to decode a PDF stream?

我想分析使用 /FlateDecode 编码的 PDF 文件中的流对象。

是否有任何工具可以解码 PDF 中使用的此类编码(ASCII85decode、LZWDecode、RunlenghtDecode 等)?

流内容很可能是 PE 文件结构,PDF 稍后可能会在漏洞利用中使用。

此外,PDF 中有两个 xref 表,没关系,但还有两个 %%EOF 紧跟在 xref 之后。

有这些可以吗? (注意:第二个 xref 使用 /prev 名称指向第一个 xref

这个xref指的是第二个xref:

外部参照
5 6
0000000618 00000 否
0000000658 00000 否
0000000701 00000 否
0000000798 00000 否
0000045112 00000 否
0000045219 00000 否
1 1
0000045753 00000 否
3 1
0000045838 00000 否
预告片
>
开始外部参照
46090
%%EOF

第二个xref:

外部参照
0 5
0000000000 65535 楼
0000000010 00000 否
0000000067 00000 否
0000000136 00000 否
0000000373 00000 否
预告片
>
开始外部参照
429
%%EOF

A %%EOF 注释应出现在文件末尾,任何其他注释(任何以 % 开头的行)可能出现在任何位置点在文件中。所以是的,2 %%EOF 评论是完全有效的。这记录在 PDF Reference 中。查看第 112 页的 1.7 PDF 参考手册中的示例 3.11,以获取规范中具有您描述的结构的文档示例。这是一个已逐步更新的 PDF 文件。

请注意,较新版本的 PDF 可以有交叉引用流,它们本身是压缩的。

解码 PDF 文件的最简单方法是使用专门用于此目的的工具,例如 MuPDF 可以使用“mutool clean -d <input pdf file> <output PDF file>”执行此操作,将解压缩 (-d) 所有压缩流在 PDF 文件中并将输出写入新的 PDF 文件。

否则你将需要使用类似 zlib 的东西来进行 Flate 和 LZW 解压,你将需要编写你自己的 RunLength 解压以及我认为的 ASCIIHex85。更不用说 JBIG、JPEG 和 JPEG2000 了,如果您还想对图像进行解码。

您可以使用 RUPS 分析 PDF 并导出或只查看已解码的流。关于 %%EOF,您可以拥有与 PDF 附加的数量一样多的数量。

  1. "Two xref tables and two %%EOF"?

    这本身并不表示存在恶意 PDF 文件。如果文件是通过 "incremental update" 功能生成的,则每个实例可以有两个甚至更多实例。 (每个数字签名的 PDF 文件都是这样,每个在 Acrobat 中更改并使用 'Save' button/menu 而不是 'Save as...' button/menu也是这样。)

  2. "How to decode a compressed PDF stream from a specific object"?

    看看Didier Stevens' Python script pdf-parser.py。使用此命令行工具,您可以将任何 PDF 对象的解码流转储到文件中。转储 PDF 对象编号 13 的流的示例命令:

    pdf-parser.py -o 13 -f -d obj13.dump my.pdf
    

关于工具,如其他答案中所述,有许多工具可用于解压缩流(在命令行或其他方式上)。但是,也有许多工具可以让您轻松浏览对象树并轻松查看压缩流中的内容,从而轻松检查 PDF 文件。我用过的两个是:

1) callas pdfToolbox Desktop(注意,我与这家公司有关联)。 pdfToolbox 有一个 "Explore PDF" 选项,允许您查看与页面关联的对象,包括实际页面操作符。

2) Enfocus 浏览器。该工具将允许您打开 PDF 文件的对象树的根目录,然后以非常类似于 Mac 上的 Finder 处理文件系统的方式呈现对象层次结构。浏览器甚至允许您通过编辑低级对象、创建新对象或更改流的内容来编辑 PDF 文件(在这种情况下您应该真正知道自己在做什么)。真的很酷

It was pointed out to me that Enfocus Browser is no longer available as I said in the previous version of my answer, but actually it is. You just need to create an Enfocus account in order to download it from here: https://www.enfocus.com/en/support/downloads/old-product-installers

还有另一种情况,您可以有两个 %%EOF,其中文档不一定要增量更新。

根据 Annex F of the official ISO 32000-1:2008 PDF (1.7) standard,详细说明了 'Lineraized PDF' 的内部结构:文件中有 2%%EOF。第一个出现在开头,就在线性化参数字典之后。该部分称为 'First Page Cross-Reference Trailer'。

引用自该文件:

The first-page trailer shall contain valid Size and Root entries, as well as any other entries needed to display the document. The Size value shall be the combined number of entries in both the first-page cross-reference table and the main cross-reference table. The first-page trailer may optionally end with startxref, an integer, and %%EOF, just as in an ordinary trailer. This information shall be ignored

您可以使用 this 在线服务复制粘贴 PDF 数据流并立即查看渲染。