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

Dan*_*Frs 7 javascript pdf cmd pypdf python-2.7

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

我正在尝试使用此功能使用Python制作GUI.

我发现这两个模块但无法运行它们:pyPdf2和pyPdf.

Kur*_*fle 13

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

  1. "无害"JavaScript
  2. 恶意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();
Run Code Online (Sandbox Code Playgroud)

如您所见,-js尝试从PDF中自动提取所有JavaScript并将其打印到<stdout>.

这个是一个无害的JavaScript,没有试图隐藏自己,没有混淆,在弹出一个关于它将要做什么的信息消息后,将当前日期插入到表单字段中.

案例2:恶意,破坏性,隐藏和混淆的JavaScript

在包含JavaScripts的荒野中有许多PDF文件的例子,它们不像上面那样无害,是由追随你的钱的恶意软件作者写的,或者只是在他们成功后给予他们的"乐趣"之后.

在这些情况下,JavaScripts经常被隐藏和混淆.

例如,为了隐藏甚至包含JavaScript的事实,它们使用相应PDF对象字典中的"clear" /JavaScript/JS名称.这些名称必须存在,以便PDF阅读器知道它们应该如何处理对象.

相反,他们使用另一种方法来表达相同的名称:

/#4Aava#53cript
/J#61vaScrip#74
/#4a#61#76#61#53#63#72#69#70#74
[...]
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法甚至被官方的PDF规范文件"合法化".它允许通过各自的ASCII十六进制数替换PDF名称标记中某些甚至所有字符的选择(结合每个替换字符的前导哈希符号).

这可以欺骗一些更天真的尝试/JavaScript在PDF中找到字符串(例如使用简单grep -a).

有一些免费软件工具可用于剖析和分析此类案例:

  • 迪迪埃·史蒂文斯的Python脚本pdfid.pypdf-parser.py对于这些情况首先要看(甚至为一个完整的分析)是非常有用的.

  • Jose Miguel Esparza的Python框架peepdf更强大.它甚至可以对PDF中的任何混淆的JavaScript 内容进行去混淆,美化和再次可读.

  • Origami是基于Ruby的,也非常强大.还有一些......

但是,如果您已经拥有(至少一些基本的)PDF语法知识(当然还有JavaScript),那么所有这些工具都是有用的.

以下是pdfid.py针对三种不同PDF的三个简短示例:

  1. 第一个不包含任何由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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二个包含JavaScript,名称/JavaScript在PDF中以明文形式显示:

    $ pdfid.py javascript1.pdf | grep -E '(/JS|/JavaScript)
    
      /JS                   30
      /JavaScript           30
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后一个包含JavaScript,名称标记/JavaScript/JS两者都被混淆:

    $ pdfid.py javascript2.pdf | grep -E '(/JS|/JavaScript)
    
      /JS                   30(30)
      /JavaScript           30(30)
    
    Run Code Online (Sandbox Code Playgroud)

    pdfid.py在括号中列出第二个数字的事实表明它发现了混淆.30个/JavaScript名称令牌中有30个被遮挡 - 这使得PDF文件高度可疑,这需要进一步调查.因为没有"普通"的PDF生成工具(我知道)使用这种混淆...


更新

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

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

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

简短的使用信息:

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