Lua中的getmetatable()函数和锁定表
在lua编程语言中,我知道您可以使用元方法__metatable锁定userdata的元表,以便任何人都无法使用getmetatable()函数查看userdata的元表。但是,我仍然想要访问已锁定的元表。因此,我的问题是,在锁定userdata的元表之后,是否仍然有可能(也许通过一些后门)获取已锁定的userdata的元表,或者是不可能的(如果是这样,那么是为什么)?
编辑#1: 我想知道这个问题的原因是因为我正在尝试找到进入Roblox API的后门,以便更有效地编写我的游戏脚本。
你说你使用 ROBLOX。仔细想想,他们之所以锁定这些内容,是有一定的安全考虑的。允许脚本作者访问此类内容是危险的,会带来严重威胁。因此,答案是否定的,一旦被锁定,就没有办法重新访问元表,除非有引用,否则锁将没有意义。
ROBLOX 还删除了调试库中的所有函数,但最近增加了 debug.traceback,因此绝对不能使用 debug.getmetatable。
但是,根据您对此的理由,还有其他方法可以完成任务。在此介绍一些:
如果要设置 实例 的元表,则使用您自己的表创建一个虚拟实例,然后使用
__index和__newindex来控制对象的属性和方法。如果要设置 库 的元表,则遵循和 1 相同的方法,创建一个虚拟表并使用
__index索引旧表。如果要设置 全局环境 的元表,请使用预先存在的元表设置新元表。请确保使用
__index使其他变量仍然可用!
至于仅仅 阅读 元表,不,你无法做到。
另外,如果你锁定自己的表,如前所述,就有一种方法可以访问元表。简单的方法是在 do 作用域块中创建一个名为 meta 的局部变量。
我希望这回答了你的问题,我试图特别针对 ROBLOX 进行回答,因为这是你的问题所要求的。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
这至少适用于lua 5.3。
在lua中,您可以使用调试库方法
debug.getmetatable。它应该返回原始的metatable而不受__metatable元方法的影响。 在C中,您可以使用功能lua_getmetatable完成相同的目的。此外,您始终可以在某处创建一个变量来存储metatable,并稍后通过该变量访问它。
而且,如果您使用
luaL_newmetatable,则仍然可以通过您使用的metatable名称在注册表中找到metatable。