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

标签 javascript python-2.7 pdf cmd pypdf

如何使用命令行工具从 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

    在野外有许多包含 JavaScript 的 PDF 示例,它们不像上述那样无害,它们是由恶意软件作者编写的,他们追求您的钱,或者只是追求成功后给他们带来的“乐趣”。

    这些情况下的 JavaScript 经常被隐藏和混淆。

    例如,为了隐藏甚至包含 JavaScript 的事实,他们做 不是 使用“清除”/JavaScript/JS相应 PDF 对象词典中的名称。这些名字必须出现在 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 对这些案例的第一眼(甚至完整分析)非常有用。
  • 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,名称标记 /JavaScript/JS两者都被混淆了:
    $ pdfid.py javascript2.pdf | grep -E '(/JS|/JavaScript)
    
      /JS                   30(30)
      /JavaScript           30(30)
    

    事实pdfid.py括号中列出的第二个数字表明,它发现了混淆。 30 个中的 30 个 /JavaScript名称标记被隐藏——这使得 PDF 文件高度可疑,需要进一步调查。因为没有“正常”的 PDF 生成工具(我知道)使用这种混淆...


  • 更新

    我的另一个答案中提供了不同方法(包括命令行工具)的列表:
  • "Extract JavaScript from malicious PDF "

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

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

    简短的使用信息:
  • 查看来自 GitHub 的源代码:
    git clone https://github.com/jesparza/peepdf.git git.peepdf
  • 创建指向脚本的符号链接(symbolic link)(在您的 $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 -s xtract.txt my.pdf
  • 调查提取的 JavaScript 的内容:
    cat all-javascripts-from-my.pdf
  • 关于javascript - 如何使用命令行工具从 PDF 文件中提取 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29342542/

    相关文章:

    javascript - 你如何每隔几个轮子滴答声或每隔几秒调用一个轮子函数?

    javascript - 在Windows机器上安装expressjs时出错

    python - 如果元数据不存在,PDF-Plumber 提取标题

    python - 不支持的格式字符?

    pdf - 如何从 shell 脚本中判断扫描的 PDF 的分辨率?

    javascript - JSPDF 和 AutoTable 的标题行问题

    javascript - 什么是 JSTH_keys()?

    javascript - Instagram API,/media/recent 只显示当年的图像?

    python - python 中是否有 chgrp -R 的等效项?

    php - shell_exec 不工作无法转换 pdftotext