如何混淆lua代码?

时间:2014-03-29 15:19:27

标签: encryption lua obfuscation

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

我现在在lua做了一个简单的游戏,我不希望别人看到代码,否则他们很容易作弊。如何将.lua文件中的整个文本变成随机字母和东西?

我曾经在C#中编程,我有一个名为SmartAssembly的.NET混淆器,效果非常好。当有人试着检查我的应用程序的代码时,它只会是一堆字母和数字以及中文字符和东西。

任何人都知道任何可以为lua做到这一点的程序吗?只需加载要加密的文件,单击加密或soemthing,然后bam!它有效!?

例如:

print('Hello world!')

会变成类似

的东西
sdf9sd@@@&/sdfsdd9fd0f0fsf/&

4 个答案:

答案 0 :(得分:6)

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

此外,您放弃了使用嵌入式脚本语言的一个主要优点:可扩展性。

答案 1 :(得分:5)

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

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

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

更复杂的选项是加密代码(可能在编译之前),但是您需要权衡任何其他机制(并且在您的工作中),以防止对您的用户造成任何可能的不便以及您从某人破解中获得的任何损失保护。我个人会使用足够简单的东西来阻止大多数好奇的用户,因为你可能无法对抗专门的黑客。

答案 2 :(得分:4)

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

请注意,有权访问“加密器”Lua模块的任何人都知道如何解密您的文件。如果您使用C / C ++制作加密模块,任何有源访问权限的人,或者Lua加密模块的二进制文件,他们也可以require模块,并且无法模糊代码。使用解释语言很难做到:你可以通过上面的技术提高一点,但提高它需要大量的工作(唯一的生气憎恶)是非常困难的AFAIK。

如果嵌入Lua解释器而不是从C中执行此操作,这会使其变得更加困难(假设释放构建时所有符号都被剥离),人们必须习惯于逐步完成程序集,但它只需要一个有能力的人为了破解算法,他们可以将代码提供给其他人。

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

答案 3 :(得分:2)

我以为我会添加一些示例代码,因为这里的答案很有帮助,但并没有让我们一路走来。我们想保存一些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А@   &安培; А&名称 库仑计值?С╘ажў