
B2R2 è un framework di analisi binaria completamente gestito scritto in F#. Fornisce un ricco insieme di algoritmi, funzioni e strumenti per il reverse engineering, l'analisi dei programmi e l'ispezione a livello binario.

B2R2 è un framework di analisi binaria completamente gestito scritto in F#. Fornisce un ricco insieme di algoritmi, funzioni e strumenti per il reverse engineering, l'analisi dei programmi e l'ispezione a livello binario.
Il nome B2R2 trae ispirazione da R2-D2, l'iconico robot di Star Wars. Inizialmente chiamato B2-R2, il progetto ha poi adottato la forma senza trattino B2R2 poiché gli identificatori e gli spazi dei nomi .NET non consentono trattini. Il nome riflette lo scopo del progetto: "B" e "2" suggeriscono il calcolo binario e a due stati, mentre "R" sta per reversing. In breve, B2R2 è stato creato per il reversing binario.
B2R2 è analysis-friendly: è scritto in F#, un linguaggio particolarmente adatto per costruire analizzatori di programmi grazie a funzionalità come pattern matching, tipi di dato algebrici e astrazioni funzionali espressive.
B2R2 è veloce: il suo motore di analisi binaria principale è progettato per l'efficienza ed è scritto in uno stile functional-first. Questo lo rende una scelta naturale per il parallelismo puro in attività di analisi comuni come il sollevamento delle istruzioni e il recupero dei CFG.
B2R2 è facile da usare: essendo una libreria completamente gestita, evita complicate configurazioni di dipendenze native. Installa il .NET SDK e sei pronto per partire. Il supporto nativo per IntelliSense rende anche le API più facili da esplorare.
B2R2 è indipendente dal sistema operativo: funziona su Linux, macOS e Windows, così come su qualsiasi altra piattaforma supportata da .NET.
B2R2 è interoperabile: non è legato a un unico linguaggio di programmazione. In linea di principio, le API di B2R2 possono essere utilizzate da qualsiasi linguaggio supportato da CLI.
B2R2 supporta l'analisi delle istruzioni, il disassemblaggio binario, l'assemblaggio, il recupero del flusso di controllo e altri elementi costitutivi fondamentali per l'analisi binaria. Include anche diversi strumenti da riga di comando per l'utente, paragonabili a readelf e objdump, pur rimanendo agnostico rispetto alla piattaforma. B2R2 attualmente supporta quattro formati di file binario: ELF, PE, Mach-O e WebAssembly.
La tabella seguente riassume le funzionalità attualmente supportate da B2R2. Alcune aree sono ancora in fase di sviluppo e i contributi sono benvenuti. Prima di aprire una pull request, assicurati di leggere la nostra guida per i contributi.
B2R2 mantiene intenzionalmente un'impronta di dipendenze ridotta per semplificare le build e mantenere il nucleo concentrato su algoritmi efficienti e strutture dati per l'analisi binaria. La libreria principale non ha dipendenze esterne e la maggior parte delle librerie esterne sono opzionali, utilizzate solo da componenti o strumenti specifici. Di seguito è riportato l'elenco delle librerie esterne utilizzate dal progetto.
La nostra documentazione è generata con fsdocs ed è disponibile all'indirizzo https://b2r2.org/B2R2/.
Proviamo a utilizzare le API di B2R2.
Innanzitutto, crea una directory vuota chiamata DIRNAME:
mkdir DIRNAME
cd DIRNAME
Quindi, crea un progetto console vuoto con lo strumento da riga di comando dotnet:
$ dotnet new console -lang F#
Aggiungi il pacchetto NuGet B2R2.FrontEnd.API al progetto:
$ dotnet add package B2R2.FrontEnd.API
Modifica il file Program.fs con il tuo editor preferito come segue:
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
Eseguilo digitando dotnet run. Dovresti vedere le istruzioni IR sollevate nella tua console. Questo è tutto! Hai appena sollevato un'istruzione Intel con solo poche righe di codice F#.
La compilazione di B2R2 è semplice. Installa .NET 10 SDK o successivo e sei pronto per compilare dalla radice del sorgente.
Per compilare B2R2 in modalità release, esegui dotnet build -c Release.
Per compilare B2R2 in modalità debug, esegui dotnet build.
Per maggiori informazioni sulla configurazione di un ambiente di sviluppo F#, visita il sito web ufficiale di F#: http://fsharp.org/.
B2R2 è stato sviluppato da membri del SoftSec Lab presso KAIST in collaborazione con il Cyber Security Research Center (CSRC) presso KAIST. Consulta AUTHORS.md per l'elenco completo dei collaboratori.
Se utilizzi B2R2 nella tua ricerca, ti preghiamo di considerare la citazione del nostro articolo:
@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
}
È disponibile un tutorial online per B2R2, che copre le basi dell'utilizzo di B2R2 e fornisce esempi pratici. Consultalo al seguente link: https://b2r2.org/tutorial-icst2026/.
Di seguito sono elencati gli articoli che utilizzano o si basano su B2R2. Se il tuo lavoro dovesse essere incluso, apri una pull request.
| CPU | Documentazione | Analisi Istr. | Disasm | Sollevamento | Recupero CFG | Assemblaggio |
|---|---|---|---|---|---|---|
| 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: |