混淆webassembly的二进制代码结构

Confusing on webassembly's binary code structure

我正在尝试根据 webassembly 的模块结构文档来识别 wasm 二进制模块的每个部分。我已经完成了一部分识别,如下所示:

screenshot

红色代码被标记为"magic code";

深橙色代码被标记为 "version number";

浅黄色代码被标记为第一部分的"id";

深绿色的代码被标记为"payload length",格式为"varuint7";

我不确定如何识别接下来的部分,有点迷惑"payload data"是哪部分?官方文档中写的"The end of the last present section must coincide with the last byte of the module."是什么意思。

我建议查看现有的 WebAssembly 二进制解析器以帮助理解。这里是 the WebKit one.

每个部分都以特定于部分的方式解码,详见 in the binary format documents。您查看 idpayload_length,然后根据部分 ID 解码相应的部分。该页面的部分编号为:

  1. 类型
  2. 导入
  3. 函数
  4. Table
  5. 内存
  6. 全球
  7. 导出
  8. 开始
  9. 元素
  10. 代码
  11. 数据

此外,0 是 "custom"。

转到每个部分的描述以了解如何对其进行解码。

"The end of the last present section must coincide with the last byte of the module." 表示如果你解码一个部分,并且解码的长度与有效载荷数据不匹配,那么这是一个验证错误。