A general purpose static binary rewriting framework for Wasm, which aims at reducing the complexity of the Wasm
Project description
BREWasm
BREWasm: A general purpose static binary rewriting framework for Wasm, which aims at reducing the complexity of the Wasm binary format.
Features
BREWasm consists of four key components: the Wasm Parser, section rewriter, semantics rewriter, and Wasm Encoder. The Wasm parser and encoder are built using our abstraction of the Wasm binary, which is represented as a formal format comprising a list of objects. The parser and encoder effectively convert the Wasm binary and an array of objects into each other, with each object containing multiple attributes.
- The section rewriter directly interacts with the formal definition, e.g., inserting/deleting a new object or modifying attributes of existing objects. It packs these fine-grained rewriting functions into APIs.
- The semantics rewriter further combines the fine-grained APIs of section rewriter and offers another set of high-level
APIs, where each of them possesses rich semantics as following, like inserting a function, and append a piece of
linear memory.
- Global Variables
- Import & Export
- Linear Memory
- Function
- Custom Content
Installation
Python package
BREWasm is currently available on PIP repositories.
Install BREWasm::
pip install BREWasm
Examples
Section Rewriter
The basic operation of the section rewriter is select
, insert
, update
and delete
.
from BREWasm import *
binary = BREWasm('a.wasm') # Open a Wasm binary file
# Initialize a section rewriter of the global section.
global_rewriter = SectionRewriter(binary.module, globalsec=binary.module.global_sec)
# Select all the items in global section
global_list = global_rewriter.select(Global())
# Get the attribute globalidx of a global item, whose index is one.
idx = global_list[1].globalidx
# Insert a new global item at the index idx of the global section
global_rewriter.insert(Global(idx), Global(valtype=I32, val=100))
# Delete the global item whose index is idx.
global_rewriter.delete(Global(idx))
# Emit a new binary file
binary.emit_binary('b.wasm')
Semantics Rewriter
from BREWasm import *
binary = BREWasm('a.wasm') # Open a Wasm binary file
# Initialize a semantics rewriter of the function semantics
function_rewriter = SemanticsRewriter.Function(binary.module)
# Define the instructions of function
func_body = [Instruction(LocalGet, 0), Instruction(LocalGet, 1), Instruction(I32Add, 0), Instruction(Nop)]
# Insert a internal function in the binary
function_rewriter.insert_internal_function(idx=1, params_type=[I32, I32], results_type=[I32], local_vec=[Local(0, I32), Local(1, I64)], func_body=func_body)
# Emit a new binary file
binary.emit_binary('b.wasm')
Documentation
The complete documentation can be found here.
Publications
Our work is accepted by SAS 2023. If you have used BREWasm in academic work, please cite our work by:
@article{cao2023general,
title={A General Static Binary Rewriting Framework for WebAssembly},
author={Cao, Shangtong and He, Ningyu and Guo, Yao and Wang, Haoyu},
journal={arXiv preprint arXiv:2305.01454},
year={2023}
}
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file BREWasm-1.0.8.tar.gz
.
File metadata
- Download URL: BREWasm-1.0.8.tar.gz
- Upload date:
- Size: 154.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 54e6e6cd505b9841db309f945da9588567672d8fd942b6e2f82ec46d2b9088a8 |
|
MD5 | ee9b9f8f3e70e1f50cdc4a9a651f643a |
|
BLAKE2b-256 | ad374f057385640e841a8dfbbbd2be5b7222711a0909ae4277c0bb5005a47a01 |