如何使用命令行工具从PDF文件中提取JavaScript对象?
我正在尝试使用Python使用此函数创建GUI。
我找到了这两个模块,但无法运行它们:pyPdf2和pyPdf。
答案 0 :(得分:12)
当您在PDF中处理JavaScript时,您必须了解两种情况(在仔细调查相关文件之前,您无法提前区分这些情况)。
OP提供了一个链接到PlanetPDF的JavaScript加载PDF示例:
一个很容易处理。只需使用pdfinfo -js
(但请确保使用最新的基于 Poppler 的版本之一 - 基于XPDF的pdfinfo
不了解{{1} }!)
结果如下:
-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();
尝试自动从PDF中提取所有JavaScript并将其打印到-js
。
这个是一个无害的JavaScript,在弹出一条关于它将要做什么的信息消息之后,没有试图隐藏自己,没有模糊,将当前日期插入表单字段。 强>
在荒野中有许多PDF包含JavaScripts的例子,这些例子并不像上面那样无害,是由追随你的钱的恶意软件作者写的,或者只是在" fun"之后。如果他们成功就会给他们。
在这些情况下,JavaScripts经常被隐藏和混淆。
例如,为了隐藏甚至包含JavaScript的事实,他们 不 使用&#39; clear&#39;相应PDF对象词典中的<stdout>
和/JavaScript
个名称。这些名称 必须 可供PDF阅读器了解他们应该如何处理对象。
相反,他们使用另一种方法来表达相同的名称:
/JS
不幸的是,这种方法甚至已经制定了#34;合法&#34;由官方PDF规范文档。它允许通过各自的ASCII十六进制数替换PDF名称标记中某些甚至所有字符的选择(结合每个替换字符的前导哈希符号)。
这可以欺骗一些更天真的尝试在PDF中找到/#4Aava#53cript
/J#61vaScrip#74
/#4a#61#76#61#53#63#72#69#70#74
[...]
字符串(例如使用简单的/JavaScript
)。
有一些免费软件工具可用于解剖和分析此类案例:
Didier Stevens&#39; Python脚本 pdfid.py
and pdf-parser.py
对于这些案例的初看(甚至是完整分析)非常有用。
Jose Miguel Esparza的Python框架 peepdf 更强大。它甚至可以对PDF中的任何混淆的JavaScript 内容进行去混淆,美化和再次读取。
Origami 是基于Ruby的,也非常强大。还有一些......
但所有这些工具只有在你已经拥有(至少一些基本的) knowledge about PDF syntax (当然还有JavaScript)时才有用。
以下是针对三种不同PDF使用grep -a
的三个简短示例:
第一个不包含pdfid.py
发现的任何JavaScript:
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
在PDF中以明文形式显示:
/JavaScript
最后一个包含JavaScript,名称标记$ 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)
在括号中列出第二个数字的事实表明,它发现了混淆。 30个pdfid.py
名称令牌中有30个被遮挡 - 这使PDF文件高度可疑,这值得进一步调查。因为没有&#34;正常&#34; PDF生成工具(我已知)使用此混淆...
我的另一个答案中提供了不同方法(包括命令行工具)的列表:
目前最好的工具是 peepdf.py ,因为它甚至可以处理严重混淆的JavaScript。这是一个Python框架,用于探索(和更改)PDF文件的源代码,专门用于分析恶意PDF。
其作者最近添加了/JavaScript
子命令,该命令提取并打印PDF中包含的JavaScripts的源代码:
简短使用信息:
extract
强> 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
强>