Lua getmetatable() 锁定表

问题描述 投票:0回答:3

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

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

lua lua-table roblox metatable
3个回答
3
投票

这至少适用于 lua 5.3

在lua中可以使用调试库方法

debug.getmetatable
。无论
__metatable
元方法如何,都应该返回原始元表。 在 C 中,您可以使用函数
lua_getmetatable
来达到同样的目的。

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

此外,如果您使用了

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


2
投票

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

ROBLOX 也摆脱了调试库中的所有功能,但最近添加了

debug.traceback
,所以
debug.getmetatable
绝对 不可能的。

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

1) 如果要设置实例的元表,请使用自己的表创建一个假实例,然后使用

__index
__newindex
来控制对对象属性和方法的访问

2) 如果你想设置的元表,我们遵循与1中相同的方法,创建一个假表并使用

__index
来索引旧表。

3) 如果您想设置全局环境的元表,请使用预先存在的元表设置一个新环境。确保使用

__index
,这样其他变量仍然有效!

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

除此之外,如果您锁定自己的表,正如前面提到的,一种访问元表的方法。只需“存储对其的引用”即可。最好的方法是在 meta 作用域块中创建一个名为 do

局部变量

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


0
投票
xpcall

debug.info
来读取游戏的元表,但是由于明显的安全原因,您
无法覆盖
它。

© www.soinside.com 2019 - 2024. All rights reserved.