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,因为这就是你的问题。
在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,因为这就是你的问题。