[译]什么是 WebAssembly table imports?

news/2024/7/5 11:34:26

原文链接: https://fanmingfei.com/posts/...

这是系列文章第三篇:

  • 使用 JavaScript 创建一个 WebAssembly 模块的实例。

  • WebAssembly 中的 Memory

  • 什么是 WebAssembly table?


在第一篇文章中,我介绍了 WebAssembly 可以导入的四中不同的类型。

  • values

  • function

  • memory

  • tables

最后一个可能有点陌生。什么是 table import,它有什么用呢?

有时在程序中,你想要有一个变量指向一个函数,就像一个回调。然后你可以把它传递给其他的方法。

Defining a callback and passing it into a function

在 C 语言中,这叫做函数指针。函数存在内存中。变量,函数指针,只是指向该内存地址。

Function pointer at memory address 4 points to the callback at memory address 1

如果需要,以后可以将变量指向一个不同的函数。这应该是一个熟悉的概念。

Function pointer at memory address 4 changes to point to callback2 at memory address 4

在 web 页面中,所有的方法都是 JavaScript 对象而且由于它们是 JavaScript 对象,所以它们存在于 WebAssembly 内存之外的内存地址中。

JS function living in JS managed memory

如果我们想要一个指向其中一个函数的变量,我们需要把它的地址放在我们的内存中。

Function pointer in WebAssembly memory pointing to function

保证网页安全的一部分是保证内存地址的不可见。你不希望页面上的代码可以看到或操作这些内存地址。如果页面上有恶意代码,它可以使用修改内存来创建漏洞。

例如,它可能会更改你的内存地址,以指向不同的内存位置。

那么当你尝试调用这个函数的时候,你会加载攻击者给你的内存地址。

Malicious actor changing the address in WebAssembly memory to point to malicious code

可能是以某种方式插入到内存中的恶意代码,可能嵌入到字符串中。

Tables 可能实现类似函数指针的东西,这样不容易受到这些攻击的影响。

Table 是存在于 WebAssembly 内存之外的数组。它的值是对函数的引用。

Another region of memory is added, distinct from WebAssembly memory, which contains the function pointer

这些引用包含内存地址,但由于它不在 WebAssembly 的内存中,WebAssembly 不能看到这些地址。

但它确实可以访问数组索引。

All memory outside of the WebAssembly memory object is obfuscated

如果 WebAssembly 模块想要调用这些函数,它将该索引传递给一个名为call_indirect的操作。这样就可以调用函数了。

call_indirect points to the first element of the obfuscated array, which in turn points to the function

现在,Table 的用例非常有限。它被添加到用于支持函数指针的规范中,因为C/C++非常依赖函数指针。

所以,当前唯一可以使用table来引用的只有函数但是随着WebAssembly扩展的功能,例如,当添加对DOM的直接访问时,你可能将会看到Table上存储着其他的类型的引用,和除了call_indirect之外的操作。

About

Lin Clark


http://www.niftyadmin.cn/n/2896454.html

相关文章

c语言程序与设计教学设计,《C语言程序设计》授课教案1

《C语言程序设计》授课教案1 C语言程序设计课程性质:大学生公共必修课学习时间: 1学期课堂教学 :36课时机房实习 :72课时计分方式:平时成绩: 40%期终考试: 60% 本书主要内容介绍 C语言 的•数据类型、运算符和表达式•…

Spring Boot flyway的启动时机比较早

flyway,如果已经创建的版本V1中已经更新,则会validation报错 at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) Caused by: org.flywaydb.core.api.FlywayException: Validate failed. Migration Checksum m…

Laravel 服务容器,IoC,DI

DI DI 就是常说的依赖注入,那么究竟什么是依赖注入呢? 打个比方,电脑(非笔记本哈)需要键盘和鼠标我们才能进行操作,这个‘需要’换句话说就是‘依赖’键盘和鼠标。 那么,相应的,一个…

echarts如何修改数据视图dataView中的样式

做了一个现实折线图的图表,通过右上角icon可以自由切换成柱状图,表格。在表格中遇到的一点小问题,解决方案如下: 1、场景重现 这是一个显示两个折线图的图表,一切看起来都很顺利。但是点击红色箭头所指的图标&#xff…

c语言贪吃蛇地图自动打印,架构练习:c语言实现贪吃蛇(一):画地图和蘑菇...

目前只是画地图,和根据当前时间随机生成蘑菇下一步:(1)实现类似于top的刷新方法(2)实现蛇的行走(3)实现蛇吃蘑菇的合并及新蘑菇的生成(4)实现架构的修改和优化rootubuntu:/mnt/shared/appbox/snake# cat snake.c#include #include #include #include #in…

codis集群和redis cluster的优劣对比

1、codis架构如下:(1)Codis是一整套缓存解决方案,包含高可用、数据分片、监控、动态扩态 etc.。走的是 Apps->代理->redis cluster,一定规模后基本都采用这种方式。(2)Codis引入了Group的…

cogs426血帆海盗(网络流打法)

这道题基本上来就能看的出来是网络流但难点在于它的结果貌似与最大流,最小割都没啥关系,我猜不少萌新像我一样想暴力枚举边(要是考试我就真这么做了),但很明显,出题人没打算让你这么水过,100000…

c#与lua交互里,错误处理

如果是c#代码出错了 [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))] static int _g_get_down(RealStatePtr L) { try { ObjectTranslator translator ObjectTranslatorPool.Instance.Find(L); translator.PushUnityEngineVector3(L, UnityEngine.Vector3.down); } ca…