WebAssembly,如何分析wasm导出函数?反编译wasm
发布于 作者:苏南大叔 来源:程序如此灵动~

本文不涉及wasm
文件的编译,这里假设通过某种编程语言的编译手段,已经得到了一个build/optimized.wasm
文件。那么,如何使用这个wasm
文件里面的导出函数呢?首要的问题就是:对这个wasm
文件的导出函数进行分析。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,node@20.18.0
,@assemblyscript/loader 0.27.34
,wabt@1.0.36
。
前文回顾
如果手里没有合适的标的物release.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
也不安全啊。官方都出了反编译工具,完美在源码格式里面游玩。


