如何使用静态工具检查PDF是否受密码保护

4

我看到了很多关于这个主题的问题。在答案中,用户必须使用一些pdf库或内置支持来加载pdf,然后根据库函数,用户可以确定pdf是否加密。我想知道是否可能使用某些静态分析工具(例如YARA),只读取文件内容作为二进制/字符串数据而不是完整文件结构,就能检测PDF是否为加密文件?

1个回答

10

PDF加密是在文件尾部字典中的Encrypt条目中指示的,详见Adobe PDF参考手册(v.1.7)中的第3.4.4节(表格3.13)。

因此,要检测PDF加密,需前往文件末尾并向上查找第一行仅包含单词“trailer”的内容,然后再向下查找包含“/Encrypt”字符串的内容。如果存在,则文件已加密,否则未加密。

现在,要检测PDF是否受到密码保护(即必须输入密码才能打开),则会更加困难。您基本上需要读取/Encrypt关键字之后的对象引用(例如“14 0 R”),跳转到文件开头并查找该对象(例如“14 0 obj <<”),并查找该字典中的/Filter、/R和/U键。

如果/Filter的值为/Standard,则可以使用算法3.6的导言(第127页)来确定用户密码是否为空字符串,从而是否禁止提示输入密码。

因此,如果/R值为2,则应查找/U值是否为特定字符串;如果/R值为3或4,则可以查找/U值是否为另一个特定字符串。如果它不是这些值中的任何一个,则需要用户密码才能打开文档,文档受到密码保护。

您可以按照PDF参考手册中的算法计算这些/U值,或者从现有的不需要密码即可打开的加密PDF文件中找到它们。


谢谢Patrick。我已经尝试使用字符串进行搜索,但似乎有很多非密码保护文件出现在搜索结果中。是否可以增加更多的搜索过滤器? - Red Devil
我已经更新了我的答案,加入了更多步骤来确定PDF文件是否受到密码保护,而不仅仅是加密。 - Patrick Gallot
我能否不依赖于发现关键字/Encrypt/U/ID来判断PDF是否受密码保护呢?@PatrickGallot - Abhishek Kumar
@AbhishekKumar 通常情况下,密码保护意味着需要输入密码才能打开PDF文件进行查看。然而,更常见的做法是对文件进行加密以防止修改或内容提取(除非使用所有者密码先解锁文档),在这种后一种加密情况下,用户不必提供密码即可查看文档。 - Patrick Gallot
这是正确的,我的用例只是检测PDF是否使用用户密码加密,所以我想找到这些/Encrypt,/U,/ID将满足我的要求@PatrickGallot - Abhishek Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接