Código / Ferramenta para extrair metadados de PDFs mal-intencionados

0

Estou estudando recursos de PDFs mal-intencionados. Eu estou usando um wrapper Python do pdfinfo para extrair alguns recursos como tamanho do arquivo e tamanho da página do código. Esta é a parte do wrapper do código.

 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)

No entanto, continuo recebendo erros como esses.

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

Como posso extrair esses recursos se o código parar de ser executado em um arquivo mal-intencionado? Eu quero analisar esses recursos como eu acho que se conseguirá encontrar uma relação. Existe uma alternativa ao pdfinfo que eu possa chamar usando shell ou usando um wrapper em Python?

    
por BlackSwan 02.03.2018 / 10:20

1 resposta

0

A maneira mais simples de inspecionar arquivos PDF quebrados é apenas abri-los em um editor que possa lidar com arquivos grandes (eu uso o emacs). Primeiro tente isso com bons arquivos PDF. Você verá a estrutura do objeto do arquivo PDF, mas alguns ou todos os fluxos de conteúdo serão compactados. Você também poderá ver o que o PDF "malicioso" está fazendo para confundir seu analisador e poderá corrigir o analisador de acordo. (Sem saber o que o PDF "malicioso" faz, não podemos fazer isso por você, obviamente).

Você também pode usar mutool clean -d para descompactar os fluxos, mas mutool pode ou não ser confundido com o que seu PDF quebrado faz. Novamente, tente isso primeiro em um PDF válido.

    
por 02.03.2018 / 17:23