我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

本文不涉及wasm文件的编译,这里假设通过某种编程语言的编译手段,已经得到了一个build/optimized.wasm文件。那么,如何使用这个wasm文件里面的导出函数呢?首要的问题就是:对这个wasm文件的导出函数进行分析。

苏南大叔:WebAssembly,如何分析wasm导出函数?反编译wasm - 分析未知wasm导出函数
WebAssembly,如何分析wasm导出函数?反编译wasm(图4-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10node@20.18.0@assemblyscript/loader 0.27.34wabt@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

苏南大叔:WebAssembly,如何分析wasm导出函数?反编译wasm - 分析导出函数
WebAssembly,如何分析wasm导出函数?反编译wasm(图4-2)

然而,这样操作的结果,其实只是拿到了函数名称。并没有拿到参数列表。

方案二,wabt反编译

使用webassembly官方出品的wabt工具。下载地址:

苏南大叔:WebAssembly,如何分析wasm导出函数?反编译wasm - 反编译工具
WebAssembly,如何分析wasm导出函数?反编译wasm(图4-3)

bin目录下,存在着如下几个可用工具:

  • wasm2wat.exe
  • wasm2c.exe
  • wasm-decompile.exe

参考命令:

wasm-decompile.exe optimized.wasm -o source.ts

或者:

wasm-decompile.exe optimized.wasm

一切疑问都不存在了。因为完美的还原出来了源码...

苏南大叔:WebAssembly,如何分析wasm导出函数?反编译wasm - 反编译结果
WebAssembly,如何分析wasm导出函数?反编译wasm(图4-4)

当然,如果读者习惯看.c或者.wat的源码,使用另外两个工具即可,参数一致。

结语

本文的结论是:看来webassembly也不安全啊。官方都出了反编译工具,完美在源码格式里面游玩。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   wasm