← retour aux outils back to tools

# 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