pdf-parser

Parseur d'objets PDF signé Didier Stevens : inspecte la structure interne d'un PDF, ses flux et ses filtres pour creuser dans le contenu suspect signalé par les outils de triage. Didier Stevens' PDF object parser — inspects a PDF's internal object structure, streams, and filters to dig into suspicious content flagged by triage tools.

↗ https://blog.didierstevens.com/programs/pdf-tools/

Overview

pdf-parser parses a PDF file’s internal structure — its objects, streams, cross-reference table, and trailer — and lets an analyst inspect any specific object individually, including decoding filtered/compressed streams (FlateDecode, etc.). It’s the natural follow-up to pdfid.py: once a suspicious keyword like /JavaScript or /OpenAction is spotted, pdf-parser pulls up the actual object content behind it.

Common Usage

Dump the full object tree/statistics of a PDF

pdf-parser.py suspicious.pdf

Search for all objects referencing a keyword, e.g. JavaScript

pdf-parser.py -s javascript suspicious.pdf

Dump a specific object by number

pdf-parser.py -o 12 suspicious.pdf

Automatically decode/decompress filtered streams (e.g. FlateDecode)

pdf-parser.py -f -o 12 suspicious.pdf

Show the document trailer (points to root/catalog object)

pdf-parser.py -t suspicious.pdf

Search for objects containing /OpenAction (auto-exec on open)

pdf-parser.py -s openaction suspicious.pdf

Example Workflow

Step 1: Triage with pdfid — flags /JavaScript present

pdfid.py suspicious.pdf

Step 2: Find which object(s) hold JavaScript

pdf-parser.py -s javascript suspicious.pdf

Step 3: Dump and decode that object’s stream content

pdf-parser.py -f -o 15 suspicious.pdf

Step 4: Extract the raw JS for further deobfuscation/analysis

pdf-parser.py -f -o 15 suspicious.pdf > extracted_stream.js

Options

-o OBJ          dump a specific object number
-s STRING        search objects for a given string/keyword
-f               apply filters (decode streams, e.g. FlateDecode)
-t               show the trailer
-c               show content, no separators
-w               dump raw stream content only
-e               dump the object's elements
--stats          show summary statistics only

Tips

  • Combine -s with -f to both locate and immediately decode the relevant object in one pass.
  • Encrypted PDFs need decryption context first — pdf-parser has limited built-in support; consider qpdf --decrypt beforehand if the file is password-protected.
  • Object streams (/ObjStm) compress multiple objects together — pdf-parser handles these transparently with -f, but be aware referenced object numbers may be nested inside.
Help / Man page
Usage: pdf-parser.py [options] pdf-file

pdf-parser, use it to parse a PDF document

Options:
  -h, --help        show this help message and exit
  -o OBJECT         id of the object to select (version independent)
  -r REFERENCE       id of object for which you want to search references to
  -e ELEMENTS        type of elements to select (comma separated: dgxjms...)
  -s SEARCH           string to search for (case insensitive)
  -f, --filter        pass stream through filters
  -w, --raw            dump the raw content of the stream
  -c, --content        display report, do not show the content
  -t, --trailer        display trailer
  --stats              display statistics
  -v, --verbose        display malformed PDF elements
  --nocanonicalizedoutput  do not canonicalize the output

Vue d’ensemble

pdf-parser parse la structure interne d’un fichier PDF (ses objets, ses flux, sa table de références croisées et son trailer) et permet à un analyste d’inspecter individuellement n’importe quel objet spécifique, y compris en décodant les flux filtrés/compressés (FlateDecode, etc.). C’est le complément naturel de pdfid.py : une fois qu’un mot-clé suspect comme /JavaScript ou /OpenAction est repéré, pdf-parser permet de récupérer le contenu réel de l’objet correspondant.

Utilisation courante

# Extraire l'arborescence complète des objets / les statistiques d'un PDF
pdf-parser.py suspicious.pdf

# Rechercher tous les objets référençant un mot-clé, par ex. JavaScript
pdf-parser.py -s javascript suspicious.pdf

# Extraire un objet spécifique par son numéro
pdf-parser.py -o 12 suspicious.pdf

# Décoder/décompresser automatiquement les flux filtrés (ex : FlateDecode)
pdf-parser.py -f -o 12 suspicious.pdf

# Afficher le trailer du document (pointe vers l'objet racine/catalogue)
pdf-parser.py -t suspicious.pdf

# Rechercher les objets contenant /OpenAction (auto-exécution à l'ouverture)
pdf-parser.py -s openaction suspicious.pdf

Exemple de workflow

# Étape 1 : trier avec pdfid, qui signale la présence de /JavaScript
pdfid.py suspicious.pdf

# Étape 2 : trouver quel(s) objet(s) contiennent le JavaScript
pdf-parser.py -s javascript suspicious.pdf

# Étape 3 : extraire et décoder le contenu du flux de cet objet
pdf-parser.py -f -o 15 suspicious.pdf

# Étape 4 : extraire le JS brut pour une désobfuscation/analyse plus poussée
pdf-parser.py -f -o 15 suspicious.pdf > extracted_stream.js

Options

-o OBJ          dump a specific object number
-s STRING        search objects for a given string/keyword
-f               apply filters (decode streams, e.g. FlateDecode)
-t               show the trailer
-c               show content, no separators
-w               dump raw stream content only
-e               dump the object's elements
--stats          show summary statistics only

Conseils

  • Combiner -s avec -f pour à la fois localiser et immédiatement décoder l’objet pertinent en une seule passe.
  • Les PDF chiffrés nécessitent d’abord un contexte de déchiffrement, pdf-parser a un support intégré limité pour cela ; envisager qpdf --decrypt au préalable si le fichier est protégé par mot de passe.
  • Les flux d’objets (/ObjStm) compressent plusieurs objets ensemble, pdf-parser les gère de manière transparente avec -f, mais attention, les numéros d’objets référencés peuvent être imbriqués.
Aide / Page de manuel
Usage: pdf-parser.py [options] pdf-file

pdf-parser, use it to parse a PDF document

Options:
  -h, --help        show this help message and exit
  -o OBJECT         id of the object to select (version independent)
  -r REFERENCE       id of object for which you want to search references to
  -e ELEMENTS        type of elements to select (comma separated: dgxjms...)
  -s SEARCH           string to search for (case insensitive)
  -f, --filter        pass stream through filters
  -w, --raw            dump the raw content of the stream
  -c, --content        display report, do not show the content
  -t, --trailer        display trailer
  --stats              display statistics
  -v, --verbose        display malformed PDF elements
  --nocanonicalizedoutput  do not canonicalize the output