V8 开发人员提出了 WebAssembly 的反编译器

V8 JavaScript 引擎的开发人员 已提交 效用 wasm反编译,它允许您反编译中间二进制表示 WebAssembly 变成一种可读的伪语言,让人想起 JavaScript 和 C。 所提出的伪语言比“.wat”格式的 WebAssembly 文本表示更容易理解,更适合手动解析,“.wat”格式更接近汇编语言而不是高级语言。 在这种情况下,反编译尽可能完整地反映 Wasm 表示。

反编译器 切换到 包含在工具包中 WABT,它提供 WebAssembly 的二进制和文本表示之间的转换,以及 wasm 文件的解析、处理、修改和验证。 WABT 还在开发一个实用程序 瓦斯姆2c,它允许将 wasm 文件反编译为可由 C 编译器编译的等效 C 代码,但在可读性方面与“wat”的文本表示没有太大区别。

例如wasm中编译的原始C函数

typedef 结构体 { float x, y, z; } vec3;

浮点(const vec3 *a,const vec3 *b){
返回 a->x * b->x +
a->y * b->y +
a->z * b->z;
}

将被 wasm-decompile 实用程序反编译为伪语言

函数点(a:{ a:float, b:float, c:float },
b:{ a:float, b:float, c:float }):float {
返回 aa * ba + ab * bb + ac * bc
}

而转换为文本格式“.wat”看起来像这样

(func $dot (类型 0) (参数 i32 i32) (结果 f32)
(f32.添加
(f32.添加
(f32.mul
(f32.负载
(本地.get 0))
(f32.负载
(本地.获取1)))
(f32.mul
(f32.负载偏移=4
(本地.get 0))
(f32.负载偏移=4
(本地.获取1))))
(f32.mul
(f32.负载偏移=8
(本地.get 0))
(f32.负载偏移=8
(本地.get 1))))))

来源: opennet.ru

添加评论