Lua getmetatable() 一个锁定的table

Lua getmetatable() a locked table

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

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

这至少适用于 lua 5.3

在lua中可以使用调试库方法debug.getmetatable。不管 __metatable 元方法如何,这应该是 return 原始元表。 在 C 中,您可以使用函数 lua_getmetatable 达到相同的目的。

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

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

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

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

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

1) 如果要设置 实例 的元数据 table,请使用您自己的实例创建一个假实例table,然后使用__index__newindex来控制对对象的属性和方法的访问

2) 如果你想设置的metatable,我们遵循与1,创建一个假的 table 并使用 __index 索引旧的 table.

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

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

除此之外,如果您锁定自己的 table,如前所述, 的一种方法访问元table。只需 存储一个引用 到它。最好的方法是在 do 范围块中创建一个名为 meta 局部变量

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