Dan*_*Frs 7 javascript pdf cmd pypdf python-2.7
如何使用命令行工具从PDF文件中提取JavaScript对象?
我正在尝试使用此功能使用Python制作GUI.
我发现这两个模块但无法运行它们:pyPdf2和pyPdf.
Kur*_*fle 13
当您在PDF中处理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();
如您所见,-js尝试从PDF中自动提取所有JavaScript并将其打印到<stdout>.
这个是一个无害的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名称标记中某些甚至所有字符的选择(结合每个替换字符的前导哈希符号).
这可以欺骗一些更天真的尝试/JavaScript在PDF中找到字符串(例如使用简单grep -a).
有一些免费软件工具可用于剖析和分析此类案例:
迪迪埃·史蒂文斯的Python脚本pdfid.py和pdf-parser.py对于这些情况首先要看(甚至为一个完整的分析)是非常有用的.
Jose Miguel Esparza的Python框架peepdf更强大.它甚至可以对PDF中的任何混淆的JavaScript 内容进行去混淆,美化和再次可读.
Origami是基于Ruby的,也非常强大.还有一些......
但是,如果您已经拥有(至少一些基本的)PDF语法知识(当然还有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,名称标记/JavaScript和/JS两者都被混淆:
$ pdfid.py javascript2.pdf | grep -E '(/JS|/JavaScript)
  /JS                   30(30)
  /JavaScript           30(30)
pdfid.py在括号中列出第二个数字的事实表明它发现了混淆.30个/JavaScript名称令牌中有30个被遮挡 - 这使得PDF文件高度可疑,这需要进一步调查.因为没有"普通"的PDF生成工具(我知道)使用这种混淆...
我的另一个答案中提供了不同方法(包括命令行工具)的列表:
目前最好的工具是peepdf.py,因为它甚至可以处理严重混淆的JavaScript.这是一个Python框架,用于探索(和更改)PDF文件的源代码,专门用于分析恶意PDF.
其作者最近添加了extract子命令,该命令提取并打印PDF中包含的JavaScripts的源代码:
简短的使用信息:
git clone https://github.com/jesparza/peepdf.git git.peepdf$PATH在脚本中创建符号链接(在您的中):cd git.peepdf ;ln -s $(pwd)/peepdf.py ${HOME}/bin/peepdf.pyecho 'extract js > all-javascripts-from-my.pdf' > xtract.txt-l和强制方式忽略错误,-f等)执行非交互方式包含在新创建的脚本文件中的子命令行(多个), -s:peepdf.py -l -f -s xtract.txt my.pdfcat all-javascripts-from-my.pdf| 归档时间: | 
 | 
| 查看次数: | 9131 次 | 
| 最近记录: |