如何混淆lua代码?

Posted

技术标签:

【中文标题】如何混淆lua代码?【英文标题】:How to obfuscate lua code? 【发布时间】:2014-05-09 02:23:59 【问题描述】:

我在 Google 上找不到任何加密/混淆我的 lua 文件的工具,所以我决定在这里询问。也许一些专业人士知道怎么做? (免费)。

我现在用lua做了一个简单的游戏,不想让人看到代码,不然很容易作弊。如何将 .lua 文件中的整个文本变成随机字母和内容?

我曾经使用 C# 进行编程,并且我有一个名为 SmartAssembly 的 .NET 混淆器,它工作得非常好。当有人尝试检查我的应用程序的代码时,它只是一堆字母和数字以及汉字和其他东西。

任何人都知道任何可以为 lua 执行此操作的程序吗?只需加载要加密的文件,单击加密或某些东西,然后砰!行得通!?

例如:

print('Hello world!')

会变成类似的东西

sdf9sd@@@&/sdfsdd9fd0f0fsf/&

【问题讨论】:

【参考方案1】:

只需预编译您的文件(块)并加载二进制块。 luac允许您剥离调试信息。如果这还不够,请在已编译的 lua 上定义您自己的转换,尽可能去除名称。不过,对 lua 混淆器的需求并不多……

此外,您失去了使用嵌入式脚本语言的主要优势之一:可扩展性。

【讨论】:

【参考方案2】:

最简单的混淆选项是按照其他人的建议编译你的 Lua 代码,但是它有两个主要问题:(1) 字符串在你的编译代码中仍然很容易看到,以及 (2) Lua 的编译代码解释器是不可移植的,所以如果你针对不同的架构,你需要为它们有不同的编译块。

第一个问题可以通过使用预处理器来解决,该预处理器(例如)将字符串转换为数字序列,然后在运行时将它们连接回来。

如果不更改解释器就不容易解决第二个问题,但是如果您可以选择解释器,那么 LuaJIT 会生成可在其所有平台上运行的可移植字节码(运行相同版本的 LuaJIT);请注意,LuaJIT 字节码与 Lua 字节码不同,因此它不能由 Lua 解释器运行。

一个更复杂的选择是加密代码(可能在编译之前),但您需要权衡任何额外的机制(并由您自己努力)以应对可能给您的用户带来的任何不便以及您因有人破解而造成的任何损失保护。我个人会使用足够简单的方法来阻止大多数好奇的用户,因为无论如何你可能没有机会对抗专门的黑客。

【讨论】:

【参考方案3】:

您可以使用loadstring 获取一个块,然后使用string.dump,然后应用一些转换,例如循环字节、交换段等。转换必须是可逆的。然后保存到文件中。

请注意,任何有权访问您的“加密器”Lua 模块的人都将知道如何解密您的文件。如果你用 C/C++ 制作你的加密模块,任何可以访问源代码的人也可以访问,或者访问 Lua 加密模块的二进制文件,他们也可以require 模块并取消混淆代码。使用 interpreted 语言很难做到:您可以通过上述技术稍微提高标准,但将其提高到需要大量工作(唯一的威慑)是非常困难的 AFAIK。

如果您嵌入 Lua 解释器而不是从 C 中执行此操作,这会使其变得更加困难(假设已删除所有符号的 Release 构建),人们必须对逐步完成组装感到满意,但只需要一个有能力的人破解算法,然后他们可以将代码提供给其他人。

你还有兴趣这样做吗? :)

【讨论】:

【参考方案4】:

我想我会添加一些示例代码,因为这里的答案很有帮助,但并没有让我们一路走到那里。我们想保存一些 lua 表信息,而不是让别人很容易注入他们自己的代码。序列化您的表,然后使用 load(str) 将其制成可加载的 lua 块,并使用 string.dump 保存。使用 'true' 参数,调试信息被剥离,实际上并没有太多信息。是的,您可以看到字符串键,但这比仅保存裸序列化 lua 表要好得多。

function tftp.SaveToMSI( tbl, msiPath )
    assert(type(tbl) == "table")
    assert(type(msiPath) == "string")

    local localName = _GetFileNameFromPath( msiPath )
    local file,err = io.open(localName, "wb")
    assert(file, err)
    -- convert the table into a string
    local str = serializer.Serialize( tbl )

    -- create a lua chunk from the string.  this allows some amount of 
    -- obfuscation, because it looks like gobblygook in a text editor
    local chunk = string.dump(load(str), true)

    file:write(chunk)
    file:close()

    -- send from /usr to the MSI folder
    local sendResult = tftp.SendFile( localName, msiPath )
    -- remove from the /usr folder
    os.remove(localName)

    return sendResult
end

一个小表格的输出在 Notepad++ 中如下所示:

LuaS У

Vx@w(@АKА└АJБ┴ JА@ & А & 名字 库仑计值?С╘ ажў

【讨论】:

以上是关于如何混淆lua代码?的主要内容,如果未能解决你的问题,请参考以下文章

lua如何混淆加密?

解码混淆的lua

如何加密lua代码

lua代码暴力混淆--shell脚本

LUA的文件怎么加密?

Redis 分布式锁混淆结果与 Lua 脚本