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

2024-04-19

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

我正在尝试使用带有此功能的Python 制作一个GUI。

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


当您处理 PDF 中的 JavaScript 时,您必须注意两种情况(在仔细调查相关文件之前,您不一定能提前区分这两种情况)。

  1. “无害”的 JavaScript
  2. 恶意JavaScript

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

OP 提供了来自 PlanetPDF 的 JavaScript 加载 PDF 示例的链接:

  • http://www.planetpdf.com/planetpdf/pdfs/ppjslc_commonex_3.pdf http://www.planetpdf.com/planetpdf/pdfs/ppjslc_commonex_3.pdf

That一是易于处理。只需使用pdfinfo -js(但请确保您使用最新的之一,Poppler基于版本——基于 XPDFpdfinfo不知道-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 的事实,他们这样做not使用“清晰”/JavaScript and /JS相应 PDF 对象字典中的名称。这些名字must让 PDF 读者知道他们应该如何处理该对象。

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

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

不幸的是,这种方法甚至被官方 PDF 规范文档认定为“合法”。它允许用各自的 ASCII 十六进制数字(与每个替换字符的前导哈希符号相结合)替换 PDF 名称标记中的部分甚至全部字符。

这可能会愚弄一些更天真的尝试来寻找/JavaScriptPDF 中的字符串(例如使用简单的grep -a).

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

  • Didier Stevens 的 Python 脚本pdfid.py and pdf-parser.py http://blog.didierstevens.com/programs/pdf-tools/对于初步了解(甚至完整分析)这些案例非常有用。

  • Jose Miguel Esparza 的 Python 框架peepdf http://eternal-todo.com/tools/peepdf-pdf-analysis-tool更是强大。它甚至可以对任何混淆的 JavaScript 进行反混淆、美化并使其重新可读contentsPDF 内。

  • Origami http://esec-lab.sogeti.com/pages/Origami基于 Ruby,而且功能也相当强大。还有更多...

但所有这些工具只有在您已经拥有(至少有一些基本工具)时才有用PDF语法知识 https://github.com/angea/PDF101(当然还有 JavaScript)。

这是三个使用的简短示例pdfid.py针对三个不同的 PDF:

  1. 第一个不包含任何被发现的 JavaScriptpdfid.py:

    $ 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
    
  2. 第二个包含 JavaScript,名称/JavaScript以明文形式显示在 PDF 中:

    $ pdfid.py javascript1.pdf | grep -E '(/JS|/JavaScript)
    
      /JS                   30
      /JavaScript           30
    
  3. 最后一个包含 JavaScript 和名称标记/JavaScript and /JS两者都被混淆了:

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

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


Update

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

  • "从恶意 PDF 中提取 JavaScript https://stackoverflow.com/a/10232213/359307"

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

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

简短的使用信息:

  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, and 强制模式忽略错误, -f) 以非交互方式执行新创建的脚本文件中包含的子命令行,-s:
    peepdf.py -l -f -s xtract.txt my.pdf
  5. 研究提取的 JavaScript 的内容:
    cat all-javascripts-from-my.pdf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 类似于 iPhone(老虎机)的网络“选择器”选择框? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个类似 iPhone 的 选择器 控件 我可以在网络上使用它 可访问性不是问题 JavaS
  • 如何从模板脚本访问 AngularJS 变量

    我的控制器 scope totals totals 我的模板 按 html 注入的预期工作 totals 但我需要的是访问变量totals在模板的脚本中 如下所示 我试过了 scope totals totals totals 等 均无济于
  • JavaScript 中的“this”如何工作?

    我知道还有其他几篇关于这个主题的帖子 但它们仍然让我感到困惑 我已经包含了 jQuery 和所有内容 我有一个简单的 javascript 类 如下例所示 function CarConstructor this speed 19 in m
  • from __future__ importabsolute_import 实际上做了什么?

    I have answered https stackoverflow com a 22679558 2588818一个关于Python中绝对导入的问题 我认为我通过阅读理解了这个问题Python 2 5 变更日志 https docs p
  • 使用 Python 连接从 FTP 检索文件

    我构建了这个简单的工具来暴力破解并连接到 ftp 服务器 import socket import ftplib from ftplib import FTP port 21 ip 192 168 1 108 file1 passwords
  • 如何使用 Fabric js 以编程方式自由绘制?

    使用 Fabric js 构建多人涂鸦 尝试使用 Fabric js 实现多人涂鸦 想法是当 U1 在画布上绘制时 我们将点推送到 RTDB 并在客户端上获取这些点 并以编程方式在两个客户端中绘制笔画 您可以将画布的数据保存在path cr
  • IIFE 和 call 的区别

    之间有区别吗 function call this and function or var MODULE function this hello world call MODULE and var MODULE function m m h
  • Moment.js 在 Firefox 中返回 NaN,但在 Chrome 中不返回 NaN

    我有以下代码行 moment 11 10 2013 09 03 AM diff moment minutes 在 Chrome 30 0 1599 101 中 以下行返回一个数字 它每分钟都会更改 因此确切的值不相关 在 Firefox 2
  • 转义双引号 JavaScript

    我试图在 iPhone 上查看时运行某种图像格式 在其他情况下运行一些 Flash 视频 var uagent navigator userAgent toLowerCase if uagent search iphone gt 1 doc
  • 保护客户端 API 的安全

    我正在为基于 JavaScript 的游戏构建服务器端 API 和客户端库 其中必须确保两个非常重要的功能的安全 用户每次游玩都必须扣款 我们必须确保提交的分数是玩家实际获得的分数 解决第一个问题看起来很简单 在每次游戏开始时 我们都会调用
  • Javascript:如何简化具有多个 OR 条件的 if 语句?

    很抱歉 如果我在写这篇文章时犯了错误 我是新来的 不知道这是如何工作的 希望我能尽快学会 我也是 JavaScript 新手 所以问题是 我有这个代码 elements js文件 我无法让它工作 放这个有用吗 if codePrompt c
  • 如何使用 JavaScript 或 jQuery 获取 html 元素的比例值?

    我想知道如何获得元素的比例值 我努力了 element css webkit transform 返回matrix scaleX 0 0 scaleY 0 0 有没有办法得到scaleX and scaleY only 找出文档和元素之间的
  • 如何为 HTML 验证提供自定义验证错误消息?

    当我使用默认 HTML 验证时 它会显示默认错误消息 这不是我想向客户显示的 我需要自定义消息并为每个验证提供不同的信息 例如最小 最大 类型和要求 例如 该字段为必填项 值不匹配 参考传统的HTML代码
  • onchange 选择框

    假设我们有 2 个不同的选择框 具有相同数量的选项
  • vue中有自动更新这段代码的东西吗?

    我在导航器中找到了这个按钮 当用户登录时会显示该按钮 而当用户注销时该按钮就会消失 但现在我需要在按钮删除 出现之前刷新页面 这是我的代码 Button div div class div div
  • 什么是 TypeScript?为什么我要用它代替 JavaScript? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 您能描述一下 TypeScript 语言是什么吗 它能做什么 JavaScript 或可用库不能做的事情 这让我有理由考虑它 我最初写
  • 防止IndexedDB请求错误取消事务

    我的意图 循环localStorage并将数据放入IndexedDB 如果发生某些已知错误 例如当键已存在时出现 ConstraintError 我想忽略这些特定错误 以便事务不会中止 当请求触发错误时 中止事务是默认行为 问题 我以为使用
  • 使用node和multer将图像上传到heroku不起作用

    我正在尝试使用 Node 后端将图像文件上传到 Heroku 我可以使其工作 同样的过程在本地主机测试中工作得很好 但是在将我的项目部署到 Heroku 并测试它之后 过程和文件中出现错误不会上传 后端 let storage multer
  • 定位分离的 DOM 树内存泄漏

    我在诊断主要使用 Knockout 构建的非常大的单页 Web 应用程序中的分离 DOM 树内存泄漏时遇到问题 我已经调整了应用程序以附加一个假人FooBar对象特定的 HTML 按钮元素 当用户移动到应用程序的不同 页面 时 该元素应该被
  • ES6 - 有没有一种优雅的方法来导入所有命名导出而不是默认导出?

    我正在寻找一种优雅的方法来导入所有命名导出 而不必导入默认导出 在一个文件中 我导出许多命名常量以及默认值 myModule js const myDefault my default export const named1 named1

随机推荐