Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
qsynthesis — Synthétiseur Greybox conçu pour la désobfuscation des instructions d'assembleur. | Kitploit
Outils/GitHubGitHub/quarkslab/qsynthesis
Analyse StatiqueAnalyse Dynamique (Sandboxing)Analyse des VulnérabilitésAnalyse de CodeRétro-ingénierieUtilitaires et FrameworksAnalyse de BinairesArticles et Recherche
GitHubquarkslab/qsynthesis

qsynthesis

Synthétiseur Greybox conçu pour la désobfuscation des instructions d'assembleur.

Voir le dépôt
178171il y a 1 anVérifié par Kitploit
Site web

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

Qsynthesis

QSynthesis est une API Python3 permettant d'effectuer une synthèse de programme basée sur les entrées/sorties d'expressions de vecteurs de bits. Elle vise à faciliter la désobfuscation de code. L'algorithme est une approche greybox combinant à la fois une synthèse boîte noire basée sur les entrées/sorties et une recherche AST boîte blanche pour synthétiser des sous-expressions (si le nœud racine ne peut pas être synthétisé).

Cet algorithme a été décrit à l'origine lors de l'atelier académique BAR :

  • QSynth: A Program Synthesis based Approach for Binary Code Deobfuscation (les benchmarks utilisés sont disponibles : ici)

Le code a été publié dans le cadre de la conférence Black Hat suivante :

  • Greybox Program Synthesis: A New Approach to Attack Dataflow Obfuscation

Avertissement : Ce framework est expérimental et ne doit être utilisé qu'à des fins d'expérimentation. Il vise principalement à stimuler la recherche dans ce domaine.

Documentation

L'installation, les exemples et la documentation de l'API sont disponibles sur la documentation dédiée : Documentation

Fonctionnalités

Le cœur de la synthèse est basé sur le moteur symbolique Triton sur lequel est construit l'ensemble du framework. Il fournit les fonctionnalités suivantes :

  • synthèse d'expressions de vecteurs de bits
  • capacité à vérifier via SMT l'équivalence sémantique des expressions synthétisées
  • capacité à synthétiser des constantes (si l'expression encode une constante)
  • capacité à améliorer les oracles (tables pré-calculées) au fil du temps grâce à un mécanisme d'apprentissage
  • capacité à réassembler une expression synthétisée en assembly
  • capacité à servir les oracles via une API REST pour faciliter l'utilisation de la synthèse
  • un plugin IDA fournissant une intégration de la synthèse

Démarrage rapide

Installation

Pour fonctionner, Triton doit d'abord être installé : documentation d'installation. Triton ne s'installe pas automatiquement dans un virtualenv, copiez-le dans votre venv ou utilisez --system-site-packages lors de la configuration de votre venv.

Ensuite :

$ git clone https://github.com/quarkslab/qsynthesis.git
$ cd qsynthesis
$ pip3 install '.[all]'

Le [all] installera toutes les dépendances (voir la documentation pour une installation légère).

Génération de table

L'algorithme de synthèse nécessite de générer des tables d'oracles dérivées d'une grammaire (un ensemble de variables et d'opérateurs). L'installation de Qsynthesis fournit l'utilitaire qsynthesis-table-manager permettant de manipuler les tables. La commande suivante génère une table avec 3 variables de 64 bits, 5 opérateurs utilisant un vecteur de 16 entrées. Nous limitons la génération à 5 millions d'entrées.

$ qsynthesis-table-manager generate -bs 64 --var-num 3 --input-num 16 --random-level 5 --ops AND,NEG,MUL,XOR,NOT --watchdog 80 --limit 5000000 my_oracle_table
Generate Table
Watchdog value: 80.0
Depth 2 (size:3) (Time:0m0.23120s)
Depth 3 (size:21) (Time:0m0.23198s)
Depth 4 (size:574) (Time:0m0.26068s)
Depth 5 (size:400858) (Time:0m21.23231s)
Threshold reached, generation interrupted
Stop required
Depth 5 (size:5000002) (Time:4m52.56009s) [RAM:9.52Gb]

Note : Le processus de génération consomme de la RAM, le --watchdog permet de définir un pourcentage de la RAM au-delà duquel la génération est interrompue.

Synthétiser une expression de vecteur de bits

Nous pouvons ensuite essayer de simplifier une expression apparemment obfusquée avec :

from qsynthesis import SimpleSymExec, TopDownSynthesizer, InputOutputOracleLevelDB

blob = b'UH\x89\xe5H\x89}\xf8H\x89u\xf0H\x89U\xe8H\x89M\xe0L\x89E\xd8H\x8bE' \
       b'\xe0H\xf7\xd0H\x0bE\xf8H\x89\xc2H\x8bE\xe0H\x01\xd0H\x8dH\x01H\x8b' \
       b'E\xf8H+E\xe8H\x8bU\xe8H\xf7\xd2H\x0bU\xf8H\x01\xd2H)\xd0H\x83\xe8' \
       b'\x02H!\xc1H\x8bE\xe0H\xf7\xd0H\x0bE\xf8H\x89\xc2H\x8bE\xe0H\x01\xd0' \
       b'H\x8dp\x01H\x8bE\xf8H+E\xe8H\x8bU\xe8H\xf7\xd2H\x0bU\xf8H\x01\xd2' \
       b'H)\xd0H\x83\xe8\x02H\t\xf0H)\xc1H\x89\xc8H\x83\xe8\x01]\xc3'

# Perform symbolic execution of the instructions
symexec = SimpleSymExec("x86_64")
symexec.initialize_register('rip', 0x40B160)  # arbitrary address
symexec.initialize_register('rsp', 0x800000)  # arbitrary stack
symexec.execute_blob(blob, 0x40B160)
rax = symexec.get_register_ast("rax")  # retrieve rax register expressions

# Load lookup tables
ltm = InputOutputOracleLevelDB.load("my_oracle_table")

# Perform Synthesis of the expression
synthesizer = TopDownSynthesizer(ltm)
synt_rax, simp = synthesizer.synthesize(rax)

print(f"expression: {rax.pp_str}")
print(f"synthesized expression: {synt_rax.pp_str} [{simp}]")

Limitations

  • précision de la synthèse limitée par l'exhaustivité des tables pré-calculées
  • génération de table limitée par la consommation de RAM
  • le réassemblage ne peut pas impliquer de variable mémoire, la destination est nécessairement un registre et l'architecture dépend de llvmlite (donc principalement x86_64)
  • le code fait référence à une synthèse basée sur les traces qui est désactivée (le framework sous-jacent n'étant pas encore open-source)

Auteurs

  • Robin David (@RobinDavid), Quarkslab

Contributeurs

Un grand merci aux contributeurs de cette recherche :

  • Luigi Coniglio
  • Jonathan Salwan
Télécharger l’outil