如何混淆Lua代码?

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

我现在用lua制作了一个简单的游戏,我不希望别人看到代码,否则他们很容易会作弊。我怎样才能让.lua文件内的全部文本都变成随机字母和内容呢?

我曾经用C#编程,我有一个叫SmartAssembly的.NET混淆器,效果还不错。当有人试图检查我的应用程序代码时,它只是一堆字母和数字连同汉字等等。

有人知道任何能够为lua做到这一点的程序吗?只需加载要加密的文件,点击加密或者其他的东西,然后弄好了!?

例如,这个:

print('Hello world!')

将变成这样:

sdf9sd@@@&/sdfsdd9fd0f0fsf/&
点赞
用户3204551
用户3204551

只需对您的文件(块)进行预编译并加载二进制块即可。luac允许您剥离调试信息。如果这还不够,可以在已编译的Lua上定义自己的转换,在可能的情况下剥离名称。不过,实际上并没有太多对于Lua混淆器的需求...

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

只需对您的文件(块)进行预编译并加载二进制块即可。`luac`允许您剥离调试信息。如果这还不够,可以在已编译的Lua上定义自己的转换,在可能的情况下剥离名称。不过,实际上并没有太多对于Lua混淆器的需求...

此外,您将失去使用嵌入式脚本语言的主要优势之一:可扩展性。
2014-03-29 15:25:16
用户869951
用户869951

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

需要注意的是,任何可以访问你的“加密器” Lua 模块的人都将知道如何解密你的文件。如果你使用 C/C++ 制作你的加密模块,任何有源代码或 Lua 加密模块二进制文件的人也可以使用 require 加载模块并还原代码。对于_解释_语言来说,这是相当困难的:你可以通过以上技巧提高门槛,但要求需要相当大的工作量(唯一的抵制力)是非常困难的。

如果你将 Lua 解释器嵌入到 C 中,这会使问题变得更加棘手(假设所有符号都被削减了),人们必须熟悉汇编代码,但只需要一个有能力的人来破解算法,然后他们就可以把代码提供给其他人。

你仍然有兴趣做这个吗? :)

2014-03-29 17:11:47
用户1442917
用户1442917

最简单的混淆选项是像其他人建议的那样编译您的 Lua 代码,但它有两个主要问题:(1) 字符串在编译后仍然很容易在您的已编译代码中可见;(2) Lua 解释器的编译代码不具备可移植性,因此如果针对不同体系结构,则需要有不同的编译块。

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

第二个问题不容易解决,除非对解释器进行改变,但如果您有选择解释器的选项,则 LuaJIT 生成的可移植字节码将在所有平台上运行(运行相同版本的 LuaJIT);请注意,LuaJIT 字节码与 Lua 字节码不同,因此无法通过 Lua 解释器运行。

更复杂的选项将是加密代码(可能会在编译之前),但是您需要权衡任何额外机制(以及您的工作量)与您的用户可能遇到的任何不便以及您可能因破解保护而遭受的任何损失。我个人会使用足够简单的东西来阻止大多数好奇的用户,而您很可能无法抵抗有专门攻击经验的黑客。

2014-03-29 18:08:25
用户1783976
用户1783976

我想添加一些代码示例,因为这里的答案有所帮助,但并没有让我们完全达到目标。我们想保存一些Lua表信息,而不是让某人轻易注入自己的代码。先将表序列化,然后使用load方法将其转换为可加载到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)
    -- 将表转换为字符串
    local str = serializer.Serialize( tbl )

    -- 将字符串转换为Lua块,这样可以进行一定程度的混淆,因为在文本编辑器中看起来像乱码
    local chunk = string.dump(load(str), true)

    file:write(chunk)
    file:close()

    -- 从 /usr 发送到 MSI 文件夹
    local sendResult = tftp.SendFile( localName, msiPath )
    -- 从 /usr 文件夹中删除
    os.remove(localName)

    return sendResult
end

在 Notepad++ 中,一个小表的输出如下:

LuaS У

Vx@w( @ АKА└АJБ┴ JА @ & А & name Coulombmetervalue?С╘ ажў

2018-01-20 00:14:27