我在"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呢?有什么解决方案吗?
发布于 2018-02-11 14:43:44
没有办法做到这一点内置于Lua,但有一些解决办法。
如果您只需要行号,那么一种选择是将行号保留在块中。行号对于逆向工程并不是很有用(unluac目前根本不使用行号),所以它不应该影响安全性。Lua没有提供这样的选项,但很容易修改Lua,使其在剥离时保留它们。来自ldump.c
n = (D->strip) ? 0 : f->sizelineinfo;可以更改为
n = f->sizelineinfo;(免责声明:未经测试)
更复杂的选项将是修改Lua运行时以输出虚拟机程序计数器而不是行号,并且还输出描述当前函数在块中的位置的信息(例如,顶层、第一函数、嵌套在第三函数中的第二函数等)。然后,开发人员可以在块的非剥离版本中查找行号。(这是一个在lua-l上使用这种方法的人的reference --但是没有提供源代码。)
请注意,防止反编译并不是真正的安全性。它可能有助于抵御偶然的攻击,但Lua字节码并不难读。
发布于 2018-02-11 17:04:16
luac不会加密输出。它将你的Lua源代码编译成字节码,仅此而已。代码既没有加密,也没有更快地运行,只是加载时间更短,因为不需要编译步骤。
如果你想要加密你的代码,我建议使用AES-256加密字节代码,然后在将它传递到Lua状态之前在内存中解码它。这样,字节码在磁盘上被加密,但在内存中被解密。
开销很低。我们多年来一直在使用这种技术。
https://stackoverflow.com/questions/48728005
复制相似问题