重新定义原始函数后,如何恢复/调用原始函数?

时间:2019-05-19 17:51:10

标签: lua luajit

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

我们知道我们可以通过重新定义LUA来挂钩任何函数:

local __load = load
load = function(data, ...)
    -- some stuff, e.g. you can unpack the data var to a file
    return __load(data, ...)
end

如果有人将我的脚本与其脚本一起加入(例如上述),他们可以从字面上钩住我脚本中的任何内置函数和全局函数,以及访问我定义的全局变量和函数(这就是为什么我总是将所有函数和变量都定义为局部函数。

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


可能无济于事的答案

  • _G['function_name']包含新功能的地址。
  • 使用pcall(string.dump, function_name)检查功能是件好事,但也可以将其钩住。

如果您听不懂我说的话:

  • “加入脚本”是指使用loadloadstring将它们彼此组合,之后这些脚本可以相互访问。

1 个答案:

答案 0 :(得分:1)

Lua沙箱基于一个假设,即已编译的块是您的已编译块。如果有人能够在编译器看到Lua脚本加载过程之前就将其挂接到Lua脚本上并将任意内容附加到Lua脚本上,那么您就不能将它们沙盒化。那就是您在安全过程中的失败点,因此这是您必须防御的问题。这就需要工具超出Lua本身的界限。

但是请注意,如果要加载预编译块,则用户(仅限于常规Lua脚本)不能在该块的末尾添加内容。至少在常规的Lua 5.1中没有; LuaJIT的装载机可能有所不同。当然,如果他们交换了load函数,那么他们也可以编辑字节码本身,因此,如果他们走了那么远,那您还是很不走运。


关于Lua沙箱的事情是无法从脚本内部完成。呈现脚本的任何环境(全局变量等)都是该环境。这由加载和执行脚本的代码管理。如果它没有明确地做任何事情来隔离一个脚本与另一个脚本所做的全局更改,那么您的脚本对此无能为力。