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() 锁定表的主要内容,如果未能解决你的问题,请参考以下文章