Git Product home page Git Product logo

wasmdec's Introduction

wasmdec

wasmdec is a program that converts WebAssembly binaries to C.

Demo

An online real-time WebAssembly decompiler utilizing wasmdec is avalible here

Simple Example

wasmdec will translate this WebAssembly binary:

(module
	(func $addTwo (param i32 i32) (result i32)
		(return
			(i32.add (get_local 0) (get_local 1))
		)
	)
	(export "addTwo" $addTwo)
)

To the following pseudo-C code:

int fn_addTwo(int arg0, int arg1) {
	return arg0 + arg1;
}

More practical examples

Diep.io (HTML5 web game written in C++ and compiled to WASM)

Diep.io is a real time web game written in C++ and compiled to WebAssembly via Emscripten.

wasmdec

wasmdec is capable of decompiling itself back to C.

WebDSP (a signal processing library compiled to WASM)

From the WebDSP repository:

WebDSP is a collection of highly performant algorithms, which are designed to be building blocks for web applications that aim to operate on media data. The methods are written in C++ and compiled to WASM, and exposed as simple vanilla Javascript functions developers can run on the client side.

Applications

A CTF write-up which uses wasmdec to reverse engineer a WASM binary

Installing with release

  • Grab a release on the releases page and select the correct tarball for your OS and arch.
  • Extract and run install.sh as root.

Installing manually

Getting the code

Clone the repository with

git clone https://github.com/wwwg/wasmdec.git --recursive

Make sure the recursive flag is set to clone all the submodules.

Building

To build wasmdec and install all of it's dependencies, run sudo make all in the wasmdec directory. GCC 7 or higher is reccomended.

Usage

wasmdec -o (output file) (options) [input files]

Where options is one of:

  • -e or --extra : Emits extra function information as comments:
    • Raw WebAssembly names of functions
    • Number of local variables and parameters of functions
  • -m or --memdump :
    • Dumps the binary's memory and table to disk
    • NOTE : memdump ONLY dumps memory and doesn't actually do any decompilation
  • -d or --debug : Print extra debug information to stdout
  • If no output file is specified, the default is out.c
  • When more than one input file is provided, wasmdec will decompile each WebAssembly to the same output file. Functions from more than one file are prefixed by their module name in order to prevent ambiguous function definitions.

wasmdec's People

Contributors

ultratype avatar wwwg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wasmdec's Issues

Can't build it, undefined reference to `Colors::outputColorCode`

Ubuntu 16.04 xenial,

pc@pc:~/wasmdec$ g++ -v
Using built-in specs.
COLLECT_GCC=c++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.5' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5) 

Fail part

src/CodeGen.o: In function `wasmdec::CodeGenerator::CodeGenerator(std::vector<char, std::allocator<char> >*, bool, bool)':
/home/pc/wasmdec/src/CodeGen.cc:13: undefined reference to `wasm::WasmBinaryBuilder::read()'
src/CodeGen.o: In function `Colors::normal(std::ostream&)':
/home/pc/wasmdec/src/binaryen/src/support/colors.h:27: undefined reference to `Colors::outputColorCode(std::ostream&, char const*)'
src/CodeGen.o: In function `Colors::red(std::ostream&)':
/home/pc/wasmdec/src/binaryen/src/support/colors.h:28: undefined reference to `Colors::outputColorCode(std::ostream&, char const*)'
src/CodeGen.o: In function `Colors::magenta(std::ostream&)':
/home/pc/wasmdec/src/binaryen/src/support/colors.h:29: undefined reference to `Colors::outputColorCode(std::ostream&, char const*)'
src/CodeGen.o: In function `Colors::green(std::ostream&)':
/home/pc/wasmdec/src/binaryen/src/support/colors.h:32: undefined reference to `Colors::outputColorCode(std::ostream&, char const*)'

Full build log

pc@pc:~$ git clone --recursive https://github.com/wwwg/wasmdec
Cloning into 'wasmdec'...
remote: Counting objects: 1176, done.
remote: Total 1176 (delta 0), reused 0 (delta 0), pack-reused 1176
Receiving objects: 100% (1176/1176), 2.09 MiB | 120.00 KiB/s, done.
Resolving deltas: 100% (766/766), done.
Checking connectivity... done.
Submodule 'src/binaryen' (https://github.com/WebAssembly/binaryen.git) registered for path 'src/binaryen'
Cloning into 'src/binaryen'...
remote: Counting objects: 48133, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 48133 (delta 41), reused 43 (delta 23), pack-reused 48056
Receiving objects: 100% (48133/48133), 57.83 MiB | 187.00 KiB/s, done.
Resolving deltas: 100% (41231/41231), done.
Checking connectivity... done.
Submodule path 'src/binaryen': checked out 'd38eeadc55a4b3a97b2879ba3d13a50224c28df6'
Submodule 'test/emscripten' (https://github.com/kripken/emscripten.git) registered for path 'test/emscripten'
Submodule 'test/spec' (https://github.com/WebAssembly/testsuite.git) registered for path 'test/spec'
Submodule 'test/waterfall' (https://github.com/WebAssembly/waterfall.git) registered for path 'test/waterfall'
Cloning into 'test/emscripten'...
remote: Counting objects: 105296, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 105296 (delta 6), reused 8 (delta 4), pack-reused 105276
Receiving objects: 100% (105296/105296), 152.21 MiB | 176.00 KiB/s, done.
Resolving deltas: 100% (72848/72848), done.
Checking connectivity... done.
Submodule path 'src/binaryen/test/emscripten': checked out '1d979a75722a513b586e6705d662ff4ee0ea832b'
Cloning into 'test/spec'...
remote: Counting objects: 890, done.
remote: Total 890 (delta 0), reused 0 (delta 0), pack-reused 890
Receiving objects: 100% (890/890), 551.25 KiB | 144.00 KiB/s, done.
Resolving deltas: 100% (604/604), done.
Checking connectivity... done.
Submodule path 'src/binaryen/test/spec': checked out '8b1077b8a9e75054ec373b064a25fd23e9a39719'
Cloning into 'test/waterfall'...
remote: Counting objects: 2336, done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 2336 (delta 20), reused 20 (delta 11), pack-reused 2302
Receiving objects: 100% (2336/2336), 595.24 KiB | 160.00 KiB/s, done.
Resolving deltas: 100% (1696/1696), done.
Checking connectivity... done.
Submodule path 'src/binaryen/test/waterfall': checked out '900646fc880d526160b0df9b78bc9dd4f02dc1ab'
pc@pc:~$ cd wasmdec
pc@pc:~/wasmdec$ sudo make all
[sudo] password for pc: 
make binaryen
make[1]: Entering directory '/home/pc/wasmdec'
cd src/binaryen && cmake . && make
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- No build type selected, default to Release
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE  
-- Building with -std=c++11
-- Building for platform x86-64
-- Building with -Wall
-- Building with -Werror
-- Building with -Wextra
-- Building with -Wno-unused-parameter
-- Building with -fno-omit-frame-pointer
-- Building with -fPIC
-- Building with -O2
-- Building with -UNDEBUG
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pc/wasmdec/src/binaryen
make[2]: Entering directory '/home/pc/wasmdec/src/binaryen'
make[3]: Entering directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target wasm
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[  1%] Building CXX object src/wasm/CMakeFiles/wasm.dir/literal.cpp.o
[  2%] Building CXX object src/wasm/CMakeFiles/wasm.dir/wasm.cpp.o
[  3%] Building CXX object src/wasm/CMakeFiles/wasm.dir/wasm-binary.cpp.o
[  4%] Building CXX object src/wasm/CMakeFiles/wasm.dir/wasm-io.cpp.o
[  5%] Building CXX object src/wasm/CMakeFiles/wasm.dir/wasm-s-parser.cpp.o
[  6%] Building CXX object src/wasm/CMakeFiles/wasm.dir/wasm-type.cpp.o
[  7%] Building CXX object src/wasm/CMakeFiles/wasm.dir/wasm-validator.cpp.o
[  8%] Linking CXX static library ../../lib/libwasm.a
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[  8%] Built target wasm
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target ir
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[  9%] Building CXX object src/ir/CMakeFiles/ir.dir/ExpressionAnalyzer.cpp.o
[ 10%] Building CXX object src/ir/CMakeFiles/ir.dir/ExpressionManipulator.cpp.o
[ 11%] Building CXX object src/ir/CMakeFiles/ir.dir/LocalGraph.cpp.o
[ 12%] Linking CXX static library ../../lib/libir.a
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 12%] Built target ir
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target asmjs
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 13%] Building CXX object src/asmjs/CMakeFiles/asmjs.dir/asm_v_wasm.cpp.o
[ 14%] Building CXX object src/asmjs/CMakeFiles/asmjs.dir/shared-constants.cpp.o
[ 15%] Linking CXX static library ../../lib/libasmjs.a
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 15%] Built target asmjs
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target cfg
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 16%] Building CXX object src/cfg/CMakeFiles/cfg.dir/Relooper.cpp.o
[ 17%] Linking CXX static library ../../lib/libcfg.a
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 17%] Built target cfg
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target emscripten-optimizer
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 18%] Building CXX object src/emscripten-optimizer/CMakeFiles/emscripten-optimizer.dir/optimizer-shared.cpp.o
[ 19%] Building CXX object src/emscripten-optimizer/CMakeFiles/emscripten-optimizer.dir/parser.cpp.o
[ 20%] Building CXX object src/emscripten-optimizer/CMakeFiles/emscripten-optimizer.dir/simple_ast.cpp.o
[ 21%] Linking CXX static library ../../lib/libemscripten-optimizer.a
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 21%] Built target emscripten-optimizer
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target passes
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 22%] Building CXX object src/passes/CMakeFiles/passes.dir/pass.cpp.o
[ 23%] Building CXX object src/passes/CMakeFiles/passes.dir/CoalesceLocals.cpp.o
[ 24%] Building CXX object src/passes/CMakeFiles/passes.dir/CodePushing.cpp.o
[ 25%] Building CXX object src/passes/CMakeFiles/passes.dir/CodeFolding.cpp.o
[ 26%] Building CXX object src/passes/CMakeFiles/passes.dir/ConstHoisting.cpp.o
[ 27%] Building CXX object src/passes/CMakeFiles/passes.dir/DeadCodeElimination.cpp.o
[ 28%] Building CXX object src/passes/CMakeFiles/passes.dir/DuplicateFunctionElimination.cpp.o
[ 29%] Building CXX object src/passes/CMakeFiles/passes.dir/ExtractFunction.cpp.o
[ 30%] Building CXX object src/passes/CMakeFiles/passes.dir/Flatten.cpp.o
[ 31%] Building CXX object src/passes/CMakeFiles/passes.dir/Inlining.cpp.o
[ 32%] Building CXX object src/passes/CMakeFiles/passes.dir/LegalizeJSInterface.cpp.o
[ 33%] Building CXX object src/passes/CMakeFiles/passes.dir/LocalCSE.cpp.o
[ 34%] Building CXX object src/passes/CMakeFiles/passes.dir/LogExecution.cpp.o
[ 35%] Building CXX object src/passes/CMakeFiles/passes.dir/I64ToI32Lowering.cpp.o
[ 36%] Building CXX object src/passes/CMakeFiles/passes.dir/InstrumentLocals.cpp.o
[ 37%] Building CXX object src/passes/CMakeFiles/passes.dir/InstrumentMemory.cpp.o
[ 38%] Building CXX object src/passes/CMakeFiles/passes.dir/MemoryPacking.cpp.o
[ 39%] Building CXX object src/passes/CMakeFiles/passes.dir/MergeBlocks.cpp.o
[ 40%] Building CXX object src/passes/CMakeFiles/passes.dir/Metrics.cpp.o
[ 41%] Building CXX object src/passes/CMakeFiles/passes.dir/NameList.cpp.o
[ 42%] Building CXX object src/passes/CMakeFiles/passes.dir/OptimizeInstructions.cpp.o
[ 43%] Building CXX object src/passes/CMakeFiles/passes.dir/PickLoadSigns.cpp.o
[ 44%] Building CXX object src/passes/CMakeFiles/passes.dir/PostEmscripten.cpp.o
[ 45%] Building CXX object src/passes/CMakeFiles/passes.dir/Precompute.cpp.o
[ 46%] Building CXX object src/passes/CMakeFiles/passes.dir/Print.cpp.o
[ 47%] Building CXX object src/passes/CMakeFiles/passes.dir/PrintCallGraph.cpp.o
[ 48%] Building CXX object src/passes/CMakeFiles/passes.dir/RelooperJumpThreading.cpp.o
[ 49%] Building CXX object src/passes/CMakeFiles/passes.dir/ReReloop.cpp.o
[ 50%] Building CXX object src/passes/CMakeFiles/passes.dir/RemoveImports.cpp.o
[ 51%] Building CXX object src/passes/CMakeFiles/passes.dir/RemoveMemory.cpp.o
[ 52%] Building CXX object src/passes/CMakeFiles/passes.dir/RemoveUnusedBrs.cpp.o
[ 53%] Building CXX object src/passes/CMakeFiles/passes.dir/RemoveUnusedNames.cpp.o
[ 54%] Building CXX object src/passes/CMakeFiles/passes.dir/RemoveUnusedModuleElements.cpp.o
[ 55%] Building CXX object src/passes/CMakeFiles/passes.dir/ReorderLocals.cpp.o
[ 56%] Building CXX object src/passes/CMakeFiles/passes.dir/ReorderFunctions.cpp.o
[ 57%] Building CXX object src/passes/CMakeFiles/passes.dir/TrapMode.cpp.o
[ 58%] Building CXX object src/passes/CMakeFiles/passes.dir/SafeHeap.cpp.o
[ 59%] Building CXX object src/passes/CMakeFiles/passes.dir/SimplifyLocals.cpp.o
[ 60%] Building CXX object src/passes/CMakeFiles/passes.dir/SSAify.cpp.o
[ 61%] Building CXX object src/passes/CMakeFiles/passes.dir/Untee.cpp.o
[ 62%] Building CXX object src/passes/CMakeFiles/passes.dir/Vacuum.cpp.o
[ 63%] Linking CXX static library ../../lib/libpasses.a
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 63%] Built target passes
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target support
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 64%] Building CXX object src/support/CMakeFiles/support.dir/archive.cpp.o
[ 65%] Building CXX object src/support/CMakeFiles/support.dir/bits.cpp.o
[ 66%] Building CXX object src/support/CMakeFiles/support.dir/colors.cpp.o
[ 67%] Building CXX object src/support/CMakeFiles/support.dir/command-line.cpp.o
[ 68%] Building CXX object src/support/CMakeFiles/support.dir/file.cpp.o
[ 69%] Building CXX object src/support/CMakeFiles/support.dir/safe_integer.cpp.o
[ 70%] Building CXX object src/support/CMakeFiles/support.dir/threads.cpp.o
[ 71%] Linking CXX static library ../../lib/libsupport.a
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 71%] Built target support
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target wasm-merge
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 72%] Building CXX object CMakeFiles/wasm-merge.dir/src/tools/wasm-merge.cpp.o
[ 73%] Linking CXX executable bin/wasm-merge
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 73%] Built target wasm-merge
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target wasm-reduce
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 74%] Building CXX object CMakeFiles/wasm-reduce.dir/src/tools/wasm-reduce.cpp.o
[ 75%] Building CXX object CMakeFiles/wasm-reduce.dir/src/wasm-interpreter.cpp.o
[ 76%] Linking CXX executable bin/wasm-reduce
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 76%] Built target wasm-reduce
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target wasm-opt
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 77%] Building CXX object CMakeFiles/wasm-opt.dir/src/tools/wasm-opt.cpp.o
[ 78%] Building CXX object CMakeFiles/wasm-opt.dir/src/wasm-interpreter.cpp.o
[ 79%] Linking CXX executable bin/wasm-opt
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 79%] Built target wasm-opt
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target wasm-shell
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 80%] Building CXX object CMakeFiles/wasm-shell.dir/src/tools/wasm-shell.cpp.o
[ 81%] Building CXX object CMakeFiles/wasm-shell.dir/src/wasm-interpreter.cpp.o
[ 82%] Linking CXX executable bin/wasm-shell
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 82%] Built target wasm-shell
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target wasm-as
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 83%] Building CXX object CMakeFiles/wasm-as.dir/src/tools/wasm-as.cpp.o
[ 84%] Linking CXX executable bin/wasm-as
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 84%] Built target wasm-as
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target binaryen
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 85%] Building CXX object CMakeFiles/binaryen.dir/src/binaryen-c.cpp.o
[ 86%] Linking CXX shared library lib/libbinaryen.so
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 86%] Built target binaryen
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target asm2wasm
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 87%] Building CXX object CMakeFiles/asm2wasm.dir/src/tools/asm2wasm.cpp.o
[ 88%] Building CXX object CMakeFiles/asm2wasm.dir/src/wasm-emscripten.cpp.o
[ 89%] Linking CXX executable bin/asm2wasm
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 89%] Built target asm2wasm
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target s2wasm
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 90%] Building CXX object CMakeFiles/s2wasm.dir/src/tools/s2wasm.cpp.o
[ 91%] Building CXX object CMakeFiles/s2wasm.dir/src/wasm-emscripten.cpp.o
[ 92%] Building CXX object CMakeFiles/s2wasm.dir/src/wasm-linker.cpp.o
[ 93%] Linking CXX executable bin/s2wasm
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 93%] Built target s2wasm
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target wasm-dis
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 94%] Building CXX object CMakeFiles/wasm-dis.dir/src/tools/wasm-dis.cpp.o
[ 95%] Linking CXX executable bin/wasm-dis
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 95%] Built target wasm-dis
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target wasm2asm
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 96%] Building CXX object CMakeFiles/wasm2asm.dir/src/tools/wasm2asm.cpp.o
[ 97%] Linking CXX executable bin/wasm2asm
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[ 97%] Built target wasm2asm
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
Scanning dependencies of target wasm-ctor-eval
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[4]: Entering directory '/home/pc/wasmdec/src/binaryen'
[ 98%] Building CXX object CMakeFiles/wasm-ctor-eval.dir/src/tools/wasm-ctor-eval.cpp.o
[100%] Linking CXX executable bin/wasm-ctor-eval
make[4]: Leaving directory '/home/pc/wasmdec/src/binaryen'
[100%] Built target wasm-ctor-eval
make[3]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[2]: Leaving directory '/home/pc/wasmdec/src/binaryen'
make[1]: Leaving directory '/home/pc/wasmdec'
make installBinaryen
make[1]: Entering directory '/home/pc/wasmdec'
if [ -d "/usr/lib64" ]; then cp src/binaryen/lib/libbinaryen.so /usr/lib64/; else cp src/binaryen/lib/libbinaryen.so /usr/lib/; fi
make[1]: Leaving directory '/home/pc/wasmdec'
make default
make[1]: Entering directory '/home/pc/wasmdec'
Build source src/WasmUtils.cc
g++ -g -std=c++14 -Isrc/binaryen/src -c -Wall src/WasmUtils.cc -o src/WasmUtils.o
src/WasmUtils.cc: In static member function ‘static wasm::FunctionType* wasmdec::util::resolveFType(wasm::Module*, wasm::Name)’:
src/WasmUtils.cc:5:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < m->functionTypes.size(); ++i) {
                    ^
src/WasmUtils.cc: In static member function ‘static std::__cxx11::string wasmdec::util::getLiteralValue(wasm::Literal*)’:
src/WasmUtils.cc:51:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
Build source src/WasmContext.cc
g++ -g -std=c++14 -Isrc/binaryen/src -c -Wall src/WasmContext.cc -o src/WasmContext.o
Build source src/Emitter.cc
g++ -g -std=c++14 -Isrc/binaryen/src -c -Wall src/Emitter.cc -o src/Emitter.o
Build source src/main.cc
g++ -g -std=c++14 -Isrc/binaryen/src -c -Wall src/main.cc -o src/main.o
Build source src/CodeGen.cc
g++ -g -std=c++14 -Isrc/binaryen/src -c -Wall src/CodeGen.cc -o src/CodeGen.o
Build source src/convert/Conversion.cc
g++ -g -std=c++14 -Isrc/binaryen/src -c -Wall src/convert/Conversion.cc -o src/convert/Conversion.o
src/convert/Conversion.cc: In static member function ‘static std::__cxx11::string wasmdec::Convert::getDecl(wasm::FunctionType*, std::__cxx11::string)’:
src/convert/Conversion.cc:171:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < typ->params.size(); ++i) {
                    ^
src/convert/Conversion.cc:175:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (i != (typ->params.size() - 1)) {
         ^
src/convert/Conversion.cc: In static member function ‘static std::__cxx11::string wasmdec::Convert::getDecl(wasm::FunctionType*, wasm::Name)’:
src/convert/Conversion.cc:188:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < typ->params.size(); ++i) {
                    ^
src/convert/Conversion.cc:192:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (i != (typ->params.size() - 1)) {
         ^
src/convert/Conversion.cc: In static member function ‘static std::__cxx11::string wasmdec::Convert::getDecl(wasm::Function*)’:
src/convert/Conversion.cc:205:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < fn->params.size(); ++i) {
                    ^
src/convert/Conversion.cc:209:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (i != (fn->params.size() - 1)) {
         ^
src/convert/Conversion.cc: In static member function ‘static std::__cxx11::string wasmdec::Convert::parseOperandList(wasmdec::Context*, wasm::ExpressionList*, int)’:
src/convert/Conversion.cc:246:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < list->size(); ++i) {
                     ^
src/convert/Conversion.cc:250:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (i != (list->size() - 1)) {
          ^
src/convert/Conversion.cc: In static member function ‘static std::__cxx11::string wasmdec::Convert::getUnary(std::__cxx11::string, wasm::UnaryOp)’:
src/convert/Conversion.cc:263:9: warning: enumeration value ‘ExtendS8Int32’ not handled in switch [-Wswitch]
  switch (op) {
         ^
src/convert/Conversion.cc:263:9: warning: enumeration value ‘ExtendS16Int32’ not handled in switch [-Wswitch]
src/convert/Conversion.cc:263:9: warning: enumeration value ‘ExtendS8Int64’ not handled in switch [-Wswitch]
src/convert/Conversion.cc:263:9: warning: enumeration value ‘ExtendS16Int64’ not handled in switch [-Wswitch]
src/convert/Conversion.cc:263:9: warning: enumeration value ‘ExtendS32Int64’ not handled in switch [-Wswitch]
src/convert/Conversion.cc: In static member function ‘static std::__cxx11::string wasmdec::Convert::resolveType(wasm::WasmType)’:
src/convert/Conversion.cc:164:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
src/convert/Conversion.cc: In static member function ‘static std::__cxx11::string wasmdec::Convert::getHostFunc(wasm::HostOp)’:
src/convert/Conversion.cc:359:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
Build source src/convert/BlockConverter.cc
g++ -g -std=c++14 -Isrc/binaryen/src -c -Wall src/convert/BlockConverter.cc -o src/convert/BlockConverter.o
src/convert/BlockConverter.cc: In static member function ‘static std::__cxx11::string wasmdec::Convert::getFuncBody(wasmdec::Context, bool)’:
src/convert/BlockConverter.cc:23:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < vars->size(); ++i) {
                     ^
Build source src/convert/ExpressionParser.cc
g++ -g -std=c++14 -Isrc/binaryen/src -c -Wall src/convert/ExpressionParser.cc -o src/convert/ExpressionParser.o
Link wasmdec
g++ -Lsrc/binaryen/lib -lbinaryen src/WasmUtils.o src/WasmContext.o src/Emitter.o src/main.o src/CodeGen.o src/convert/Conversion.o src/convert/BlockConverter.o src/convert/ExpressionParser.o -o wasmdec
src/CodeGen.o: In function `wasmdec::CodeGenerator::CodeGenerator(std::vector<char, std::allocator<char> >*, bool, bool)':
/home/pc/wasmdec/src/CodeGen.cc:13: undefined reference to `wasm::WasmBinaryBuilder::read()'
src/CodeGen.o: In function `Colors::normal(std::ostream&)':
/home/pc/wasmdec/src/binaryen/src/support/colors.h:27: undefined reference to `Colors::outputColorCode(std::ostream&, char const*)'
src/CodeGen.o: In function `Colors::red(std::ostream&)':
/home/pc/wasmdec/src/binaryen/src/support/colors.h:28: undefined reference to `Colors::outputColorCode(std::ostream&, char const*)'
src/CodeGen.o: In function `Colors::magenta(std::ostream&)':
/home/pc/wasmdec/src/binaryen/src/support/colors.h:29: undefined reference to `Colors::outputColorCode(std::ostream&, char const*)'
src/CodeGen.o: In function `Colors::green(std::ostream&)':
/home/pc/wasmdec/src/binaryen/src/support/colors.h:32: undefined reference to `Colors::outputColorCode(std::ostream&, char const*)'
collect2: error: ld returned 1 exit status
Makefile:11: recipe for target 'wasmdec' failed
make[1]: *** [wasmdec] Error 1
make[1]: Leaving directory '/home/pc/wasmdec'
Makefile:38: recipe for target 'all' failed
make: *** [all] Error 2
pc@pc:~/wasmdec$ 

Missing binaryen; install/building doesn't work as described on https://github.com/wwwg/wasmdec

Description:

To build wasmdec and install all of it's dependencies, run sudo make all in the wasmdec directory. GCC 7 or higher is reccomended.

Reality:

christian@LAPTOP-SQ88UE9K:~/wasmdec$ sudo make all
make binaryen
make[1]: Entering directory '/home/christian/wasmdec'
cd src/binaryen && cmake . && make
/bin/sh: 1: cd: can't cd to src/binaryen
Makefile:27: recipe for target 'binaryen' failed
make[1]: *** [binaryen] Error 2
make[1]: Leaving directory '/home/christian/wasmdec'
Makefile:39: recipe for target 'all' failed
make: *** [all] Error 2

Did git clone https://github.com/wwwg/wasmdec.git --recursive of course

binaryen is missing in src.

Using Release Feature of Github

Thank you for the awesome work your doing.

Would be really if we can download the builded releases so we don't have to compile them and we can track new versions.

Thank you.

recompile

$ LANG= gcc wasmdec_decompiled.c

wasmdec_decompiled.c: In function 'enlargeMemory':
wasmdec_decompiled.c:118:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'extern'
 extern int abortOnCannotGrowMemory()
 ^~~~~~
wasmdec_decompiled.c:439:1: error: parameter 'global$1' is initialized
 int global$1 = gimport$5;
 ^~~
wasmdec_decompiled.c:440:1: error: parameter 'global$2' is initialized
 int global$2 = gimport$6;
 ^~~
wasmdec_decompiled.c:441:1: error: parameter 'global$3' is initialized
 int global$3 = gimport$7;
 ^~~
wasmdec_decompiled.c:442:1: error: parameter 'global$4' is initialized
 int global$4 = gimport$8;
 ^~~
wasmdec_decompiled.c:443:1: error: parameter 'global$5' is initialized
 int global$5 = gimport$9;
 ^~~
wasmdec_decompiled.c:444:1: error: parameter 'global$6' is initialized
 int global$6 = 0;
 ^~~
wasmdec_decompiled.c:445:1: error: parameter 'global$7' is initialized
 int global$7 = 0;
 ^~~
wasmdec_decompiled.c:446:1: error: parameter 'global$8' is initialized
 int global$8 = 0;
 ^~~
wasmdec_decompiled.c:447:1: error: parameter 'global$9' is initialized
 int global$9 = 0;
 ^~~
wasmdec_decompiled.c:448:1: error: parameter 'global$10' is initialized

cp: external/binaryen/lib/libbinaryen.so: No such file or directory

when i make on Mac, i got this error:
make installBinaryen if [ -d "/usr/lib64" ]; then cp external/binaryen/lib/libbinaryen.so /usr/lib64/; else cp external/binaryen/lib/libbinaryen.so /usr/lib/; fi cp: external/binaryen/lib/libbinaryen.so: No such file or directory make[1]: *** [installBinaryen] Error 1 make: *** [all] Error 2

Makefile is broken

Hello,

In the Makefile of wasmdec, while compiling binayren, it fails because you are trying to : cd src/binayren

The folder for me exists in external/.

Thank you.

decompilation fails

working on Linux

outputs: "wasmdec: Code generation failed, aborting." even from simple example from read.me of this repo.
How to fix?

What?

I can never get anything to work, this is so aggravating. Please help.

EDIT: I ran "make all" to install all of the dependencies.

Screenshot_20240110-112731

Create NPM package

I think it would be very cool if the JS version could be packed into a NPM module so it can be used in nodeJS applications

WebAssembly Spec compliance for instructions

Hi, I just saw your project on WasmWeekly! I worked on something similar here, and there's a wasm-to-rust converter here too that you may be interested in.

One thing I noticed is that you aren't currently handling traps. It will be hard to pass the WebAssembly spec testsuite without those.

There are some instructions that have subtle behaviors as well; in particular, most of the floating point instructions map to C instructions or math functions, but min/max have different behavior with NaNs. I've also found that MSVC on 64-bit architectures will be slightly off for some values on the uint64-to-float and uint64-to-double conversions. Another thing to watch out for: WebAssembly doesn't work properly with x87 floating point instructions, and requires SSE2 instructions instead. This mostly only becomes an issue on MSVC for 32-bit architectures where the calling convention still may pass floating point values using x87 registers even when you enable SSE2. You can use the __vectorcall calling convention to work around that.

The spec tests will cover most of these behaviors. They're written using the .wast testing format, including assertions and multiple modules. You can use wabt's wast2json tool to convert them to a single JSON file of assertions with a .wasm files for each module.

Compile error: src/wasm/WasmUtils.cc:30:8: error: ‘WasmType’ has not been declared

When I compile this program, I get this error.

src/wasm/WasmUtils.cc:30:8: error: ‘WasmType’ has not been declared
case WasmType::none:
^~~~~~~~
src/wasm/WasmUtils.cc:31:8: error: ‘WasmType’ has not been declared
case WasmType::unreachable:
^~~~~~~~
src/wasm/WasmUtils.cc:34:8: error: ‘WasmType’ has not been declared
case WasmType::i32:
^~~~~~~~
src/wasm/WasmUtils.cc:38:8: error: ‘WasmType’ has not been declared
case WasmType::i64:
^~~~~~~~
src/wasm/WasmUtils.cc:42:8: error: ‘WasmType’ has not been declared
case WasmType::f32:
^~~~~~~~
src/wasm/WasmUtils.cc:46:8: error: ‘WasmType’ has not been declared
case WasmType::f64:
^~~~~~~~

gcc/g++ version 7.2
DISTRIB_ID=Kali
DISTRIB_RELEASE=kali-rolling
DISTRIB_CODENAME=kali-rolling

Thank you!

Decompiled source doesn't compile

I created an empty C program (main.c) and compiled it to wasm (empty.wasm) with command:

emcc main.c -o empty.js

And then tried to decompile that wasm file:

wasmdec empty.wasm

The result file (out.c) doesn't compile and shows a lot of errors.

All the specified files are in the attached files.zip file.

I used latest versions of emcc and wasmdec.

files.zip

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.