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

前端之家收集整理的这篇文章主要介绍了如何使用命令行工具从PDF文件中提取JavaScript?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何使用命令行工具从PDF文件提取 JavaScript对象?

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

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

解决方法

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

>“无害”JavaScript
>恶意JavaScript

案例1:无害,“有用”,“开放”的JavaScript

OP提供了一个链接到PlanetPDF的JavaScript加载PDF示例:

> http://www.planetpdf.com/planetpdf/pdfs/ppjslc_commonex_3.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

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

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

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

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

/#4Aava#53cript
/J#61vaScrip#74
/#4a#61#76#61#53#63#72#69#70#74
[...]

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

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

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

> Didier Stevens的Python脚本pdfid.py and pdf-parser.py对于这些案例的初看(甚至是完整的分析)非常有用.
> Jose Miguel Esparza的Python框架peepdf更加强大.它甚至可以对PDF中的任何混淆的JavaScript内容进行去混淆,美化和再次可读.
> Origami是基于Ruby的,也非常强大.还有一些……

但是所有这些工具仅在你已经拥有(至少一些基本的)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,名称/ JavaScript以明文形式显示在PDF中:

$pdfid.py javascript1.pdf | grep -E '(/JS|/JavaScript)

  /JS                   30
  /JavaScript           30

>最后一个包含JavaScript,名称tokens / JavaScript和/ JS都被混淆:

$pdfid.py javascript2.pdf | grep -E '(/JS|/JavaScript)

  /JS                   30(30)
  /JavaScript           30(30)

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

更新

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

>“Extract JavaScript from malicious PDF

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

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

简短的使用信息:

>从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和强制模式忽略错误,-f)以非交互方式执行新创建的脚本文件中包含的子命令行-s:peepdf.py -l -f -sxtract.txt my.pdf>调查提取的JavaScript的内容:cat all-javascripts-from-my.pdf

猜你在找的JavaScript相关文章