WebAssembly,如何分析wasm导出函数?反编译wasm
发布于 作者:苏南大叔 来源:程序如此灵动~
本文不涉及wasm文件的编译,这里假设通过某种编程语言的编译手段,已经得到了一个build/optimized.wasm文件。那么,如何使用这个wasm文件里面的导出函数呢?首要的问题就是:对这个wasm文件的导出函数进行分析。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10,node@20.18.0,@assemblyscript/loader 0.27.34,wabt@1.0.36。
前文回顾
如果手里没有合适的标的物build/optimized.wasm文件,那么,可以参考上一篇文章,拿到一个导出函数为add(a,b)和add2(a,b)的wasm文件。参考文章:
方案一,node
npm i @assemblyscript/loader --save使用node执行analyzeWasm.js文件,代码如下:
const fs = require('fs');
const loader = require('@assemblyscript/loader');
async function analyzeWasm() {
const wasmBuffer = fs.readFileSync(__dirname + '/build/optimized.wasm');
const wasmModule = await WebAssembly.instantiate(wasmBuffer, { /* imports */ });
const exports = wasmModule.instance.exports;
console.log('Exported functions:');
for (const key of Object.keys(exports)) {
console.log(key);
}
}
analyzeWasm().catch(console.error);执行这个文件,就可以拿到导出函数列表了。如下图所示:
Exported functions:
add
add2
memory
然而,这样操作的结果,其实只是拿到了函数名称,并没有拿到参数列表。
方案二,wabt反编译
使用webassembly官方出品的wabt工具。下载地址:

在bin目录下,存在着如下几个可用工具:
- wasm2wat.exe
- wasm2c.exe
- wasm-decompile.exe
参考命令:
wasm-decompile.exe optimized.wasm -o source.ts或者:
wasm-decompile.exe optimized.wasm一切疑问都不存在了。因为完美的还原出来了源码...

当然,如果读者习惯看.c或者.wat的源码,使用另外两个工具即可,参数一致。
结语
本文的结论是:看来webassembly也不安全啊。官方都出了反编译工具,完美在源码格式里面游玩。