
Définir et faire correspondre des motifs de graphes définis par l'utilisateur avec des graphes de flux de contrôle binaires en utilisant un désassembleur basé sur Capstone, avec prise en charge de CLI, Python bindings et plugin IDA.
grap prend des motifs et des fichiers binaires, utilise un désassembleur basé sur Capstone pour obtenir les graphes de flot de contrôle des binaires, puis fait correspondre les motifs avec ceux-ci.
Les motifs sont des graphes définis par l'utilisateur avec des conditions d'instruction ("l'opcode est xor et arg1 est eax") et des conditions de répétition (3 instructions identiques, blocs de base...).
grap est disponible en tant qu'outil autonome avec un désassembleur et des liaisons Python, et en tant que plugin IDA qui tire parti du désassemblage effectué par IDA et de l'analyste.
Prise en charge :




Ce document décrit comment construire et installer grap sur une distribution Linux.
Vous pouvez également consulter :
Outre les compilateurs (build-essential), les dépendances suivantes doivent être installées :
Ainsi sur Ubuntu/Debian, cela devrait fonctionner :
sudo apt-get install build-essential cmake bison flex libboost-regex-dev libboost-system-dev libboost-filesystem-dev libseccomp-dev python3-dev python3-pefile python3-pyelftools python3-capstone swig
Veuillez noter que ceux-ci ont été testés pour la dernière Ubuntu LTS (18.04.3). Les paquets peuvent différer selon votre distribution.
Les commandes suivantes construiront et installeront le projet :
mkdir build; cd build/ comme nous vous conseillons de construire le projet dans un répertoire dédiécmake ../src/; make construira avec cmake et makesudo make install installera grap dans /usr/local/bin/SWIG peut échouer à trouver python3 si votre version par défaut est python2, cela peut être résolu en basculant vers python3 par défaut. Par exemple sur Ubuntu :
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
L'outil peut être lancé en utilisant la commande suivante :
$ grap [options] pattern test_paths
Voici quelques exemples d'options supportées :
grap -h: décrit les options supportéesOn peut laisser grap inférer un motif à partir d'une chaîne. Seules quelques options sont supportées mais cela est utile pour le prototypage :
grap "opcode is xor and arg1 contains '['" (test.exe): recherche un xor avec une écriture mémoiregrap -v "sub->xor->sub" (test.exe): -v affichera le chemin du motif inféréChoisissez comment les binaires sont désassemblés :
grap -od (pattern.grapp) samples/*: désassemble les fichiers du dossier samples/ sans tentative de correspondancegrap -f (pattern.grapp) (test.exe): force le re-désassemblage du binaire, puis le fait correspondre avec pattern.grappgrap --raw (pattern.grapp) (test.bin): désassemblage de fichier brut (utilisez --raw-64 pour les binaires 64 bits)Contrôler la verbosité de la sortie :
grap -q -sa (pattern.grapp) (samples/*.grapcfg): fait correspondre les fichiers désassemblés, affiche les fichiers correspondants et non correspondants, un par lignegrap -m (pattern.grapp) (test.grapcfg): affiche tous les nœuds correspondantsChoisissez où les fichier(s) désassemblé(s) (.grapcfg) sont écrits ; faites correspondre plusieurs fichiers avec plusieurs motifs :
grap patterns/basic_block_loop.grapp -o ls.grapcfg /bin/ls: désassemble ls dans ls.grapp et recherche les boucles de blocs de basegrap (pattern1.grapp) -p (pattern2.grapp) (test.exe): fait correspondre à plusieurs fichiers de motifgrap -r -q patterns/ /bin/ -o /tmp/ : désassemble tous les fichiers de /bin/ dans /tmp/ et les fait correspondre avec tous les motifs .grapp de patterns/ (l'option récursive -r s'applique à /bin/, pas à patterns/)Le motif suivant détecte une boucle de déchiffrement consistant en un xor suivi d'un sub trouvé dans un échantillon de Backspace :
digraph decryption_md5_4ee00c46da143ba70f7e6270960823be {
A [cond=true, repeat=3]
B [cond="opcode is xor and arg2 is 0x11"]
C [cond="opcode is sub and arg2 is 0x25"]
D [cond=true, repeat=3]
E [cond="opcode beginswith j and nchildren == 2"]
A -> B
B -> C
C -> D
D -> E
E -> A [childnumber=2]
}
Notez que les fichiers de motif peuvent contenir plusieurs graphes de motif.
Vous pouvez trouver des exemples de motifs supplémentaires dans deux répertoires :
Sur des échantillons de malwares :
Utilisation des liaisons Python :
Vous trouverez plus de documentation dans le dossier doc/ :
La syntaxe des graphes de motif et de test est détaillée dans le fichier grap_graphs.pdf dans la section des versions.
grap est sous licence MIT. Le texte complet de la licence se trouve dans LICENSE.