
B2R2 é um framework de análise binária totalmente gerenciado escrito em F#. Ele fornece um conjunto rico de algoritmos, funções e ferramentas para engenharia reversa, análise de programas e inspeção em nível binário.

B2R2 é um framework de análise binária totalmente gerenciado escrito em F#. Ele fornece um rico conjunto de algoritmos, funções e ferramentas para engenharia reversa, análise de programas e inspeção em nível binário.
O nome B2R2 se inspira em R2-D2, o icônico robô de Star Wars. Originalmente chamado de B2-R2, o projeto posteriormente adotou a forma sem hífen B2R2 porque identificadores e namespaces .NET não permitem hífens. O nome reflete o propósito do projeto: "B" e "2" sugerem computação binária e de dois estados, enquanto "R" significa reversing. Em suma, B2R2 foi construído para reversing binário.
B2R2 é analisável: é escrito em F#, uma linguagem bem adequada para construir analisadores de programas graças a recursos como pattern matching, tipos de dados algébricos e abstrações funcionais expressivas.
B2R2 é rápido: seu mecanismo principal de análise binária é projetado para eficiência e escrito em um estilo funcional-first. Isso o torna uma escolha natural para paralelismo puro em tarefas comuns de análise, como elevação de instruções e recuperação de CFG.
B2R2 é fácil de usar: como uma biblioteca totalmente gerenciada, evita configurações complicadas de dependências nativas. Instale o .NET SDK e você estará pronto para começar. O suporte nativo ao IntelliSense também facilita a exploração das APIs.
B2R2 é independente de SO: funciona em Linux, macOS e Windows, bem como em qualquer outra plataforma suportada pelo .NET.
B2R2 é interoperável: não está vinculado a uma única linguagem de programação. Em princípio, as APIs do B2R2 podem ser usadas a partir de qualquer linguagem suportada pelo CLI.
O B2R2 suporta parsing de instruções, desmontagem binária, montagem, recuperação de fluxo de controle e outros blocos fundamentais para análise binária. Ele também inclui várias ferramentas de linha de comando voltadas ao usuário, comparáveis a readelf e objdump, permanecendo independente de plataforma. Atualmente, o B2R2 suporta quatro formatos de arquivos binários: ELF, PE, Mach-O e WebAssembly.
A tabela abaixo resume os recursos atualmente suportados pelo B2R2. Algumas áreas ainda estão em desenvolvimento, e contribuições são bem-vindas. Antes de abrir um pull request, leia nossa diretriz de contribuição.
| CPU | Docs | Ins Parsing | Disasm | Lifting | CFG Recovery | Assembly |
|---|---|---|---|---|---|---|
| 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: |
O B2R2 mantém intencionalmente uma pegada de dependências pequena para simplificar as compilações e manter o núcleo focado em algoritmos eficientes e estruturas de dados para análise binária. A biblioteca principal não tem dependências externas, e a maioria das bibliotecas externas são opcionais e usadas apenas por componentes ou ferramentas específicas. Abaixo está a lista de bibliotecas externas usadas pelo projeto.
Nossa documentação é gerada com fsdocs e está disponível em https://b2r2.org/B2R2/.
Vamos tentar usar as APIs do B2R2.
Primeiro, crie um diretório vazio chamado DIRNAME:
mkdir DIRNAME
cd DIRNAME
Em seguida, crie um projeto de console vazio com a ferramenta de linha de comando dotnet:
$ dotnet new console -lang F#
Adicione o pacote NuGet B2R2.FrontEnd.API ao projeto:
$ dotnet add package B2R2.FrontEnd.API
Modifique o arquivo Program.fs com seu editor favorito da seguinte forma:
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 // analisa a instrução no offset 0
lifter.LiftInstruction ins |> printfn "%A"
0
Execute digitando dotnet run. Você deverá ver as instruções IR elevadas no seu console. Pronto! Você acabou de elevar uma instrução Intel com apenas algumas linhas de código F#.
Compilar o B2R2 é simples. Instale o .NET 10 SDK ou posterior, e você estará pronto para compilar a partir da raiz do código-fonte.
Para compilar o B2R2 em modo release, execute dotnet build -c Release.
Para compilar o B2R2 em modo debug, execute dotnet build.
Para mais informações sobre como configurar um ambiente de desenvolvimento F#, visite o site oficial do F#: http://fsharp.org/.
O B2R2 foi desenvolvido por membros do SoftSec Lab no KAIST em colaboração com o Cyber Security Research Center (CSRC) no KAIST. Consulte AUTHORS.md para a lista completa de contribuidores.
Se você usar o B2R2 em sua pesquisa, considere citar nosso artigo:
@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
}
Um tutorial online está disponível para o B2R2, que cobre os fundamentos do uso do B2R2 e fornece exemplos práticos. Confira no seguinte link: https://b2r2.org/tutorial-icst2026/.
Abaixo estão artigos que usam ou se baseiam no B2R2. Se o seu trabalho deve ser incluído, por favor abra um pull request.
| 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: |