Lua中的getmetatable()函数和锁定表

在lua编程语言中,我知道您可以使用元方法__metatable锁定userdata的元表,以便任何人都无法使用getmetatable()函数查看userdata的元表。但是,我仍然想要访问已锁定的元表。因此,我的问题是,在锁定userdata的元表之后,是否仍然有可能(也许通过一些后门)获取已锁定的userdata的元表,或者是不可能的(如果是这样,那么是为什么)?

编辑#1: 我想知道这个问题的原因是因为我正在尝试找到进入Roblox API的后门,以便更有效地编写我的游戏脚本。

点赞
用户3586583
用户3586583

这至少适用于lua 5.3。

在lua中,您可以使用调试库方法debug.getmetatable。它应该返回原始的metatable而不受__metatable元方法的影响。 在C中,您可以使用功能lua_getmetatable完成相同的目的。

此外,您始终可以在某处创建一个变量来存储metatable,并稍后通过该变量访问它。

而且,如果您使用luaL_newmetatable,则仍然可以通过您使用的metatable名称在注册表中找到metatable。

2016-03-13 20:50:24
用户3979429
用户3979429

你说你使用 ROBLOX。仔细想想,他们之所以锁定这些内容,是有一定的安全考虑的。允许脚本作者访问此类内容是危险的,会带来严重威胁。因此,答案是否定的,一旦被锁定,就没有办法重新访问元表,除非有引用,否则锁将没有意义。

ROBLOX 还删除了调试库中的所有函数,但最近增加了 debug.traceback,因此绝对不能使用 debug.getmetatable

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

  1. 如果要设置 实例 的元表,则使用您自己的表创建一个虚拟实例,然后使用 __index__newindex 来控制对象的属性和方法。

  2. 如果要设置 的元表,则遵循和 1 相同的方法,创建一个虚拟表并使用 __index 索引旧表。

  3. 如果要设置 全局环境 的元表,请使用预先存在的元表设置新元表。请确保使用 __index 使其他变量仍然可用!

至于仅仅 阅读 元表,不,你无法做到。

另外,如果你锁定自己的表,如前所述,就有一种方法可以访问元表。简单的方法是在 do 作用域块中创建一个名为 meta 的局部变量。

我希望这回答了你的问题,我试图特别针对 ROBLOX 进行回答,因为这是你的问题所要求的。

2016-03-15 02:56:54