
B2R2는 F#으로 작성된 완전 관리형 바이너리 분석 프레임워크입니다. 리버스 엔지니어링, 프로그램 분석, 바이너리 수준 검사를 위한 풍부한 알고리즘, 함수, 도구 세트를 제공합니다.

B2R2는 F#으로 작성된 완전 관리형 바이너리 분석 프레임워크입니다. 리버스 엔지니어링, 프로그램 분석, 바이너리 수준 검사를 위한 다양한 알고리즘, 함수 및 도구를 제공합니다.
B2R2라는 이름은 스타워즈의 상징적인 로봇인 R2-D2에서 영감을 받았습니다. 원래 B2-R2라는 이름이었으나, .NET 식별자와 네임스페이스는 하이픈을 허용하지 않기 때문에 나중에 하이픈이 없는 B2R2 형태를 채택했습니다. 이 이름은 프로젝트의 목적을 반영합니다. "B"와 "2"는 바이너리 및 2상태 계산을 나타내고, "R"은 리버싱(Reversing)을 의미합니다. 요약하자면, B2R2는 바이너리 리버싱을 위해 만들어졌습니다.
B2R2는 분석에 친화적입니다: 패턴 매칭, 대수 데이터 타입, 표현력이 풍부한 함수형 추상화와 같은 기능 덕분에 프로그램 분석기 구축에 적합한 언어인 F#으로 작성되었습니다.
B2R2는 빠릅니다: 핵심 바이너리 분석 엔진은 효율성을 위해 설계되었으며, 함수형 우선 스타일로 작성되었습니다. 이는 명령어 리프팅 및 CFG 복구와 같은 일반적인 분석 작업에서 순수 병렬성에 자연스럽게 적합합니다.
B2R2는 사용하기 쉽습니다: 완전 관리형 라이브러리로서 복잡한 네이티브 종속성 설정을 피할 수 있습니다. .NET SDK를 설치하기만 하면 바로 사용할 수 있습니다. 기본 IntelliSense 지원 덕분에 API를 더 쉽게 탐색할 수 있습니다.
B2R2는 OS에 독립적입니다: Linux, macOS, Windows 및 .NET이 지원하는 다른 모든 플랫폼에서 작동합니다.
B2R2는 상호 운용 가능합니다: 단일 프로그래밍 언어에 국한되지 않습니다. 원칙적으로 B2R2 API는 CLI 지원 언어에서 사용할 수 있습니다.
B2R2는 명령어 파싱, 바이너리 디스어셈블리, 어셈블리, 제어 흐름 복구 및 바이너리 분석을 위한 기타 핵심 구성 요소를 지원합니다. 또한 플랫폼에 구애받지 않는 상태에서 readelf 및 objdump와 유사한 여러 사용자 대상 명령줄 도구를 포함합니다. B2R2는 현재 ELF, PE, Mach-O 및 WebAssembly의 네 가지 바이너리 파일 형식을 지원합니다.
아래 표는 B2R2에서 현재 지원하는 기능을 요약한 것입니다. 일부 영역은 아직 개발 중이며, 기여를 환영합니다. 풀 리퀘스트를 열기 전에 기여 가이드라인을 반드시 읽어주시기 바랍니다.
| CPU | 문서 | 명령어 파싱 | 디스어셈블 | 리프팅 | 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: |
B2R2는 의도적으로 종속성 풋프린트를 작게 유지하여 빌드를 단순하게 하고, 핵심이 바이너리 분석을 위한 효율적인 알고리즘 및 데이터 구조에 집중할 수 있도록 합니다. 코어 라이브러리에는 외부 종속성이 없으며, 대부분의 외부 라이브러리는 선택 사항이며 특정 구성 요소나 도구에서만 사용됩니다. 다음은 프로젝트에서 사용하는 외부 라이브러리 목록입니다.
문서는 fsdocs로 생성되며, https://b2r2.org/B2R2/에서 확인할 수 있습니다.
B2R2 API를 사용해 보겠습니다.
먼저 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