2 points par GN⁺ 2024-03-18 | 1 commentaires | Partager sur WhatsApp
  • Reverse engineering à l’aide de grands modèles de langage

1. Présentation de LLM4Decompile et de Decompile-Eval

  • Notre objectif est de créer et publier le premier LLM open source dédié à la décompilation, et de construire le premier benchmark de décompilation axé sur la recompilabilité et la réexécutabilité afin d’en évaluer les capacités.
  • Un million d’échantillons de code C collectés à partir d’AnghaBench ont été compilés en code assembleur à l’aide de GCC, ce qui a permis de constituer un jeu de données de 4 milliards de tokens composé de paires assembleur-source.
  • À partir de ce jeu de données, le modèle de code LLM de référence DeepSeek-Coder a été affiné, et Decompile-Eval, un benchmark d’évaluation fondé sur des questions HumanEval et des échantillons de test, a été construit.
  • L’évaluation se fait selon deux perspectives : la capacité du code décompilé à être recompilé avec succès, et sa capacité à faire passer toutes les assertions des cas de test.

2. Résultats de l’évaluation

Métriques

  • La recompilabilité et la réexécutabilité sont des indicateurs clés pour vérifier l’efficacité du processus de décompilation.
  • Si le code décompilé peut être recompilé, cela constitue une preuve solide de son intégrité syntaxique.
  • Comme la seule syntaxe ne garantit pas une équivalence sémantique avec le programme d’origine, la réexécutabilité est un critère important pour évaluer la précision sémantique.
  • La recompilabilité et la réexécutabilité reflètent la récupération de la syntaxe et la préservation de la sémantique, deux éléments essentiels pour une décompilation utilisable et robuste.

3. Comment utiliser le modèle

  • LLM4Decompile comprend des modèles allant de 1,3 à 33 milliards de paramètres, disponibles sur Hugging Face.
  • Exemples de modèles : llm4decompile-1.3b, llm4decompile-6.7b, llm4decompile-33b, llm4decompile-6.7b-nsp, llm4decompile-6.7b-uo
  • Le modèle NSP a été entraîné sur du code assembleur, avec une réexécutabilité moyenne d’environ 0,17.
  • Le modèle UO a été entraîné sans connaissance préalable du niveau d’optimisation (O0~O3), avec une réexécutabilité moyenne d’environ 0,21.
  • Exemple d’utilisation : compiler du code C en binaire, désassembler le binaire en instructions assembleur, puis utiliser LLM4Decompile pour traduire ces instructions assembleur en C.

4. Comment utiliser Decompile-Eval

  • Les données sont stockées au format liste JSON dans llm4decompile/decompile-eval/decompile-eval.json.
  • Des méthodes sont fournies pour exécuter l’évaluation sur un seul GPU et un seul processus, ainsi qu’avec TGI (vitesse 10x plus rapide, prise en charge multi-GPU et multiprocessus).

5. En cours

  • LLM4Binary : il est prévu d’inclure un jeu de données plus vaste pour le pré-entraînement du modèle sur du code assembleur et du code C.
  • Decompiler-ALL : projet d’extension pour prendre en charge davantage de langages, de plateformes et de configurations (par ex. décompilation de plusieurs fonctions).

6. Licence

  • Licence MIT

Avis de GN⁺

  • LLM4Decompile propose une approche innovante par rapport aux méthodes traditionnelles de décompilation binaire, en permettant une décompilation plus précise et plus efficace grâce à l’utilisation de grands modèles de langage.
  • Cette technologie peut être très utile dans le domaine de la sécurité logicielle, notamment pour l’analyse de malwares ou la maintenance de systèmes legacy.
  • Le fait que la réexécutabilité du code décompilé ne soit pas parfaite suggère que cette technologie peut encore être améliorée. Des recherches supplémentaires sont nécessaires pour accroître sa précision et son efficacité en conditions réelles.
  • Parmi les outils existants offrant des fonctions similaires, on trouve des décompilateurs commerciaux et open source comme Ghidra ou IDA Pro, mais LLM4Decompile apporte une nouvelle approche fondée sur le machine learning.
  • Lors de l’adoption de cette technologie, il faut prendre en compte la qualité et l’étendue des données d’entraînement, la précision du modèle, la vitesse d’exécution, etc. Ses avantages sont une précision élevée et une grande flexibilité, tandis que la complexité des grands modèles et leurs besoins en ressources de calcul peuvent constituer des inconvénients.

1 commentaires

 
GN⁺ 2024-03-18
Commentaires sur Hacker News
  • Avis sur les résultats de la « réexécutabilité » :

    • La réexécutabilité est une méthode importante pour mesurer la justesse sémantique. Elle consiste à recompiler le résultat décompilé puis à exécuter des cas de test afin d’évaluer si la logique et le comportement du programme ont été préservés. La recompilabilité et la réexécutabilité reflètent la récupération syntaxique et la préservation sémantique, ce qui est essentiel pour une décompilation exploitable et robuste.
  • Question sur la fiabilité du résultat décompilé :

    • C’est une vraie question de savoir si le résultat décompilé est fiable. La recompilation peut produire un code machine différent, et il peut être difficile d’identifier de nouvelles structures, en particulier si elles concernent des parties clés du code. On se demande s’il existe un moyen pour le LLM de signaler son niveau de confiance sur certaines sections lors de l’exécution générative. Une vérification humaine semble nécessaire.
  • Excellent cas d’usage pour le fine-tuning de LLM :

    • C’est un excellent cas d’usage pour le fine-tuning de LLM, car on peut facilement générer un vaste jeu de données de paires entrée/sortie à partir de code C publié.
  • Intérêt pour l’entraînement de modules de décompilation à partir de la production d’un développeur :

    • Il serait intéressant de savoir s’il est possible d’entraîner un module de décompilation à partir d’applications réalisées par un développeur précis. Par exemple, Super Mario 64 et Zelda 64 ont été entièrement décompilés, et d’autres jeux N64 sont en cours. On se demande si cela permettrait de décompiler plus facilement d’autres jeux sur lesquels ces développeurs ont travaillé.
  • Intérêt pour le cas d’usage idéal d’un décompilateur et pour la création de jeux de données :

    • Le décompilateur idéal supprimerait le besoin de code source propriétaire. Étant donné l’abondance de code C publiquement disponible, il est facile de constituer un jeu de données composé de paires ASM/code source.
  • Présentation d’un projet personnel de décompilateur basé sur un LLM :

    • Je développe un décompilateur basé sur un LLM pour le bytecode Python. Peu de gens semblent travailler dans cette direction de recherche, mais cela pourrait devenir intéressant avec l’arrivée de contextes d’attention plus longs. Si vous connaissez une équipe avec qui collaborer, cela m’intéresse.
  • Inquiétude concernant un benchmark sans comparaison avec des approches basées hors IA :

    • Il est intéressant de voir différentes approches, mais sans comparaison avec des approches non fondées sur l’IA comme IDA Pro, le benchmark pourrait ne pas avoir beaucoup de sens. Il serait intéressant de voir comment ce modèle se comporte selon les métriques utilisées dans les articles de sécurité.
  • Intérêt pour le grand écart entre les scores de recompilabilité et de réexécutabilité :

    • GPT4 a atteint 8x % en recompilabilité (syntactiquement correct), mais seulement un misérable 1x % en réexécutabilité (conceptuellement correct), ce qui montre une fois de plus sa capacité excessive à imiter.
  • Curiosité concernant la comparaison avec des décompilateurs non LLM :

    • On se demande comment cela se compare à des décompilateurs non LLM comme IDA, Binja, etc. On ne voit qu’une comparaison avec d’autres LLM.
  • Curiosité sur le fait que le modèle 6b surpasse le modèle 33b :

    • Il est intéressant de voir que le modèle 6b obtient de meilleures performances que le modèle 33b. On se demande si le modèle 33b a simplement besoin de davantage de données d’entraînement. Le modèle 33b a été préentraîné sur environ 1 million de programmes C, tandis que DeepSeek-Coder a été entraîné sur 2 billions de tokens, soit plusieurs ordres de grandeur de plus en données.