0

在 lua 编程语言中,我知道可以通过元方法 __metatable 锁定 userdata 的元表,这样就没有人可以通过 getmetatable() 函数查看 userdata 的元表。但是,我仍然想在它被锁定后访问那个元表。所以,我的问题是,在用户数据的元表被锁定之后,是否仍然有可能(可能通过一些后门)仍然可以获得锁定的用户数据的元表,或者它是不可能的(如果是这样,那么原因是什么)?

编辑#1:我想知道这一点的动机是因为我试图找到一个进入 Roblox API 的后门,以便我可以更有效地编写我的游戏。

4

2 回答 2

3

您已经声明您正在使用 ROBLOX。仔细想想,他们锁定这些东西是有原因的。为什么?安全目的。允许脚本编写者访问这些东西是危险的并且构成严重威胁。所以答案是否定的,一旦被锁定,没有引用就无法回到元表,因为如果有锁定将毫无意义。

ROBLOX 也去掉了 debug 库中的所有函数,但是最近添加的debug.traceback, so肯定debug.getmetatable是不行的。

但是,根据您对此的推理,还有其他方法可以完成任务。我将在这里介绍其中的一些:

1)如果你想设置一个实例的元表,用你自己的表做一个假实例,然后用__indexand__newindex来控制对对象的属性和方法的访问

2)如果要设置库的元表,我们按照与1中相同的方法,创建一个假表并用于__index索引旧表。

3)如果要设置全局环境的元表,请使用预先存在的元表设置一个新的元表。确保使用__index,以便其他变量仍然有效!

至于简单地阅读元表,不,你不能这样做。

除此之外,如果您锁定自己的表,如前所述,还有一种访问元表的方法。只需存储对它的引用。最好的方法是在作用域块中创建一个局部变量metado

我希望这能回答你的问题,我试图专门针对 ROBLOX,因为这就是你的问题。

于 2016-03-15T02:56:54.430 回答
2

这至少适用于 lua 5.3

在 lua 中,您可以使用调试库方法debug.getmetatable。无论元方法如何,这都应该返回原始元表__metatable。在 C 中,您可以将函数lua_getmetatable用于相同目的。

此外,您始终可以在存储元表的某个地方创建一个变量,以后可以通过该变量访问它。

此外,如果您使用luaL_newmetatable,那么您仍然可以在注册表中使用您使用的元表名称找到元表。

于 2016-03-13T20:50:24.133 回答