Encryption 如何混淆lua代码?

Encryption 如何混淆lua代码?,encryption,lua,obfuscation,Encryption,Lua,Obfuscation,我在谷歌上找不到任何加密/混淆我的lua文件的工具,所以我决定在这里询问。也许有些专业人士知道怎么做?(免费) 我现在用lua做了一个简单的游戏,我不想让人们看到代码,否则他们很容易作弊。如何将.lua文件中的整个文本变成随机的字母和内容 我曾经用C#编程,我有一个名为SmartAssembly的.NET模糊器,它工作得很好。当有人试图检查我的应用程序的代码时,它只是一堆字母和数字,再加上汉字和其他东西 有人知道有什么程序也能为lua做到这一点吗?只需加载要加密的文件,单击encrypt或soe

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

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

我曾经用C#编程,我有一个名为SmartAssembly的.NET模糊器,它工作得很好。当有人试图检查我的应用程序的代码时,它只是一堆字母和数字,再加上汉字和其他东西

有人知道有什么程序也能为lua做到这一点吗?只需加载要加密的文件,单击encrypt或soemthing,然后bam!它有用

例如:

print('Hello world!')
会变成

sdf9sd@@@&/sdfsdd9fd0f0fsf/&

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


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

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

请注意,任何能够访问您的“encryptor”Lua模块的人都知道如何解密您的文件。如果您使用C/C++制作加密模块,任何有权访问源代码或Lua加密模块二进制文件的人也会这样做,他们也可以
要求
该模块并解开代码。使用解释语言是很难做到的:你可以通过上面的技术稍微提高标准,但提高它需要大量的工作(唯一真正的威慑力)在美国是非常困难的

如果嵌入Lua解释器比从C中嵌入Lua解释器要困难得多(假设发布版本中删除了所有符号),用户必须能够轻松地完成组装,但只需要一个有能力的人就能破解算法,然后他们就可以将代码提供给其他人


你还对做这件事感兴趣吗?:)

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

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

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


一个更复杂的选择是加密代码(可能在编译之前),但您需要权衡任何额外的机制(以及您自己的工作),以避免给用户带来任何可能的不便,以及有人破解保护带来的任何损失。我个人会使用一些足够简单的方法来阻止大多数好奇的用户,因为你可能根本就没有机会对付一个专门的黑客。

我想我应该添加一些示例代码,因为这里的答案很有帮助,但并没有让我们一直做到这一点。我们想保存一些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
在记事本++中,一个小表的输出如下所示:

卢亚斯У

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