Introduction to WebAssembly

💡 原文英文,约900词,阅读约需3分钟。
📝

内容提要

本文介绍了JavaScript和WebAssembly(wasm)混合编程的基础知识,包括调用wasm函数和输出字符串常量。还提供了wat2wasm和wasm2wat等工具和资源,用于转换和反汇编wasm。同时介绍了在Chrome浏览器中调试wasm的方法和相关工具。最后提到了WebAssembly System Interface(WASI)和版权声明。

🔎

延伸解读

逆向视角下的wasm学习路径

本文面向有二进制逆向基础但未接触过前端逆向的技术人员,直接通过实践示例科普wasm。作者强调,对于前端逆向,需要研究的是wasm本身,而非解释执行wasm的引擎;后者是挖掘浏览器0day的安全人员的研究范畴。这种定位有助于读者明确学习方向,避免混淆不同层面的技术重点。

wat与C编译的差异及局限

文章通过hello示例对比了wat和C两种实现方式。用wat编程类似汇编,适合临时修改;而C语言更适合编写框架代码,但编译生成的wasm与wat版本并不完全等价,例如C版本会多出table和global定义。作者还指出,用C语言无法让常量字符串出现在任意偏移,如偏移0处,这反映了wasm-ld工具的限制。

wasm调试与反编译工具链

在Chrome中调试wasm时,可在Sources面板以wat格式查看代码,设置断点并单步执行,调用栈能无缝衔接js和wasm函数。反汇编工具包括wasm2wat和wasm-objdump,但无法显示CFG;IDA插件idawasm经小改后可用,能识别函数块和字符串交叉引用。反编译方面,wasm-decompile生成可读伪码,wasm2c结合IDA或Ghidra插件也能辅助分析,但各有局限。

❓

Q&A

WebAssembly是什么?

WebAssembly是一种可移植的二进制格式,旨在提高Web应用程序的性能,允许在浏览器中运行高效的代码。

如何在JavaScript中调用WebAssembly函数?

可以通过创建一个导入对象,将JavaScript函数传递给WebAssembly实例,然后调用WebAssembly导出的函数来实现。

有哪些工具可以用于WebAssembly的转换和反汇编?

常用的工具包括wat2wasm、wasm2wat、wasm-objdump和wasm-decompile等。

如何在Chrome浏览器中调试WebAssembly?

可以使用Chrome的开发者工具,在Sources面板中设置断点和单步调试wasm代码。

WebAssembly System Interface(WASI)是什么?

WASI是WebAssembly的系统接口,旨在为WebAssembly提供与操作系统交互的能力。

如何将C代码编译为WebAssembly?

可以使用wasi-sdk中的clang编译器,通过指定相关参数将C代码编译为WebAssembly格式。

🏷️

标签

➡️

继续阅读