如何在加密时带来调试信息,然后lua代码使用luac

时间:2018-02-11 03:29:31

标签: lua luac

我在“orgin.lua”文件中编写了以下代码

if test==nil then
    print(aa["bb"]["cc"])  -- to produce a crash
end
print(1120)

崩溃时,它会生成以下信息:

lua: origin.lua:3: attempt to index global 'aa' (a nil value)

为了防止反编译并确保代码安全,我使用以下命令转换我的代码:

luac -o -s test.lua origin.lua

我知道参数-s是条带调试信息,然后在崩溃时不显示行数:

lua: ?:0: attempt to index global 'aa' (a nil value)

但是如何在加密时带来调试信息然后lua代码使用luac?有什么解决方案吗?

2 个答案:

答案 0 :(得分:1)

没有办法将这个内置到Lua中,但是有一些解决方法。

如果您只需要行号,那么一个选项是将行号留在块中。行号对逆向工程没有用(unluac目前根本不使用它们),所以它不应该影响安全性。 Lua并没有为此提供一个选项,但是很容易修改Lua以便在剥离时留下它们。来自ldump.c

n = (D->strip) ? 0 : f->sizelineinfo;

可以更改为

n = f->sizelineinfo;

(免责声明:未经测试)

更复杂的选项是修改Lua运行时以输出虚拟机程序计数器而不是行号,并输出描述块中当前函数位置的信息(例如顶级,第一函数,第二级)嵌套在第三个函数中的函数等)。然后,开发人员可以在块的非剥离版本中查找行号。 (对于在lua-l上使用此方法的人,这里是reference - 但是没有提供源代码。)

请注意,防止反编译不是真正的安全性。它可能有助于防止偶然攻击,但Lua字节码不难阅读。

答案 1 :(得分:0)

luac不加密输出。它将您的Lua源代码编译为字节码,这就是全部。代码既不加密也不运行得更快,只有加载时间更短,因为不需要编译步骤。

如果您希望对代码进行加密,我建议使用例如加密字节码。 AES-256然后在将其交给Lua状态之前在内存中对其进行解码。这样,字节码在磁盘上加密,但在内存中记录。

开销很低。我们多年来一直使用这种技术。