当您处理 PDF 中的 JavaScript 时,您必须注意两种情况(在仔细调查相关文件之前,您不一定能提前区分这两种情况)。
- “无害”的 JavaScript
- 恶意JavaScript
案例 1:无害、“有用”、“开放”的 JavaScript
OP 提供了来自 PlanetPDF 的 JavaScript 加载 PDF 示例的链接:
- http://www.planetpdf.com/planetpdf/pdfs/ppjslc_commonex_3.pdf http://www.planetpdf.com/planetpdf/pdfs/ppjslc_commonex_3.pdf
That一是易于处理。只需使用pdfinfo -js
(但请确保您使用最新的之一,Poppler基于版本——基于 XPDFpdfinfo
不知道-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 的事实,他们这样做not使用“清晰”/JavaScript
and /JS
相应 PDF 对象字典中的名称。这些名字must让 PDF 读者知道他们应该如何处理该对象。
相反,他们使用另一种方法来表达相同的名称:
/#4Aava#53cript
/J#61vaScrip#74
/#4a#61#76#61#53#63#72#69#70#74
[...]
不幸的是,这种方法甚至被官方 PDF 规范文档认定为“合法”。它允许用各自的 ASCII 十六进制数字(与每个替换字符的前导哈希符号相结合)替换 PDF 名称标记中的部分甚至全部字符。
这可能会愚弄一些更天真的尝试来寻找/JavaScript
PDF 中的字符串(例如使用简单的grep -a
).
有一些可用的免费软件工具可用于剖析和分析此类案例:
Didier Stevens 的 Python 脚本pdfid.py and pdf-parser.py http://blog.didierstevens.com/programs/pdf-tools/对于初步了解(甚至完整分析)这些案例非常有用。
Jose Miguel Esparza 的 Python 框架peepdf http://eternal-todo.com/tools/peepdf-pdf-analysis-tool更是强大。它甚至可以对任何混淆的 JavaScript 进行反混淆、美化并使其重新可读contentsPDF 内。
Origami http://esec-lab.sogeti.com/pages/Origami基于 Ruby,而且功能也相当强大。还有更多...
但所有这些工具只有在您已经拥有(至少有一些基本工具)时才有用PDF语法知识 https://github.com/angea/PDF101(当然还有 JavaScript)。
这是三个使用的简短示例pdfid.py
针对三个不同的 PDF:
-
第一个不包含任何被发现的 JavaScriptpdfid.py
:
$ 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,名称/JavaScript
以明文形式显示在 PDF 中:
$ pdfid.py javascript1.pdf | grep -E '(/JS|/JavaScript)
/JS 30
/JavaScript 30
-
最后一个包含 JavaScript 和名称标记/JavaScript
and /JS
两者都被混淆了:
$ pdfid.py javascript2.pdf | grep -E '(/JS|/JavaScript)
/JS 30(30)
/JavaScript 30(30)
事实是pdfid.py
括号中列出的第二个数字表明它发现了混淆。 30 满分 30/JavaScript
名称标记被模糊化——这使得 PDF 文件高度可疑,需要进一步调查。因为没有“普通”PDF 生成工具(据我所知)使用这种混淆......
Update
我的另一个答案中提供了不同方法(包括命令行工具)的列表:
- "从恶意 PDF 中提取 JavaScript https://stackoverflow.com/a/10232213/359307"
目前最好的工具是peepdf.py https://github.com/jesparza/peepdf,因为它甚至可以处理严重混淆的 JavaScript。这是一个用于探索(和更改)PDF 文件源代码的 Python 框架,专门用于分析恶意 PDF。
它的作者最近添加了extract
子命令,提取并打印 PDF 中包含的 JavaScript 源代码:
简短的使用信息:
- 从 GitHub 查看源代码:
git clone https://github.com/jesparza/peepdf.git git.peepdf
- 创建一个符号链接(位于您的
$PATH
) 到脚本:
cd git.peepdf ;
ln -s $(pwd)/peepdf.py ${HOME}/bin/peepdf.py
- 使用 PeePDF 子命令创建脚本文件以提取 javascript:
echo 'extract js > all-javascripts-from-my.pdf' > xtract.txt
- 运行PeePDF(设置松散解析模式,
-l
, and 强制模式忽略错误, -f
) 以非交互方式执行新创建的脚本文件中包含的子命令行,-s
:
peepdf.py -l -f -s xtract.txt my.pdf
- 研究提取的 JavaScript 的内容:
cat all-javascripts-from-my.pdf