从恶意 PDF 中提取元数据的代码/工具

从恶意 PDF 中提取元数据的代码/工具

我正在研究恶意 PDF 的特征。我正在使用 pdfinfo 的 Python 包装器来提取一些特征,例如文件大小和代码的页面大小。这是代码的包装部分。

 def pdfinf(infile):
   cmd = '/usr/bin/pdfinfo'
   if not osp.exists(cmd):
       raise RuntimeError('System command not found: %s' % cmd)
   if not osp.exists(infile):
       raise RuntimeError('Provided input file not found: %s' % infile)

   def _extract(row):
       """Extracts the right hand value from a : delimited row"""
       return row.split(':', 1)[1].strip()

   output = {}

   labels = ['Title', 'Author', 'Creator', 'Producer', 'CreationDate',
              'ModDate', 'Tagged', 'Pages', 'Encrypted', 'Page size',
              'File size', 'Optimized', 'PDF version']

   cmd_output = subprocess.check_output([cmd, infile])
   for line in cmd_output.splitlines():
       for label in labels:
           if label in line:
               output[label] = _extract(line)
   return output

la = lb = 0

for files in malware_files:
    path = "/home/hima/Downloads/data/mpdfs/" + files
    output = pdfinf(path)
    value = output['File size']
    value = value[:-6]
    lb += float(value)

但是,我不断收到这样的错误。

Syntax Error: Couldn't find trailer dictionary
Syntax Error (6689): Missing 'endstream' or incorrect stream length
Syntax Error (15795): Missing 'endstream' or incorrect stream length
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't read xref table
Traceback (most recent call last):
  File "code.py", line 67, in <module>
    output = pdfinf(path)
  File "code.py", line 50, in pdfinf
    cmd_output = subprocess.check_output([cmd, infile])
  File "/usr/lib/python2.7/subprocess.py", line 574, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['/usr/bin/pdfinfo', '/home/hima/Downloads/data/mpdfs/c9954f5f3fbfb3b150abe208c763d942043bfc0f.pdf']' returned non-zero exit status 1

如果代码在恶意文件处停止运行,如何提取这些功能?我想分析这些特征,因为我认为如果能够找到关系。我可以使用 shell 或使用 Python 中的包装器来调用 pdfinfo 吗?

答案1

检查损坏的 PDF 文件的最简单方法就是在可以处理大文件的编辑器中打开它们(我使用 emacs)。首先尝试使用良好的 PDF 文件。您将看到 PDF 文件的对象结构,但部分或全部内容流将被压缩。您还可以通过这种方式看到“恶意”PDF 正在做什么来迷惑您的解析器,并且您应该能够相应地更正解析器。 (如果不知道“恶意”PDF 的作用,我们显然无法为您做到这一点)。

您还可以使用mutool clean -d解压缩流,但mutool可能会或可能不会对损坏的 PDF 的作用感到困惑。再次强调,首先在有效的 PDF 上尝试此操作。

相关内容