• Stars
    star
    320
  • Rank 131,091 (Top 3 %)
  • Language
    C
  • License
    Apache License 2.0
  • Created over 8 years ago
  • Updated about 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A low-overhead dynamic binary instrumentation and modification tool for ARM (both AArch32 and AArch64 support) and RISC-V (RV64GC).

MAMBO: A Low-Overhead Dynamic Binary Modification Tool for RISC architectures

News

  • 2023/04/24 We presented in ISPASS 2023 our paper "Evaluating the Impact of Optimizations for Dynamic Binary Modification on 64-bit RISC-V".
  • 2021-09-21: We've released a partial port of MAMBO to RISC-V in the riscv branch, where development is continuing. The initial porting was done by Guillermo Callaghan and Cosmin Gorgovan.
  • 2021-02-24: PhD opportunities related to MAMBO and security available. If interested, contact mikel.lujan at manchester.ac.uk with the subject APT MAMBO PhD [your surname]
  • 2020-03-16: We've presented (virtually) our VEE paper about AArch64 optimizations in MAMBO. The talk is available on youtube.
  • 2020-02-22: We've presented our CC paper about MAMBO's API (see Publications and Plugin API below) and the cachesim (an online cache simulator) and memcheck (a memory error checker) plugins. The slides are available here.
  • 2018-04-11: We've presented our ICPE paper. The slides are available here.
  • 2018-01-23: We've ran a tutorial on using MAMBO's API at HiPEAC 2018. The slides are available here.
  • 2017-04-24: An address decoder for load and store instructions was added to the API: mambo_calc_ld_st_addr(). It allows plugin developers to automatically obtain the base address of all data memory accesses. This API function is available for all supported instruction sets: A32, T32, A64. Its usage is demonstrated in the plugins/mtrace.c plugin.
  • 2017-04-04: Significantly improved support for Linux signals was implemented.
  • 2017-04-03: The AArch64 port of MAMBO is officially released. The initial AArch64 porting was done by Guillermo Callaghan .
  • We have presented the TACO paper at HiPEAC 2017, on 25th of January. The slides are available here.

Publications

MAMBO was created as part of Cosmin's EPSRC-funded PhD in the School of Computer Science at the University of Manchester. MAMBO is currently being developed as part of the PAMELA EP/K008730/1 and DOME EP/J016330/1 EPSRC projects.

Status

MAMBO's compatibility with applications is continuously being improved as needed. We are using it on ARMv7 and ARMv8 systems. Our systems run the armhf / arm64 builds of Debian, Ubuntu and Arch Linux ARM. Most GNU/Linux applications work correctly. The following more complex applications and benchmark suites are working correctly under MAMBO on our systems (this is not an exhaustive list):

Also read the Known issues section below.

Build

Prerequisites: an ARM system (physical or virtual) to build and run MAMBO on; dependencies: gcc toolchain, libelf(-dev), ruby (>=1.9.1). Debian or Ubuntu users can install the required packages with sudo apt-get install build-essential libelf-dev ruby.

git clone --recurse-submodules https://github.com/beehive-lab/mambo.git
cd mambo
make

Usage

To launch an application under MAMBO, run:

./dbm <path_to_executable> [application's command line arguments]

For example to run ls -a under MAMBO, execute:

./dbm /bin/ls -a

Tip: When an application running under MAMBO exits, the string We're done; exiting with status: <APPLICATION'S EXIT CODE> will be printed to stderr.

Plugin API

The plugin API is event-driven. Plugins should use a init function with __attribute__((constructor)) to register themselves using mambo_register_plugin(). Once a plugin is registered, it can install callbacks for various events using the mambo_register_*_cb() functions. Callback-related functions are listed in api/plugin_support.h. Code generation functions are listed in api/emit_<INST SET>.h and code generation helpers are listed in api/helpers.h. You can also inspect the sample plugin in the plugins/ directory.

To build MAMBO with plugin support, the source code or object file(s) of the plugin you're trying to build must be added to the PLUGINS= line in the makefile, or provided as an argument/envvar. Note that multiple plugins can be enabled at the same time (and will work correctly if properly designed). For performance reasons, it is recommended to remove unused plugins from the PLUGINS= list.

Known issues

  • There are two limitations related to signal handling: the data in the siginfo_t structure passed to SA_SIGINFO signal handlers is incorrect: most signals will appear to have been sent via kill() from the application itself; and synchronous signal (SIGSEGV, SIGBUS, SIGFPE, SIGTRAP, SIGILL, SIGSYS) handlers cannot sigreturn(), but can (sig)longjmp().
  • At the moment, code cache invalidation in response to the munmap and __cache_flush system calls are only done in the thread in which the system call is executed. This can potentially lead to execution of stale cached code in other threads.

Reporting bugs

If you think you have found a bug which is not in the list of Known issues, please report it here, on Github. However, note that we have limited time available to investigate and fix bugs which are not affecting the workloads we are using. Therefore, if you can't pinpoint the cause of the bug yourself, we ask that you provide as many details on how to reproduce it, and preferably provide a statically linked executable which triggers it.

Contributions

We welcome contributions. Use pull requests on Github. However, note that we are doing most development in a private git tree and we are working on a number of features which are not quite ready for public release. Therefore, we would strongly encourage you to get in touch before starting to work on anything large, to avoid duplication of effort. We can probably expedite our release of any WIP features you might be interested in, if you do that.

Sandboxing

Note that similarly to most other DBM / DBI frameworks and to optimise performance / development effort, MAMBO is not designed to secure itself against malicious activity from the application it is translating. This means that without hardening MAMBO itself, it would not be possible to use it to implement a secure sandbox.

More Repositories

1

TornadoVM

TornadoVM: A practical and efficient heterogeneous programming framework for managed languages
Java
1,184
star
2

Maxine-VM

Maxine VM: A meta-circular research VM
Java
323
star
3

FastPath_MP

FastPath_MP: An FPGA-based multi-path architecture for direct access from FPGA to NVMe SSD
C
31
star
4

docker-tornadovm

Docker build scripts for TornadoVM on GPUs: https://github.com/beehive-lab/TornadoVM
Shell
28
star
5

kfusion-tornadovm

🎥 A Java implementation of Kinect Fusion running on Tornado VM.
Java
22
star
6

TornadoQSim

High-performance and modular quantum simulator in Java
Java
16
star
7

beehive-spirv-toolkit

Prototype for a SPIR-V assembler and dissasembler. It provides a composable Java interface for generating SPIR-V code at runtime.
Java
14
star
8

levelzero-jni

Intel LevelZero JNI library for TornadoVM
Java
12
star
9

tornado-insight

TornadoInsight: Unleashing the Power of TornadoVM in IntelliJ IDEA
Java
11
star
10

ProtonVM

Parallel Bytecode Interpreter For Heterogeneous Hardware
C++
9
star
11

llvm-bcj

A Java library that decodes LLVM bitcode files
Java
7
star
12

Maxine-Dockerfile

A Dockerfile to build a docker image that is capable of compiling and running the Maxine VM
Dockerfile
4
star
13

tornadovm-installer

Easy Installer for TornadoVM
Shell
3
star
14

map-reduce

MR4J is a MapReduce framework class building on the ForkJoinPool to manage the scheduling of tasks in the different phases of execution. An optimiser is available to reduce the overhead associated with the intermediate data without extending the API.
Java
3
star
15

mambo-vm

Scripts to build an AArch64 QEMU virtual machine image for evaluating MAMBO
Shell
2
star
16

DFLOW

A framework for rapidly prototyping data DFLOW proof-of-concepts
C++
2
star
17

pie

Instruction encoder / decoder generator
Ruby
2
star
18

riscv-callsites-benchmark

A microbenchmark generating inline callsites for estimating the overhead of different implementations on RISCV
C
1
star
19

tornadovm-dashboard

TornadoVM Dashboard for Performance Tracking
Python
1
star
20

Maxine-Graal

C++
1
star
21

Maxine-Jenkins

Python
1
star