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
-swith-fto 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 --decryptbeforehand 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
-savec-fpour à 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 --decryptau 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