Git Product home page Git Product logo

b2r2-org / b2r2 Goto Github PK

View Code? Open in Web Editor NEW
408.0 26.0 62.0 9.51 MB

B2R2 is a collection of useful algorithms, functions, and tools for binary analysis.

Home Page: https://b2r2.org

License: MIT License

Makefile 0.02% Batchfile 0.01% F# 98.63% CSS 0.27% HTML 0.11% JavaScript 0.90% Forth 0.06%
binary-analysis reverse-engineering cfg fsharp binary disassembler dotnet x86 x86-64 aarch64

b2r2's Introduction

alt text

Build status Build Status

B2R2

B2R2 is a collection of useful algorithms, functions, and tools for binary analysis, written purely in F# (in .NET lingo, it is purely managed code). B2R2 has been named after R2-D2, a famous fictional robot appeared in the Star Wars. In fact, B2R2's original name was B2-R2, but we decided to use the name B2R2 instead, because .NET does not allow dash (-) characters in identifiers (or namespaces). The name essentially represents "binary" or "two": "binary" itself means "two" states anyways. "B" and "2" mean "binary", and "R" indicates reversing.

B2R2?

  1. B2R2 is analysis-friendly: it is written in F#, which provides all the syntactic goodies for writing program analyzers, such as pattern matching, algebraic data types, and etc.

  2. B2R2 is fast: it has a fast and efficient front-end engine for binary analysis, which is written in a functional-first way. Therefore, it naturally supports pure parallelism for binary disassembling, lifting and IR optimization.

  3. B2R2 is easy to play with: there is absolutely no dependency hell for B2R2 because it is a fully-managed library. All you need to do is to install .NET SDK, and you are ready to go! Native IntelliSense support is another plus!

  4. B2R2 is OS-Independent: it works on Linux, Mac, Windows, and etc. as long as .NET core supports it.

  5. B2R2 is interoperable: it is not bound to a specific language. Theoretically, you can use B2R2 APIs with any CLI supported languages.

Features?

B2R2 supports instruction parsing, binary disassembly, assembly, control-flow recovery, and many more. B2R2 also comes with several user-level command-line tools that are similar to readelf and objdump, although our tools are platform-agnostic. B2R2 currently supports four binary file formats: ELF, PE, Mach-O, and WebAssembly.

Below is a list of features that we currently support. Some of them are work in progress, but we look forward to your contributions! Feel free to write a PR (Pull Request) while making sure that you have read our contribution guideline.

Feature x86 x86-64 ARMv7 ARMv8 MIPS32 MIPS64 EVM TMS320C600 AVR PPC SPARC SH4 RISC-V
Instruction Parsing ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ” ๐ŸŒ•
Disassembly ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ” ๐ŸŒ•
Lifting ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ‘ ๐ŸŒ• ๐ŸŒ‘ ๐ŸŒ• ๐ŸŒ‘ ๐ŸŒ•
CFG Recovery ๐ŸŒ• ๐ŸŒ• ๐ŸŒ“ ๐ŸŒ“ ๐ŸŒ“ ๐ŸŒ“ ๐ŸŒ• ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘
Data-Flow ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘
Instruction Emulation ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘
Assembly ๐ŸŒ• ๐ŸŒ• ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘
REPL ๐ŸŒ• ๐ŸŒ• ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘
ROP Compilation ๐ŸŒ• ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘ ๐ŸŒ‘

Dependencies?

B2R2 relies on a tiny set of external .NET libraries, and our design principle is to use a minimum number of libraries. Below is a list of libraries that we leverage.

API Documentation

We currently use fsdocs to generate our documentation: https://b2r2.org/APIDoc/.

Example

Let's try to use B2R2 APIs.

  1. First we create an empty directory DIRNAME:

    mkdir DIRNAME
    cd DIRNAME
    
  2. We then create an empty console project with dotnet command line:

    $ dotnet new console -lang F#
    
  3. Add our nuget package B2R2.FrontEnd to the project:

    $ dotnet add package B2R2.FrontEnd.BinInterface
    
  4. Modify the Program.fs file with your favorite editor as follows:

    open B2R2
    open B2R2.FrontEnd.BinInterface
    
    [<EntryPoint>]
    let main argv =
      let isa = ISA.OfString "amd64"
      let bytes = [| 0x65uy; 0xffuy; 0x15uy; 0x10uy; 0x00uy; 0x00uy; 0x00uy |]
      let hdl = BinHandle.Init (isa, bytes)
      let ins = BinHandle.ParseInstr (hdl, 0UL)
      ins.Translate hdl.TranslationContext |> printfn "%A"
      0
  5. We then just run it by typing: dotnet run. You will be able see lifted IR statements from your console. That's it! You just lifted an Intel instruction with only few lines of F# code!

Build

Building B2R2 is fun and easy. All you need to do is to install .NET 8 SDK or above. Yea, that's it!

  • To build B2R2 in release mode, type make release or dotnet build -c Release in the source root.

  • To build B2R2 in debug mode, type make, or dotnet build in the source root.

For your information, please visit the official web site of F# to get more tips about installing the development environment for F#: http://fsharp.org/.

Credits

Members in SoftSec Lab. @ KAIST developed B2R2 in collaboration with Cyber Security Research Center (CSRC) at KAIST. See Authors for the full list.

Citation

If you plan to use B2R2 in your own research. Please consider citing our paper:

@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
}

Publications

Here are papers using our work. Please create a PR if you want to add yours.

  • FunProbe: Probing Functions from Binary Code through Probabilistic Analysis, FSE 2023
  • How'd Security Benefit Reverse Engineers? The Implication of Intel CET on Function Identification, DSN 2022 (PDF)
  • Smartian: Enhancing Smart Contract Fuzzing with Static and Dynamic Data-Flow Analyses, ASE 2021 (PDF)
  • NTFuzz: Enabling Type-Aware Kernel Fuzzing on Windows with Static Binary Analysis, Oakland 2021 (PDF)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.