我在“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?有什么解决方案吗?
答案 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状态之前在内存中对其进行解码。这样,字节码在磁盘上加密,但在内存中记录。
开销很低。我们多年来一直使用这种技术。