Lua getmetatable() 锁定表

Posted

技术标签:

【中文标题】Lua getmetatable() 锁定表【英文标题】:Lua getmetatable() a locked table 【发布时间】:2016-06-28 18:24:09 【问题描述】:

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

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

【问题讨论】:

为什么会被锁定?这个问题的一些动机会有所帮助。 但是,如果我说明原因,那么我会因为从各个角度都没有完美写出的措辞而遭到反对:) 如果您说明原因,您可能会收到有关实现实际目标的更好方法的建议。 我希望更多的人能提供更多这样的帮助 如果你不给我们足够的信息,我们就不可能。 【参考方案1】:

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

ROBLOX 也去掉了调试库中的所有函数,但是最近添加的debug.traceback,所以debug.getmetatable绝对不可能。 p>

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

1)如果你想设置一个instance的metatable,用你自己的表做一个fake instance,然后使用__index__newindex来控制对对象的属性和方法的访问

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

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

至于只是读取元表,不,你不能这样做。

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

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

【讨论】:

【参考方案2】:

这至少适用于 lua 5.3

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

你也可以在某个地方创建一个变量到你存储元表的地方,以后可以通过该变量访问它。

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

【讨论】:

以上是关于Lua getmetatable() 锁定表的主要内容,如果未能解决你的问题,请参考以下文章

Lua 中服务器之间的共享队列

Lua metatable变量

防止多次执行 Lua 脚本

MySQL存储引擎 -- MyISAM(表锁定) 与 InnoDB(行锁定) 锁定机制

MySQL行表锁定

UE4 Unlua源码解析1 - 读源码的前置知识