如何使用命令行工具从 PDF 文件中提取 JavaScript 对象?
我正在尝试使用带有此功能的 Python 制作 GUI。
我找到了这两个模块但无法运行它们:pyPdf2 和 pyPdf。
最佳答案
当您处理 PDF 中的 JavaScript 时,您必须注意两种情况(在仔细调查相关文件之前,您不一定能预先区分它们)。
案例 1:无害、“有用”、“开放”的 JavaScript
OP 提供了来自 PlanetPDF 的示例 JavaScript 加载 PDF 的链接:
那个一种是容易处理。只需使用
pdfinfo -js
(但请确保您使用的是基于 Poppler 的最新版本之一——基于 XPDF 的 pdfinfo
不知道 -js
!)结果如下:
$ pdfinfo -js ppjslc_commonex_3.pdf
Title: Planet PDF JavaScript Learning Center Example #2
Author: Chris Dahl, ARTS PDF Global Services
Creator: PScript5.dll Version 5.2.2
Producer: Acrobat Distiller 6.0.1 (Windows)
CreationDate: Thu Oct 28 18:13:38 2004
ModDate: Thu Oct 28 18:17:46 2004
Tagged: no
UserProperties: no
Suspects: no
Form: AcroForm
JavaScript: yes
Pages: 1
Encrypted: no
Page size: 612 x 792 pts (letter)
Page rot: 0
File size: 84720 bytes
Optimized: no
PDF version: 1.5
Name Dictionary "docOpened":
// variable to store whether document has been opened already or not
var bAlreadyOpened;
function docOpened()
{
if(bAlreadyOpened != "true")
{
// document has just been opened
var d = new Date();
var sDate = util.printd("mm/dd/yyyy", d);
// set date now
app.alert("About to insert date into field now");
this.getField("todaysDate").value = sDate;
// now set bAlreadyOpened to true so it doesn’t
// run again
bAlreadyOpened = "true";
}
else
{
// document has already been opened
}
}
// call the docOpened() function
docOpened();
如您所见,
-js
尝试自动从 PDF 中提取所有 JavaScript 并将其打印到 <stdout>
.这是一个无害的 JavaScript,不会试图隐藏自己,不会混淆,在弹出有关它将要执行的操作的信息消息后,将当前日期插入到表单字段中。
案例 2:恶意、破坏性、隐藏和混淆的 JavaScript
在野外有许多包含 JavaScript 的 PDF 示例,它们不像上述那样无害,它们是由恶意软件作者编写的,他们追求您的钱,或者只是追求成功后给他们带来的“乐趣”。
这些情况下的 JavaScript 经常被隐藏和混淆。
例如,为了隐藏甚至包含 JavaScript 的事实,他们做 不是 使用“清除”
/JavaScript
和 /JS
相应 PDF 对象词典中的名称。这些名字必须出现在 PDF 阅读器中,以了解他们应该如何处理该对象。相反,他们使用另一种方法来表示相同的名称:
/#4Aava#53cript
/J#61vaScrip#74
/#4a#61#76#61#53#63#72#69#70#74
[...]
不幸的是,这种方法甚至被官方 PDF 规范文档定为“合法”。它允许用它们各自的 ASCII 十六进制数(与每个替换字符的前导哈希符号相结合)替换 PDF 名称标记中部分甚至所有字符的选择。
这可以欺骗一些更天真的尝试找到
/JavaScript
PDF 中的字符串(例如使用简单的 grep -a
)。有一些免费软件工具可用,可用于剖析和分析此类案例:
pdfid.py
and pdf-parser.py
对这些案例的第一眼(甚至完整分析)非常有用。 但是所有这些工具只有在您已经拥有(至少是一些基本的)时才有用 knowledge about PDF syntax (当然还有关于 JavaScript)。
以下是三个使用
pdfid.py
的简短示例针对三种不同的 PDF:pdfid.py
发现的 JavaScript :$ pdfid.py nojavascript.pdf
PDFiD 0.2.1 nojavascript.pdf
PDF Header: %PDF-1.5
obj 193
endobj 193
stream 54
endstream 54
xref 1
trailer 1
startxref 1
/Page 1
/Encrypt 0
/ObjStm 0
/JS 0
/JavaScript 0
/AA 12
/OpenAction 0
/AcroForm 1
/JBIG2Decode 0
/RichMedia 0
/Launch 0
/EmbeddedFile 0
/XFA 0
/Colors > 2^24 0
/JavaScript
以明文形式出现在 PDF 中:$ pdfid.py javascript1.pdf | grep -E '(/JS|/JavaScript)
/JS 30
/JavaScript 30
/JavaScript
和 /JS
两者都被混淆了:$ pdfid.py javascript2.pdf | grep -E '(/JS|/JavaScript)
/JS 30(30)
/JavaScript 30(30)
事实
pdfid.py
括号中列出的第二个数字表明,它发现了混淆。 30 个中的 30 个 /JavaScript
名称标记被隐藏——这使得 PDF 文件高度可疑,需要进一步调查。因为没有“正常”的 PDF 生成工具(我知道)使用这种混淆... 更新
我的另一个答案中提供了不同方法(包括命令行工具)的列表:
目前最好的工具是 peepdf.py ,因为它甚至可以处理严重混淆的 JavaScript。这是一个 Python 框架,用于探索(和更改)PDF 文件的源代码,专门用于分析恶意 PDF。
其作者最近添加了
extract
子命令,它提取并打印 PDF 中包含的 JavaScript 的源代码:简短的使用信息:
git clone https://github.com/jesparza/peepdf.git git.peepdf
$PATH
中):cd git.peepdf ;
ln -s $(pwd)/peepdf.py ${HOME}/bin/peepdf.py
echo 'extract js > all-javascripts-from-my.pdf' > xtract.txt
-l
和强制模式忽略错误, -f
)以非交互方式执行包含在新创建的脚本文件中的子命令行, -s
:peepdf.py -l -f -s xtract.txt my.pdf
cat all-javascripts-from-my.pdf
关于javascript - 如何使用命令行工具从 PDF 文件中提取 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29342542/