跳到正文

WebAssembly 分析

WebAssembly Inspector

列出 .wasm 模块的导入、导出、内存和各段大小,并打印它的文本格式。

打开一个 `.wasm` 文件,显示里面有什么:各段及其大小、每个导入和导出、内存和表的声明,以及构建保留了的话 name 段里的函数名。模块只被解析,从不实例化或运行。

🔒 完全在你的浏览器里运行wasminspectbinary

把 .wasm 模块拖进来

在这个标签页里解析:只查看模块,绝不实例化,也不运行。

读的是二进制结构——节、类型、导入、导出、内存、name 自定义节——再把整个模块拿去和浏览器自己的 WebAssembly.validate 核对一遍。函数体只量大小,不反汇编:这里显示的是模块声明了什么、碰了什么,不是完整的文本格式转换。

怎么用

  1. 把模块拖进来

    任何 `.wasm` 文件。它在这个标签页里读取,并和浏览器自己的 `WebAssembly.validate` 交叉核对,所以关于它是否格式良好你能得到第二意见。

  2. 先看各段

    大小表是看字节花在哪里最快的办法——大的 data 段意味着内嵌的资源,大的自定义段通常是调试名称或 DWARF。

  3. 读导入

    导入是模块和宿主之间的全部契约——它能调用的每个函数、共享的每块内存。如果你在审计一个不是你构建的模块,要紧的就是这个列表。

常见问题

我能看到实际的代码吗?

不能。函数体只量大小,不反汇编——这里报告的是模块声明和触及了什么,而不是把它转成文本格式。完整反汇编要用 WABT 工具包里的 `wasm2wat`。

为什么函数名没了?

因为构建去掉了 name 自定义段,发布构建通常就是这么做的。导出无论如何保留名字——它们是模块接口的一部分——所以导出的函数仍然可以识别。

有导入的模块危险吗?

本身不危险——WebAssembly 只能触及宿主交给它的东西,没有导入的模块根本碰不到外部世界。导入列出的正是它能做的事,所以实例化某个东西之前值得先读一读。

引擎校验说无效,但它解析成功了。

两者检查的是不同的东西。解析读的是结构;`WebAssembly.validate` 还会对每个函数体做类型检查。一个模块可以有完全可读的段布局却仍被拒绝——一个被截断的文件,或者一个改写了不该改的字节的后处理步骤。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。