
B2R2 — это полностью управляемый фреймворк для анализа бинарного кода, написанный на F#. Он предоставляет богатый набор алгоритмов, функций и инструментов для реверс-инжиниринга, анализа программ и инспекции на уровне бинарного кода.

B2R2 — это полностью управляемый фреймворк для бинарного анализа, написанный на F#. Он предоставляет богатый набор алгоритмов, функций и инструментов для реверс-инжиниринга, анализа программ и инспекции на бинарном уровне.
Название B2R2 вдохновлено R2-D2, культовым роботом из «Звёздных войн». Изначально проект назывался B2-R2, но позже принял форму без дефиса B2R2, поскольку идентификаторы и пространства имён .NET не допускают дефисов. Название отражает назначение проекта: «B» и «2» намекают на бинарность и двухсостоятельные вычисления, а «R» означает реверсинг. Короче говоря, B2R2 создан для бинарного реверс-инжиниринга.
B2R2 удобен для анализа: он написан на F# — языке, отлично подходящем для построения анализаторов программ благодаря таким возможностям, как сопоставление с образцом, алгебраические типы данных и выразительные функциональные абстракции.
B2R2 быстр: его ядро бинарного анализа спроектировано для эффективности и написано в стиле функциональность прежде всего. Это делает его естественным выбором для чистого параллелизма в типовых задачах анализа, таких как подъём инструкций и восстановление CFG.
B2R2 прост в использовании: будучи полностью управляемой библиотекой, он избавляет от сложной настройки нативных зависимостей. Установите .NET SDK — и всё готово. Встроенная поддержка IntelliSense также упрощает изучение API.
B2R2 независим от ОС: он работает на Linux, macOS и Windows, а также на любых других платформах, поддерживаемых .NET.
B2R2 интероперабелен: он не привязан к одному языку программирования. В принципе, API B2R2 можно использовать из любого языка, поддерживаемого CLI.
B2R2 поддерживает разбор инструкций, бинарную дизассембляцию, ассемблирование, восстановление потока управления и другие базовые строительные блоки для бинарного анализа. Он также включает несколько пользовательских инструментов командной строки, сравнимых с readelf и objdump, оставаясь при этом платформенно-независимым. В настоящее время B2R2 поддерживает четыре формата бинарных файлов: ELF, PE, Mach-O и WebAssembly.
В таблице ниже приведены возможности, поддерживаемые B2R2. Некоторые области всё ещё находятся в разработке, и вклад приветствуется. Перед открытием pull request обязательно прочитайте наше руководство по внесению вклада.
B2R2 намеренно минимизирует количество зависимостей, чтобы упростить сборку и сосредоточить ядро на эффективных алгоритмах и структурах данных для бинарного анализа. Основная библиотека не имеет внешних зависимостей, а большинство внешних библиотек являются опциональными и используются только в определённых компонентах или инструментах. Ниже приведён список внешних библиотек, используемых в проекте.
Документация создаётся с помощью fsdocs и доступна по адресу https://b2r2.org/B2R2/.
Попробуем использовать API B2R2.
Сначала создайте пустую директорию с именем DIRNAME:
mkdir DIRNAME
cd DIRNAME
Затем создайте пустой консольный проект с помощью утилиты командной строки dotnet:
$ dotnet new console -lang F#
Добавьте пакет NuGet B2R2.FrontEnd.API в проект:
$ dotnet add package B2R2.FrontEnd.API
Отредактируйте файл Program.fs в вашем любимом редакторе следующим образом:
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
Запустите его командой dotnet run. Вы должны увидеть поднятые IR-утверждения в консоли. Вот и всё! Вы только что подняли инструкцию Intel всего несколькими строками кода на F#.
Собрать B2R2 очень просто. Установите .NET 10 SDK или новее, и вы готовы к сборке из корневой директории исходников.
Для сборки B2R2 в режиме release выполните dotnet build -c Release.
Для сборки B2R2 в режиме debug выполните dotnet build.
Для получения дополнительной информации о настройке среды разработки F# посетите официальный сайт F#: http://fsharp.org/.
B2R2 разработан участниками SoftSec Lab в KAIST в сотрудничестве с Исследовательским центром кибербезопасности (CSRC) в KAIST. Полный список участников см. в AUTHORS.md.
Если вы используете B2R2 в своих исследованиях, пожалуйста, рассмотрите возможность цитирования нашей статьи:
@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
}
Для B2R2 доступно онлайн-руководство, охватывающее основы использования B2R2 и содержащее практические примеры. Ознакомьтесь с ним по следующей ссылке: https://b2r2.org/tutorial-icst2026/.
Ниже перечислены статьи, в которых используется или развивается B2R2. Если ваша работа должна быть включена, пожалуйста, откройте pull request.
| ЦП | Документация | Разбор команд | Дисассемблер | Подъём | Восстановление CFG | Ассемблер |
|---|---|---|---|---|---|---|
| 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: |