
B2R2 es un framework de análisis binario completamente gestionado escrito en F#. Proporciona un rico conjunto de algoritmos, funciones y herramientas para ingeniería inversa, análisis de programas e inspección a nivel binario.

B2R2 es un marco de análisis binario completamente administrado escrito en F#. Proporciona un amplio conjunto de algoritmos, funciones y herramientas para ingeniería inversa, análisis de programas e inspección a nivel binario.
El nombre B2R2 se inspira en R2-D2, el icónico robot de Star Wars. Originalmente nombrado B2-R2, el proyecto adoptó posteriormente la forma sin guion B2R2 porque los identificadores y espacios de nombres de .NET no permiten guiones. El nombre refleja el propósito del proyecto: "B" y "2" sugieren cómputo binario y de dos estados, mientras que "R" significa reversing. En resumen, B2R2 está construido para reversing binario.
B2R2 es amigable para el análisis: está escrito en F#, un lenguaje muy adecuado para construir analizadores de programas gracias a características como el pattern matching, los tipos de datos algebraicos y las expresivas abstracciones funcionales.
B2R2 es rápido: su motor central de análisis binario está diseñado para la eficiencia y está escrito en un estilo funcional primero. Esto lo convierte en un ajuste natural para el paralelismo puro en tareas comunes de análisis, como el levantamiento de instrucciones y la recuperación de CFG.
B2R2 es fácil de usar: como biblioteca completamente administrada, evita la complicada configuración de dependencias nativas. Instala el .NET SDK y estarás listo para empezar. El soporte nativo de IntelliSense también facilita la exploración de las APIs.
B2R2 es independiente del sistema operativo: funciona en Linux, macOS y Windows, así como en cualquier otra plataforma compatible con .NET.
B2R2 es interoperable: no está atado a un solo lenguaje de programación. En principio, las APIs de B2R2 se pueden usar desde cualquier lenguaje compatible con CLI.
B2R2 admite análisis sintáctico de instrucciones, desensamblado binario, ensamblado, recuperación de flujo de control y otros bloques fundamentales para el análisis binario. También incluye varias herramientas de línea de comandos orientadas al usuario, comparables a readelf y objdump, mientras permanece independiente de la plataforma. B2R2 actualmente soporta cuatro formatos de archivos binarios: ELF, PE, Mach-O y WebAssembly.
La siguiente tabla resume las funcionalidades actualmente soportadas por B2R2. Algunas áreas aún están en progreso y las contribuciones son bienvenidas. Antes de abrir un pull request, asegúrate de leer nuestra guía de contribución.
B2R2 mantiene su huella de dependencias intencionadamente pequeña para que las compilaciones sean simples y para mantener el núcleo centrado en algoritmos y estructuras de datos eficientes para el análisis binario. La biblioteca principal no tiene dependencias externas, y la mayoría de las bibliotecas externas son opcionales y se utilizan solo en componentes o herramientas específicas. A continuación se muestra la lista de bibliotecas externas utilizadas por el proyecto.
Nuestra documentación se genera con fsdocs y está disponible en https://b2r2.org/B2R2/.
Probemos a usar las APIs de B2R2.
Primero, crea un directorio vacío llamado DIRNAME:
mkdir DIRNAME
cd DIRNAME
Luego, crea un proyecto de consola vacío con la herramienta de línea de comandos dotnet:
$ dotnet new console -lang F#
Añade el paquete NuGet B2R2.FrontEnd.API al proyecto:
$ dotnet add package B2R2.FrontEnd.API
Modifica el archivo Program.fs con tu editor favorito de la siguiente manera:
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
Ejecútalo escribiendo dotnet run. Deberías ver declaraciones IR elevadas en tu consola. ¡Eso es todo! Acabas de elevar una instrucción Intel con solo unas pocas líneas de código F#.
Compilar B2R2 es sencillo. Instala el SDK de .NET 10 o posterior y estarás listo para compilar desde la raíz del código fuente.
Para compilar B2R2 en modo de lanzamiento, ejecuta dotnet build -c Release.
Para compilar B2R2 en modo de depuración, ejecuta dotnet build.
Para más información sobre cómo configurar un entorno de desarrollo F#, visita el sitio web oficial de F#: http://fsharp.org/.
B2R2 fue desarrollado por miembros del SoftSec Lab de KAIST en colaboración con el Centro de Investigación en Ciberseguridad (CSRC) de KAIST. Consulta AUTHORS.md para ver la lista completa de contribuyentes.
Si usas B2R2 en tu investigación, considera citar nuestro artículo:
@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
}
Hay un tutorial en línea disponible para B2R2, que cubre los conceptos básicos del uso de B2R2 y proporciona ejemplos prácticos. Échale un vistazo en el siguiente enlace: https://b2r2.org/tutorial-icst2026/.
A continuación se presentan artículos que utilizan o se basan en B2R2. Si tu trabajo debería ser incluido, por favor abre un pull request.
| CPU | Documentación | Análisis de Instrucciones | Desensamblado | Elevación | Recuperación de CFG | Ensamblado |
|---|---|---|---|---|---|---|
| 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: |