2

我在“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?有什么解决办法吗?

4

2 回答 2

1

没有办法在 Lua 中内置,但有一些变通方法。

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

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

可以改为

n = f->sizelineinfo;

(免责声明:未经测试)

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

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

于 2018-02-11T06:43:44.253 回答
-1

luac 不加密输出。它将你的 Lua 源代码编译为字节码,仅此而已。代码既没有加密也没有运行得更快,只是加载时间更短,因为不需要编译步骤。

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

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

于 2018-02-11T09:04:15.630 回答