如何加密lua代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何加密lua代码相关的知识,希望对你有一定的参考价值。
参考技术A lua是开源软件,所以可以自己定制。加密的简单的方式是将lua翻译的字节码加密,在执行字节码之前将其解密后执行即可。本回答被提问者采纳 参考技术B 加密目的:在游戏开发中,脚本作为一种资源文件,就像图片视频一样,被引擎所引用。如果不对脚本进行加密,不怀好意的人轻松解压出脚本文件,给你瞬间复制一个游戏出来。在程序发布前一般会对脚本进行加密,防止代码泄漏。
加密工具:
Virbox Protector
DS Protector
优点:
便捷,一键加壳,无需编写代码。
安全,混淆、虚拟化、碎片代码、反黑、定制SDK等最新加密安全技术。
快速,5分钟完成整个程序加壳,专注软件开发。
灵活,云锁、软锁、硬件锁三种许可形式,可满足联网或离线场景,云和软无需硬件加密。
加密工具下载:
SDK需Virbox LM帐号,获取许可ID及密码
1、 获取SDK
注册后,转正即可下载定制SDK
2、文档下载
包含加密快速流程及加壳详细文档
加密流程
1、注册帐号
2、安装SDK
3、用Virbox Protector对安装目录下的 lua.exe 进行加壳。如何加壳?
4、打开 DS Protector,导入刚加壳生成的配置工具,添加所需要保护的demo ,点击保护
5、进入 demo 所在的目录下,运行如 lua demo.lua
如何混淆lua代码?
【中文标题】如何混淆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代码的主要内容,如果未能解决你的问题,请参考以下文章