如何使用命令行工具从PDF文件中提取JavaScript?

时间:2015-03-30 09:22:14

标签: javascript python-2.7 pdf cmd pypdf

如何使用命令行工具从PDF文件中提取JavaScript对象?

我正在尝试使用Python使用此函数创建GUI。

我找到了这两个模块,但无法运行它们:pyPdf2和pyPdf。

1 个答案:

答案 0 :(得分:12)

当您在PDF中处理JavaScript时,您必须了解两种情况(在仔细调查相关文件之前,您无法提前区分这些情况)。

  1. "无害"的JavaScript
  2. 恶意JavaScript
  3. 案例1:无害,"有用","开放"的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,在弹出一条关于它将要做什么的信息消息之后,没有试图隐藏自己,没有模糊,将当前日期插入表单字段。

    案例2:恶意,破坏性,隐藏和混淆的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的三个简短示例:

    1. 第一个不包含pdfid.py发现的任何JavaScript:

      pdfid.py
    2. 第二个包含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
    3. 最后一个包含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生成工具(我已知)使用此混淆...


    4. 更新

      我的另一个答案中提供了不同方法(包括命令行工具)的列表:

      目前最好的工具是 peepdf.py ,因为它甚至可以处理严重混淆的JavaScript。这是一个Python框架,用于探索(和更改)PDF文件的源代码,专门用于分析恶意PDF。

      其作者最近添加了/JavaScript子命令,该命令提取并打印PDF中包含的JavaScripts的源代码:

      简短使用信息:

      1. 从GitHub查看来源:
        extract
      2. 在脚本中创建一个符号链接(位于git clone https://github.com/jesparza/peepdf.git git.peepdf中):
        $PATH
        cd git.peepdf ;
      3. 使用PeePDF子命令创建脚本文件以提取javascript:
        ln -s $(pwd)/peepdf.py ${HOME}/bin/peepdf.py
      4. 运行PeePDF(设置松散解析模式echo 'extract js > all-javascripts-from-my.pdf' > xtract.txt强制模式以忽略错误-l)以非交互方式执行新创建的脚本文件-f中包含的子命令行:
        -s
      5. 调查提取的JavaScript的内容:
        peepdf.py -l -f -s xtract.txt my.pdf