悪意のある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

悪意のあるファイルでコードの実行が停止した場合、これらの機能をどのように抽出しますか?これらの特性を分析したいのは、関連性を見つけることができないかと思うからです。シェルを使用するか、Pythonでラッパーを使用してpdfinfoを呼び出すことはできますか?

答え1

破損したPDFファイルを確認する最も簡単な方法は、大容量ファイルを処理できるエディタでそのファイルを開くことです(私はemacsを使用しています)。まず、良いPDFファイルをお試しください。 PDFファイルのオブジェクト構造が表示されますが、コンテンツストリームの一部または全部が圧縮されます。これにより、「悪意のある」PDFがパーサーを混乱させるために何をしているかを確認し、それに応じてパーサーを修正することができます。 (「悪意のある」PDFが何をしているのかわからない場合、私たちは明らかにこれを行うことはできません。)

mutool clean -d解凍されたストリームを使用することもできますが、mutool破損したPDFの機能により混乱する可能性があります。もう一度有効なPDFで最初に試してみてください。

関連情報