
B2R2 est un cadre d'analyse binaire entièrement géré écrit en F#. Il fournit un ensemble riche d'algorithmes, de fonctions et d'outils pour la rétro-ingénierie, l'analyse de programmes et l'inspection au niveau binaire.

B2R2 est un framework d'analyse binaire entièrement géré écrit en F#. Il fournit un riche ensemble d'algorithmes, de fonctions et d'outils pour le rétro-ingénierie, l'analyse de programmes et l'inspection au niveau binaire.
Le nom B2R2 s'inspire de R2-D2, le robot emblématique de Star Wars. Initialement nommé B2-R2, le projet a ensuite adopté la forme sans tiret B2R2 car les identifiants et espaces de noms .NET n'acceptent pas les traits d'union. Le nom reflète la finalité du projet : « B » et « 2 » évoquent le calcul binaire et à deux états, tandis que « R » signifie reverse engineering. En bref, B2R2 est conçu pour le reverse engineering binaire.
B2R2 est orienté analyse : il est écrit en F#, un langage bien adapté à la construction d'analyseurs de programmes grâce à des fonctionnalités telles que le filtrage par motif, les types de données algébriques et les abstractions fonctionnelles expressives.
B2R2 est rapide : son moteur d'analyse binaire central est conçu pour l'efficacité et écrit dans un style fonctionnel en premier. Cela en fait un choix naturel pour le parallélisme pur dans des tâches d'analyse courantes telles que le levage d'instructions et la reconstruction de graphes de flot de contrôle.
B2R2 est facile à utiliser : en tant que bibliothèque entièrement gérée, il évite les configurations complexes de dépendances natives. Installez le .NET SDK et vous êtes prêt. Le support natif IntelliSense facilite également l'exploration des API.
B2R2 est indépendant du système d'exploitation : il fonctionne sur Linux, macOS et Windows, ainsi que sur toute autre plateforme prise en charge par .NET.
B2R2 est interopérable : il n'est lié à aucun langage de programmation spécifique. En principe, les API de B2R2 peuvent être utilisées depuis tout langage compatible CLI.
B2R2 prend en charge l'analyse syntaxique d'instructions, le désassemblage binaire, l'assemblage, la reconstruction de graphes de flot de contrôle et d'autres briques de base pour l'analyse binaire. Il inclut également plusieurs outils en ligne de commande comparables à readelf et objdump, tout en restant indépendant de la plateforme. B2R2 supporte actuellement quatre formats de fichiers binaires : ELF, PE, Mach-O et WebAssembly.
Le tableau ci-dessous résume les fonctionnalités actuellement prises en charge par B2R2. Certains domaines sont encore en cours de développement, et les contributions sont les bienvenues. Avant de soumettre une pull request, veuillez vous assurer de lire notre guide de contribution.
B2R2 maintient intentionnellement une empreinte de dépendances réduite pour simplifier les compilations et garder le cœur concentré sur des algorithmes et structures de données efficaces pour l'analyse binaire. La bibliothèque centrale n'a aucune dépendance externe, et la plupart des bibliothèques externes sont optionnelles et utilisées uniquement par des composants ou outils spécifiques. Voici la liste des bibliothèques externes utilisées par le projet.
Notre documentation est générée avec fsdocs et disponible à l'adresse https://b2r2.org/B2R2/.
Essayons d'utiliser les API de B2R2.
Tout d'abord, créez un répertoire vide nommé DIRNAME :
mkdir DIRNAME
cd DIRNAME
Ensuite, créez un projet console vide avec l'outil en ligne de commande dotnet :
$ dotnet new console -lang F#
Ajoutez le package NuGet B2R2.FrontEnd.API au projet :
$ dotnet add package B2R2.FrontEnd.API
Modifiez le fichier Program.fs avec votre éditeur préféré comme suit :
open B2R2
open B2R2.FrontEnd
[<EntryPoint>]
let main argv =
let isa = ISA "amd64"
let bytes = [| 0x65uy; 0xffuy; 0x15uy; 0x10uy; 0x00uy; 0x00uy; 0x00uy |]
let hdl = BinHandle(bytes, isa)
let lifter = hdl.NewLiftingUnit()
let ins = lifter.ParseInstruction 0UL // parse the instruction at offset 0
lifter.LiftInstruction ins |> printfn "%A"
0
Exécutez-le en tapant dotnet run. Vous devriez voir des instructions IR
levées dans votre console. C'est tout ! Vous venez de lever une instruction
Intel avec seulement quelques lignes de code F#.
Compiler B2R2 est simple. Installez le .NET 10 SDK ou une version ultérieure, et vous êtes prêt à compiler depuis la racine source.
Pour compiler B2R2 en mode release, exécutez dotnet build -c Release.
Pour compiler B2R2 en mode debug, exécutez dotnet build.
Pour plus d'informations sur la configuration d'un environnement de développement F#, visitez le site officiel de F# : http://fsharp.org/.
B2R2 a été développé par des membres du SoftSec Lab à KAIST en collaboration avec le Cyber Security Research Center (CSRC) à KAIST. Consultez AUTHORS.md pour la liste complète des contributeurs.
Si vous utilisez B2R2 dans vos recherches, veuillez citer notre article :
@INPROCEEDINGS{jung:bar:2019,
author = {Minkyu Jung and Soomin Kim and HyungSeok Han and Jaeseung Choi and Sang Kil Cha},
title = {{B2R2}: Building an Efficient Front-End for Binary Analysis},
booktitle = {Proceedings of the NDSS Workshop on Binary Analysis Research},
year = 2019
}
Un tutoriel en ligne est disponible pour B2R2, couvrant les bases de l'utilisation de B2R2 et fournissant des exemples pratiques. Consultez-le au lien suivant : https://b2r2.org/tutorial-icst2026/.
Voici les articles qui utilisent ou s'appuient sur B2R2. Si votre travail doit être inclus, veuillez ouvrir une pull request.
| CPU | Doc | Parsing instr. | Désassemblage | Levage | Reconst. CFG | Assemblage |
|---|---|---|---|---|---|---|
| x86 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: |
| x86-64 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: |
| ARMv7 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| ARMv8 (AArch64) | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| MIPS32 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| MIPS64 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| EVM | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :new_moon: |
| TMS320C6000 | :full_moon: | :full_moon: | :full_moon: | :new_moon: | :first_quarter_moon: | :new_moon: |
| AVR | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| PA-RISC | :full_moon: | :full_moon: | :full_moon: | :new_moon: | :first_quarter_moon: | :new_moon: |
| PPC32 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| SPARC | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| SH4 | :full_moon: | :full_moon: | :full_moon: | :new_moon: | :first_quarter_moon: | :new_moon: |
| RISC-V | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| S390 | :full_moon: | :full_moon: | :full_moon: | :new_moon: | :first_quarter_moon: | :new_moon: |