Retour aux mises à jour
New releaseAug 21, 2026

pbtk v1.1.3

Un ensemble d'outils pour la rétro-ingénierie et le fuzzing d'applications basées sur Protobuf

Partager

pbtk - Ingénierie inverse d'applications Protobuf

Protobuf est un format de sérialisation développé par Google et utilisé dans un nombre croissant d'applications Android, web, de bureau et autres. Il consiste en un langage pour déclarer des structures de données, qui est ensuite compilé en code ou en un autre type de structure selon l'implémentation cible.

pbtk (Protobuf toolkit) est un ensemble complet de scripts, accessible via une interface graphique unifiée, qui offre deux fonctionnalités principales :

  • Extraire des structures Protobuf de programmes, les reconvertir en fichiers .proto lisibles, prenant en charge diverses implémentations :

    • Tous les principaux runtimes Java (base, Lite, Nano, Micro, J2ME), avec support complet de Proguard, (2026 : cela fonctionne toujours bien mais surtout avec les anciens APK)
    • Binaires contenant des métadonnées de réflexion embarquées (généralement C++, parfois Java et la plupart des autres bindings), (2026 : cela fonctionne toujours bien)
    • Applications web utilisant le runtime JsProtoUrl. (2026 : cela nécessite une mise à jour)
  • Éditer, rejouer et fuzzer les données envoyées aux endpoints réseau Protobuf, grâce à une interface graphique pratique qui vous permet d'éditer en direct les champs d'un message Protobuf et d'en voir le résultat.

L'interface graphique de l'éditeur pbtk

Installation

PBTK nécessite Python ≥ 3.5, PySide 6, Python-Protobuf 3, et quelques programmes exécutables (chromium, jad, dex2jar…) pour exécuter les scripts d'extraction.

Les utilisateurs Ubuntu peuvent l'installer avec snap :

$ sudo snap install pbtk
$ pbtk

Les utilisateurs Archlinux peuvent l'installer directement via le paquet :

$ yay -S pbtk-git
$ pbtk

Sur la plupart des autres distributions, vous voudrez l'exécuter directement :

# Pour les dérivés de test Ubuntu/Debian :
$ sudo apt install python3-pip git openjdk-8-jre python3-qtpy-pyside6

# Ensuite, en utilisant UV :
$ sudo snap install --classic astral-uv
$ uv tool install pbtk
$ pbtk

# Ou avec pipx :
$ sudo apt install pipx
$ pipx install pbtk
$ pbtk

Windows est également supporté (avec les mêmes modules requis). Une fois que vous lancez l'interface graphique, elle devrait vous avertir de ce qui vous manque selon ce que vous essayez de faire.

Utilisation en ligne de commande (installation via le gestionnaire de paquets)

L'interface graphique peut être lancée via le script principal :

pbtk

Les scripts suivants peuvent également être utilisés seuls, sans interface graphique :

pbtk-jar-extract [-h] input_file [output_dir]
pbtk-from-binary [-h] input_file [output_dir]
pbtk-web-extract [-h] input_url [output_dir] # Nécessite une mise à jour pour fonctionner en 2026

Lors de l'installation depuis snap, les commandes exactes diffèrent :

pbtk.jar-extract [-h] input_file [output_dir]
pbtk.from-binary [-h] input_file [output_dir]
pbtk.web-extract [-h] input_url [output_dir]

Utilisation en ligne de commande (locale)

L'interface graphique peut être lancée via le script principal :

uv sync # Télécharge les dépendances dans le dossier .venv
source .venv/bin/activate # Place les scripts locaux dans $PATH pour la session shell actuelle
uv tool install -e . # Place les scripts locaux dans $PATH en permanence
pbtk

Les scripts suivants peuvent également être utilisés seuls, sans interface graphique :

pbtk-jar-extract [-h] input_file [output_dir]
pbtk-from-binary [-h] input_file [output_dir]
pbtk-web-extract [-h] input_url [output_dir] # Nécessite une mise à jour pour fonctionner en 2026

Flux de travail typique

Disons que vous faites de l'ingénierie inverse d'une application Android. Vous avez exploré un peu l'application avec votre décompilateur préféré, et avez découvert qu'elle transporte du Protobuf en tant que données POST sur HTTPS de manière typique.

Vous ouvrez PBTK et êtes accueilli de manière significative :

L'écran d'accueil

La première étape consiste à obtenir vos .protos au format texte. Si vous ciblez une application Android, déposer un APK et attendre devrait faire l'affaire ! (sauf s'il s'agit d'une implémentation vraiment exotique)

Écran terminé

Une fois cela fait, vous allez dans ~/.pbtk/protos/<nom de votre APK> (soit via la ligne de commande, soit via le bouton en bas de l'écran d'accueil pour ouvrir votre explorateur de fichiers, comme vous préférez). Tous les .protos de l'application sont bien là.

De retour dans votre décompilateur, vous êtes tombé sur la classe qui construit les données envoyées au point de terminaison HTTPS qui vous intéresse. Elle sérialise le message Protobuf en appelant une classe composée de code généré.

Votre décompilateur

Cette dernière classe devrait correspondre parfaitement à l'intérieur de votre répertoire .protos (par exemple com.foo.bar.a.b correspondra à com/foo/bar/a/b.proto). Quoi qu'il en soit, faire un grep sur son nom devrait vous permettre de la référencer.

C'est super : l'étape suivante consiste à aller à l'étape 2, sélectionner votre .proto d'entrée souhaité, et remplir quelques informations sur votre point de terminaison.

Formulaire de création de point de terminaison

Vous pouvez également fournir un échantillon de données brutes Protobuf, qui ont été envoyées à ce point de terminaison, capturées via mitmproxy ou Wireshark, et que vous collerez sous forme hexadécimale.

L'étape 3 est la partie amusante où l'on clique sur les boutons et voit ce qui se passe ! Vous avez une vue arborescente représentant chaque champ de la structure Protobuf (les champs répétés sont suffixés par "+", les champs obligatoires n'ont pas de cases à cocher).

Formulaire de création de point de terminaison

Survolez simplement un champ pour le mettre au point. Si le champ est de type entier, utilisez la molette de la souris pour incrémenter/décrémenter. Les informations d'énumération apparaissent également au survol.

Voilà ! Vous pouvez déterminer la signification de chaque champ avec cela. Si vous avez extrait des .protos de code minifié, vous pouvez renommer les champs en fonction de ce que vous remarquez qu'ils signifient, en cliquant sur leurs noms.

Bon reverse ! 👌 🎉

Stockage local des données

PBTK stocke les informations .proto extraites dans ~/.pbtk/protos/ (ou %APPDATA%\pbtk\protos sous Windows).

Vous pouvez déplacer, renommer, éditer ou effacer les données de ce répertoire directement via votre explorateur de fichiers et votre éditeur de texte habituels, c'est la façon attendue de le faire et cela n'interférera pas avec PBTK.

Les points de terminaison basés sur HTTP sont stockés dans ~/.pbtk/endpoints/ sous forme d'objets JSON. Ces objets sont des tableaux de paires d'informations requête/réponse, qui ressemblent à ceci :

Catégories