Démo mise à jour à venir bientôt !
L'assistant d'ingénierie inverse (ReVA) est un projet visant à créer un assistant d'IA indépendant du désassembleur pour les tâches d'ingénierie inverse. Cela inclut à la fois l'inférence hors ligne et en ligne et une architecture simple.
ReVa est différent des autres efforts visant à créer des assistants d'IA pour les tâches RE car il utilise une approche basée sur les outils . ReVa vise à fournir une variété de petits outils au LLM, tout comme votre environnement RE vous fournit un ensemble de petits outils. ReVa combine cette approche avec des techniques de chaîne de raisonnement pour permettre au LLM d'accomplir des tâches complexes.
Chacun des outils donnés au LLM est construit pour être facile à utiliser pour le LLM, pour tolérer une variété d'entrées et pour réduire les hallucinations du LLM. Nous faisons cela en fournissant au LLM un schéma mais en tolérant d'autres entrées, y compris des descriptions qui guident le LLM, et en redirigeant les erreurs corrigibles vers le LLM, et en incluant des sorties supplémentaires pour guider la prochaine décision du LLM.
Par exemple, lorsque le LLM demandera une décompilation à votre outil RE, nous accepterons une adresse brute en hexadécimal, une adresse brute en base 10, un nom de symbole avec un espace de noms ou un symbole. Si le LLM nous donne une mauvaise entrée, nous le signalons au LLM avec des instructions pour corriger l'entrée (peut-être en l'encourageant à utiliser la liste de fonctions par exemple). Pour encourager l'exploration comme le ferait un humain, nous rapportons un contexte supplémentaire comme l'espace de noms et les références croisées ainsi que la décompilation, c'est un petit coup de pouce pour que le LLM explore le binaire de la même manière qu'un humain le ferait.
Grâce à cette technique, vous pouvez poser des questions générales et obtenir des réponses pertinentes. Le modèle donne la priorité aux informations issues des outils, mais lorsqu'il n'y a pas d'informations, il peut toujours répondre aux questions génériques issues de sa formation.
Vous pouvez poser des questions telles que :
__mod_init
.mmap
?Une partie importante de l’ingénierie inverse est le processus. De nombreux autres outils posent simplement une seule question au LLM, ce qui signifie qu'il est difficile de déterminer pourquoi une chose s'est produite. Dans ReVa, nous décomposons toutes les actions en petites parties et incluons les réflexions du LLM dans le résultat. Cela permet à l'analyste de surveiller les actions et le raisonnement du LLM, en abandonnant et en modifiant l'invite si nécessaire.
RevA est basé sur langchain, qui prend en charge un certain nombre de modèles.
Un support intégré est fourni pour :
Voir Configuration pour plus d'informations sur les paramètres des fournisseurs.
L'ajout de serveurs d'inférence supplémentaires est facile s'il est pris en charge par Langchain.
La configuration de ReVa se trouve dans les options de l'outil CodeBrowser. Ouvrez un programme et accédez à Édition -> Options des outils -> ReVa.
Il existe des options pour :
Il y a des sections pour les fournisseurs.
Par défaut, la clé OpenAI est chargée à partir de la variable d'environnement OPENAI_API_KEY
. Vous pouvez également définir votre clé dans Ghidra. Remettre la clé à la valeur OPENAI_API_KEY
effacera la clé de la configuration de Ghidra et la chargera depuis l'environnement.
Vous pouvez également sélectionner le modèle. Par défaut, gpt-4o
est sélectionné. Ce modèle fonctionne mieux avec les outils et l'invite fournis par ReVa.
gpt-4
fonctionne également bien, mais il est lent et nécessite davantage d'incitations de la part de l'utilisateur pour explorer un binaire.
Ollama est un serveur d'inférence local. Le serveur par défaut est défini sur localhost, avec le port Ollama par défaut. Vous pouvez remplacer cela par un serveur distant si vous souhaitez effectuer une inférence sur une machine distante. Ceci est utile pour les organisations qui s’auto-hébergent.
Vous pouvez également sélectionner un modèle. Le modèle doit déjà être chargé sur le serveur. De bonnes performances ont été observées avec :
mixtral
llama3
phi
RevA a un flux de travail en deux étapes.
ReVa utilise une extension pour votre outil RE pour effectuer une analyse. Voir l'assistance Ghidra ci-dessous.
Pour poser des questions et exécuter l'inférence, un outil de ligne de commande est fourni. Exécutez reva-chat
pour démarrer la session de discussion. Cette commande trouvera votre Ghidra ouverte et s'y connectera. Pour ouvrir une nouvelle discussion, exécutez à nouveau la commande dans un autre terminal.
Si vous avez plusieurs Ghidra ouvertes, vous pouvez sélectionner la bonne avec reva-chat --project ${project-name}
, si elle n'est pas définie, reva-chat
vous demandera à quel projet vous souhaitez vous connecter.
Pour communiquer entre reva-server
et l'extension, gRPC est utilisé. Vous pouvez en savoir plus à ce sujet (ici)[./DEVELOPER.md]. La construction des fichiers sources à partir de ces définitions de protocole est pilotée à partir du Makefile. Pour créer les fichiers de code source du protocole, exécutez cette commande à la racine du projet :
make protocol
Installez d'abord le composant python, j'aime utiliser pipx
. Installez-le avec quelque chose comme :
pip install pipx
Dans le dossier reverse-engineering-assistant
, exécutez :
pipx install .
Après avoir installé le projet python, pipx peut vous avertir que vous devez ajouter un dossier à votre variable d'environnement PATH. Assurez-vous que le dossier (contenant désormais reva-server
et reva-chat
) se trouve dans votre variable PATH. pipx peut le faire pour vous avec cette commande :
pipx ensurepath
L'extension devra démarrer reva-server
et vous devrez exécuter reva-chat
. Si vous ne souhaitez pas les ajouter à votre PATH, consultez la section Configuration pour savoir comment définir le chemin d'accès aux exécutables.
Une fois le reva-server
démarré par l'extension, le chat peut être démarré avec :
reva-chat
Le package Python doit être installé pour que l’extension Ghidra fonctionne !
Suivez les instructions du plugin ghidra-assistant.
Après l'installation, activez l'extension ReVa Plugin
dans l'outil CodeBrowser (Ouvrez un fichier et cliquez sur : Fichier -> Configurer -> Divers).
Si vous souhaitez que ReVa soit activé par défaut, cliquez sur Fichier -> Enregistrer l'outil pour enregistrer la configuration.
Si tout fonctionne correctement, vous verrez un menu ReVa sur votre barre de menu.
Vous pouvez modifier la configuration du plugin dans Edit -> Tool Options -> ReVa
.
Chaque fois que ReVa effectue une action, il crée un point d'annulation pour chaque action. Si ReVa renomme 5 variables, ce sera une annulation.
ReVa ajoute une option au menu Fenêtre de l'outil CodeBrowser. Sélectionnez Fenêtre -> ReVa Action Log pour ouvrir la fenêtre ReVa Action Log.
Cette fenêtre affiche les actions que ReVa a effectuées et souhaite effectuer. Vous pouvez accepter ou refuser une modification en double-cliquant sur l'icône ✅ ou . Vous pouvez également vous rendre à l'endroit où l'action sera effectuée en double-cliquant sur l'adresse.
Si vous rejetez une action, ReVa en sera informée et elle passera à autre chose.
Vous pouvez également activer «Auto-allow» dans les options ReVa. Cela acceptera automatiquement toutes les actions que ReVa souhaite effectuer.
ReVa ajoute également quelques éléments à l'interface utilisateur de Ghidra. Vous pouvez soit demander à ReVa de faire quelque chose dans la fenêtre de discussion, "Examiner en détail l'utilisation des variables dans main
, renommer les variables avec des noms plus descriptifs.", ou utiliser le système de menus.
Par exemple, vous pouvez cliquer avec le bouton droit sur une variable dans la décompilation, sélectionner Reva -> Renommer la variable et ReVa effectuera l'action.
Aimez-vous mon travail? Envie de soutenir ce projet et d'autres ? Intéressé par la façon dont ce projet a été conçu et construit ? Ce projet et bien d'autres sont construits en direct sur mon stream sur https://twitch.tv/cyberkaida !