Lua 如何在原始函数';重新定义了什么?

Lua 如何在原始函数';重新定义了什么?,lua,luajit,Lua,Luajit,我使用的是LuaJIT 2.1,当我需要隐藏源代码时,我首先对其进行模糊处理以防止脚本被反编译,然后对其进行编译 我们知道,只要重新定义LUA中的任何函数,就可以将其挂接: local\uuu load=load 加载=功能(数据,…) --一些东西,例如,您可以将数据var解包到一个文件中 返回加载(数据,…) 结束 如果有人将我的脚本与他们的脚本(例如上面的)连接起来,他们可以在我的脚本中直接钩住任何内置和全局函数,也可以访问我自己定义的全局变量和函数(这就是为什么我总是将所有函数和变量定

我使用的是LuaJIT 2.1,当我需要隐藏源代码时,我首先对其进行模糊处理以防止脚本被反编译,然后对其进行编译

我们知道,只要重新定义LUA中的任何函数,就可以将其挂接:

local\uuu load=load
加载=功能(数据,…)
--一些东西,例如,您可以将数据var解包到一个文件中
返回加载(数据,…)
结束
如果有人将我的脚本与他们的脚本(例如上面的)连接起来,他们可以在我的脚本中直接钩住任何内置和全局函数,也可以访问我自己定义的全局变量和函数(这就是为什么我总是将所有函数和变量定义为局部函数)

所以,问题是我如何调用它们的原始函数,或者至少将它们恢复到它们的原始块。如果有可能的话


可能没有帮助的答案:

  • \u G['function\u name']
    包含新函数的地址
  • 使用
    pcall(string.dump,function\u name)
    检查函数是一件好事,但也可以钩住它

如果你听不懂我说的话:

  • 通过“加入脚本”,我的意思是使用
    load
    loadstring
    将它们相互组合,然后这些脚本可以相互访问

Lua沙盒基于编译块就是您的编译块的假设。如果有人能够钩住Lua脚本加载过程,并在编译器看到Lua脚本之前将任意内容附加到Lua脚本,那么您就不能将它们沙箱化。这是您在安全过程中的失败点,因此您必须对此进行防御。这需要在Lua本身的边界之外使用工具

但是请注意,如果加载预编译的块,用户(仅限于常规Lua脚本)无法将内容添加到该块的末尾。至少,不在常规Lua 5.1中;LuaJIT的装载机可能不同。诚然,如果他们交换了
load
函数,那么他们也可以编辑字节码本身,所以如果他们做到了这一点,你仍然运气不佳



Lua沙箱的问题是它不能在脚本中完成。无论您的脚本呈现在什么环境中(globals等),都是该环境。它由加载和执行脚本的代码管理。如果它没有显式地将一个脚本所做的全局更改与另一个脚本所做的全局更改隔离开来,那么您的脚本对此无能为力。

这意味着如果不重建lua51.dll,我们就无法保护脚本免受外部干预?实际上,任何人都可以进入您的编译脚本,因为
load
函数可以加载编译脚本(字节码),无论它是lua还是luajit编译脚本。这很容易actually@user70960:你确定吗?我编写了一个测试脚本,尝试获取两个预编译的块并将它们都推入
load
,只执行第一个块。我甚至将两个预编译的字符串缝合在一起,并将它们放入
loadstring
,它仍然只执行第一个字符串。现在,我使用的是基线Lua5.1,而不是LuaJIT,所以这可能是不同之处。但这对LuaJIT来说是一种奇怪的行为。@user70960:如果您想亲自尝试的话。@user70960:这些脚本没有“连接”,也没有“相互访问权”。这只是一个脚本在另一个脚本之前执行,根本没有尝试沙箱。您的问题表明,
load
本身已经被覆盖,因此您已经失去了对沙箱的控制。但你没有。您展示的示例甚至没有尝试对这些脚本进行沙箱处理。那么,您是否可以控制编译/执行这些脚本的代码?@user70960:首先,停止发布Youtube视频;压缩太大了,看不到任何东西,即使看不到,我也无法复制/粘贴任何东西。其次,如果您无法控制实际加载和执行脚本的程序,那么您就无法控制任何东西。您不能从尝试构建的沙箱中对Lua进行沙箱。脚本由加载和执行它们的环境决定。总是。