Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
pbtk — Un ensemble d'outils pour la rétro-ingénierie et le fuzzing d'applications basées sur Protobuf | Kitploit
Outils/GitHubGitHub/marin-m/pbtk
Sécurité AndroidAnalyse Dynamique (Sandboxing)Génération de PayloadsRétro-ingénierieSécurité WebFuzzingSécurité MobileAnalyse de Binaires
GitHubmarin-m/pbtk

pbtk

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

Voir le dépôt
1.7k200il y a 9h 2mVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Site web

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 :

root@kitploit:~
$ sudo snap install pbtk
$ pbtk

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

root@kitploit:~
$ yay -S pbtk-git
$ pbtk

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

root@kitploit:~
# 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 :

root@kitploit:~
pbtk

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

root@kitploit:~
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 :

root@kitploit:~
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 :

root@kitploit:~
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 :

root@kitploit:~
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 :

root@kitploit:~
[{
    "request": {
        "transport": "pburl",
        "proto": "www.google.com/VectorTown.proto",
        "url": "https://www.google.com/VectorTown",
        "pb_param": "pb",
        "samples": [{
            "pb": "!....",
            "hl": "fr"
        }]
    },
    "response": {
        "format": "other"
    }
}]

Structure du code source

PBTK utilise en interne deux types de modules enfichables : les extracteurs et les transports.

  • Un extracteur permet d'extraire des structures .proto d'une implémentation ou plateforme Protobuf cible.

Les extracteurs sont définis dans src/pbtk/extractors/*.py. Ils sont définis comme une méthode précédée d'un décorateur, comme ceci :

root@kitploit:~
@register_extractor(name = 'my_extractor',
                    desc = 'Extract Protobuf structures from Foobar code (*.foo, *.bar)',
                    depends={'binaries': ['foobar-decompiler']})
def my_extractor(path):
    # Load contents of the `path` input file and do your stuff...
    
    # Then, yield extracted .protos using a generator:
    for i in do_your_extraction_work():
        yield proto_name + '.proto', proto_contents
    
    # Other kinds of information can be yield, such as endpoint information or progress to display.
  • Un transport prend en charge une façon de désérialiser, resérialiser et envoyer des données Protobuf sur le réseau. Par exemple, le transport le plus couramment utilisé est les données POST brutes sur HTTP.

Les transports sont définis dans src/pbtk/utils/transports.py. Ils sont définis comme une classe précédée d'un décorateur, comme ceci :

root@kitploit:~
@register_transport(
    name = 'my_transport',
    desc = 'Protobuf as raw POST data',
    ui_data_form = 'hex strings'
)
class MyTransport():
    def __init__(self, pb_param, url):
        self.url = url
    
    def serialize_sample(self, sample):
        # We got a sample of input data from the user.
        # Verify that it is valid in the form described through "ui_data_form" parameter, fail with an exception or return False otherwise.
        # Optionally modify this data prior to returning it.
        bytes.fromhex(sample)
        return sample
    
    def load_sample(self, sample, pb_msg):
        # Parse input data into the provided Protobuf object.
        pb_msg.ParseFromString(bytes.fromhex(sample))
    
    def perform_request(self, pb_data, tab_data):
        # Perform a request using the provided URL and Protobuf object, and optionally other transport-specific side data.
        return post(url, pb_data.SerializeToString(), headers=USER_AGENT)

Améliorations à venir

Les éléments suivants pourraient arriver dans les prochaines versions :

  • Terminer la partie de fuzzing automatique.
  • Support pour l'extraction d'extensions à partir de code Java.
  • Support du runtime JSPB (JavaScript principal).
  • S'il y a une autre plateforme que vous souhaitez voir supportée, déposez simplement un ticket et je regarderai.

J'ai essayé de faire de mon mieux pour produire un code parfaitement lisible et commenté (sauf pour les parties qui sont essentiellement auto-descriptives, comme la connexion des signaux de l'interface graphique) pour la plupart des modules, afin que vous puissiez contribuer.

Licence

pbtk est publié sous la licence GNU GPL (je, par la présente, etc.).

Il n'y a pas de règle formalisée pour la casse du nom du projet, la règle est simplement de suivre votre cœur ❤

Télécharger l’outil