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

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

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

local __load = load
load = function(data, ...)
    -- 一些代码,例如,您可以将data变量解包到一个文件中
    return __load(data, ...)
end

如果有人使用他们的脚本加入我的脚本(例如以上示例),他们可以钩取我的脚本中的任何内置和全局函数,以及访问我自己定义的全局变量和函数(这就是为什么我总是定义所有函数和变量为本地变量的原因)。

因此,问题是我如何调用他们的原始函数,或者至少将它们恢复为原始块。如果这个可能的话。


以下是无法帮助您的可能答案:

  • _ G ['function_name']包含新函数的地址。
  • 使用pall(string.dump,function_name)检查函数是一件好事,但也可以钩取。

如果您无法理解我所说的某些内容:

  • 通过“加入脚本”,我指的是使用“load”或“loadstring”将它们彼此组合,之后这些脚本可以相互访问。
点赞
用户734069
用户734069

Lua 的沙盒机制是基于一个假设的:一个编译过的块是_你的_编译过的块。如果有人能够钩入 Lua 脚本的加载过程并在编译器看到它们之前附加任意内容,那么你就无法将它们隔离起来。这是安全过程中的失败点,所以你必须防范它。这需要超出 Lua 本身范围之外的工具。

然而,需要注意的是,如果你加载的是一个已经编译过的块,一个用户(只限于常规的 Lua 脚本)无法在该块的末尾添加内容。至少,在常规的 Lua 5.1 中是如此;LuaJIT 的加载器可能会有所不同。不过,如果他们交换了 load 函数,那么他们也可以编辑字节码本身,所以如果他们做到了这一点,你仍然没办法。


关于 Lua 沙盒机制的事情是,它无法在脚本内部完成。无论脚本所处的环境(全局变量等)如何,它都受到该加载和执行脚本的代码所管理。如果它没有明确地隔离一个脚本所做的全局更改和另一个脚本,那么你的脚本就无法做到这一点。

2019-05-19 20:15:07