danleh / Wasabi
Licence: mit
A dynamic analysis framework for WebAssembly programs.
Stars: ✭ 279
Programming Languages
javascript
184084 projects - #8 most used programming language
Projects that are alternatives of or similar to Wasabi
holyc
An easy to use C++ to WASM compiler (Highly-experimental)
Stars: ✭ 33 (-88.17%)
Mutual labels: webassembly, wasm
Riscv Rust
RISC-V processor emulator written in Rust+WASM
Stars: ✭ 253 (-9.32%)
Mutual labels: webassembly, wasm
idris-codegen-wasm
WebAssembly Code Generation Backend for Idris Compiler
Stars: ✭ 79 (-71.68%)
Mutual labels: webassembly, wasm
x-img-diff-js
🎨 JavaScript library which compares 2 images and detect structural difference information using OpenCV(WebAssembly)
Stars: ✭ 43 (-84.59%)
Mutual labels: webassembly, wasm
Wasm Git
GIT for nodejs and the browser using https://libgit2.org compiled to WebAssembly with https://emscripten.org
Stars: ✭ 261 (-6.45%)
Mutual labels: webassembly, wasm
wapc-rust
Rust-based WebAssembly Host Runtime for waPC-compliant modules
Stars: ✭ 75 (-73.12%)
Mutual labels: webassembly, wasm
wasm-fizzbuzz
WebAssembly from Scratch: From FizzBuzz to DooM.
Stars: ✭ 1,364 (+388.89%)
Mutual labels: webassembly, wasm
block-aligner
SIMD-accelerated library for computing global and X-drop affine gap penalty sequence-to-sequence or sequence-to-profile alignments using an adaptive block-based algorithm.
Stars: ✭ 58 (-79.21%)
Mutual labels: webassembly, wasm
wasm-arrays
A couple of helper functions to make WebAssembly array parameters easy to use
Stars: ✭ 33 (-88.17%)
Mutual labels: webassembly, wasm
golang-wasm
Golang-WASM provides a simple idiomatic, and comprehensive API and bindings for working with WebAssembly for Go and JavaScript developers
Stars: ✭ 57 (-79.57%)
Mutual labels: webassembly, wasm
go-wasm-examples
Some small examples of using Go and WebAssembly
Stars: ✭ 22 (-92.11%)
Mutual labels: webassembly, wasm
rustexp
A Rust regular expression editor and tester that runs entirely within the browser!
Stars: ✭ 59 (-78.85%)
Mutual labels: webassembly, wasm
rustwasmc
Tool for building Rust functions for Node.js. Combine the performance of Rust, safety and portability of WebAssembly, and ease of use of JavaScript.
Stars: ✭ 97 (-65.23%)
Mutual labels: webassembly, wasm
pywasm3
Python bindings for Wasm3, the fastest WebAssembly interpreter
Stars: ✭ 34 (-87.81%)
Mutual labels: webassembly, wasm
Wasabi
Tutorial at PLDI 2019
We offered a tutorial on how to use Wasabi for dynamically analyzing WebAssembly at PLDI 2019. Although the conference is now over, all the material is online at http://wasabi.software-lab.org/tutorial-pldi2019/. In particular, the slides are available here and the hands-on tasks are in this repo under tutorial/.
Installation from Source
-
Dependencies and tools
- Git, CMake, and GCC or Clang for building the dependencies (those for sure, but possibly more)
- Firefox >= 52 (which is what I use, or Chrome >= 57) for running WebAssembly
-
WebAssembly Binary Toolkit (WABT):
wat2wasm
/wasm2wat
for converting Wasm binaries to/from text,wasm-objdump
for inspecting binaries, andwasm-interp
for a simple interpreter. (See https://github.com/WebAssembly/wabt#cloning.)
git clone --recursive https://github.com/WebAssembly/wabt cd wabt make # add binaries to $PATH, e.g., by appending the following line to ~/.profile or ~/.bashrc export PATH="path/to/your/wabt/bin:$PATH" # test wat2wasm > usage: wat2wasm [options] filename
-
Emscripten:
emcc
for compiling C/C++ programs to WebAssembly. (See https://emscripten.org/docs/getting_started/downloads.html.)
git clone https://github.com/emscripten-core/emsdk.git cd emsdk ./emsdk install latest ./emsdk activate latest # add emcc to $PATH, e.g., by appending the following line to ~/.profile or ~/.bashrc # WARNING unfortunately, this also exports a quite old emscripten-included clang version, # so maybe do this manually before using emscripten and not for all shells. source path/to/your/emsdk/emsdk_env.sh # test emcc --version > emcc (Emscripten gcc/clang-like replacement) 1.38.1
-
Rust:
cargo
as Rust's package manager and build tool (no need to callrustc
manually) andrustup
for managing different Rust toolchain versions. See https://www.rust-lang.org/tools/install. If there are build errors, please make sure you use a recent stable version of Rust.
curl https://sh.rustup.rs -o rustup-init.sh # follow instructions (typically just enter 1 to proceed) # should automatically change ~/.profile to include the binaries in $PATH sh rustup-init.sh # test cargo --version > cargo 1.41.1-stable
-
Wasabi itself
git clone https://github.com/danleh/wasabi.git
cd wasabi
# download dependencies from https://crates.io, compile with optimizations, make wasabi binary available in $PATH
cargo install --path .
# test
wasabi
> Error: expected at least one argument
> Usage: wasabi <input_wasm_file> [<output_dir>]
Alternative Setup via Docker
- Thanks to ctfhacker for the Dockerfile contribution.
- After having cloned this repo, you build the Docker image with
docker build --rm -t wasabi .
- Once built, you can use the container via (assuming you have a hello.wasm file in your working directory)
ls
> hello.wasm
docker run --rm -t -v `pwd`:/data wasabi /data/hello.wasm /data
Usage Tutorial
-
Create WebAssembly programs
- Manually:
;; paste into hello-manual.wat (module (import "host" "print" (func $i (param i32))) (func $somefun i32.const 42 call $i) (export "somefun" (func $somefun)) )
# assemble binary Wasm file wat2wasm hello-manual.wat # run binary (imported function host.print is provided by the interpreter) wasm-interp --host-print --run-all-exports hello-manual.wasm > called host host.print(i32:42) => > somefun() =>
- From C with Emscripten:
// paste into hello.c #include <stdio.h> int main(int argc, char const *argv[]) { printf("Hello, world!\n"); return 0; }
# emscripten produces asm.js by default, so use WASM=1 flag # note that this generates 3 files: # - hello.wasm: actual binary # - hello.js: glue code for compiling and running WebAssembly in the browser, uses fetch() to get hello.wasm # - hello.html: website that emulates a console, includes hello.js emcc hello.c -s WASM=1 -o hello.html # (necessary for Chrome, optional for Firefox:) some-origin policy disallows getting # hello.wasm file from inside hello.js unless it is served from an actual webserver # emrun is just a minimal webserver provided by emscripten emrun --no_browser --port 8080 . # browse to local webserver with Firefox or Chrome firefox http://localhost:8080/hello.html chromium-browser http://localhost:8080/hello.html # (optional:) inspect the produced binary with wasm2wat or wasm-objdump wasm2wat hello.wasm -o hello.wat wasm-objdump hello.wasm -hdx | less
-
Apply Wasabi to WebAssembly programs in the browser
-
Step 1: Instrument
# start with C to Wasm (via Emscripten) project from previous point, that is: ls > hello.c hello.html hello.js hello.wasm # instrument hello.wasm, produces 2 files in out/: # - out/hello.wasm: instrumented binary, with imported hooks and calls to these hooks inserted between instructions # - out/hello.wasabi.js: Wasabi loader, runtime, and generated program-dependent JavaScript (low-level monomorphized hooks and statically extracted information about the binary) wasabi hello.wasm # replace original binary with instrumented one and copy generated JavaScript mv hello.wasm hello.orig.wasm cp out/* . # insert Wasabi-generated JavaScript into emscripten-generated HTML harness (FIXME hacky) sed -i '/<script async type="text\/javascript" src="hello.js"><\/script>/a <script src="hello.wasabi.js"></script>' hello.html # should still work as before instrumentation emrun --no_browser --port 8080 . firefox http://localhost:8080/hello.html
-
Step 2: Analyze
# use example analysis that just logs all instructions with their inputs and results cp /path/to/wasabi/analyses/log-all.js . # include analysis in emscripten-generated HTML harness (FIXME hacky) # NOTE analysis must be loaded *after* the Wasabi-generated JavaScript sed -i '/<script src="hello.wasabi.js"><\/script>/a <script src="log-all.js"></script>' hello.html # run in browser again, see lots of output on JavaScript console emrun --no_browser --port 8080 . firefox http://localhost:8080/hello.html
-
-
Running WebAssembly and instrumenting with Wasabi for Node.js: TODO
Note that the project description data, including the texts, logos, images, and/or trademarks,
for each open source project belongs to its rightful owner.
If you wish to add or remove any projects, please contact us at [email protected].