许多安全专家表示,失去对互联网上代码的控制就像将CCB的蓝图交给强奸犯一样。
Lua是一种广泛应用于游戏开发的计算机语言,可以让开发者轻松定制自己需要的功能。 其中,举世闻名的《愤怒的小鸟》就是用Lua语言和Wax开发的。 据悉,梦幻西游、奇迹暖暖、开心小乐、放置英雄、最强蜗牛等手游也都是使用Lua语言编写的。
近年来,Lua脚本在游戏行业非常流行。 然而Lua脚本泄露现象屡见不鲜,其安全性也引发关注。 不法分子通过开放私服、开放插件等方式实现游戏代码的商业变现,这给游戏开发商造成巨大的经济损失,也影响了游戏玩家包括账户、物品等虚拟资产的安全。
本文将围绕Lua脚本加密,讨论Lua中三种常见的加密方法,并探讨如何进一步保护Lua代码。
一、背景
“Lua”在法语中是“月亮”的意思,由法国天主教大学于1993年开发。
Lua作为一种成熟的解释性语言,简单、轻量、易于维护,并且可以根据自身的特点模拟面向对象。 因此,它被嵌入到越来越多的应用程序中,尤其是游戏中。 发展带来极大便利。 比如Cocos引擎主流游戏使用Lua语言,U3D游戏热更新框架xlua等。
同时,由于Lua语言本身的特点,Lua代码本身并不安全。 很多情况下,攻击者可以获取Lua源代码进行读取、分析、窃取和篡改,然后进一步重新打包,给游戏本身带来风险。 存在巨大的安全隐患。
2. Lua现有的保护
对于这种类型的脚本解释性语言,从代码保护的角度来说,与其自身的表达方式密不可分。 对于Lua来说,目前市面上的手游包中能看到的主要有lua源码、luac、luajit。 表达方法,将详细介绍每种方法以及其现有的保护和暴露的异同。
2.1Lua源码
目前市面上很多游戏中使用Lua源码本身并不多,更多的是在一些热点更新中。 因此,从源代码保护的角度来看,很容易想到对Lua源代码本身进行混淆的解决方案; 目前,市场上对Lua源码进行混淆的厂商主要有以下几种:
XFuscator:
卢拉夫:
SyanpseXen:
铁酿:
判决:
对于这些基于源代码的混淆,优点是Lua处理后变得更加复杂,降低了攻击者分析的成本和难度; 由于攻防的升级,对于之前的混淆也有了相应的反混淆方法。 同时,混乱不仅仅是混乱本身所表现出来的兼容性问题,对于开发者来说还存在以下问题:
1、同一段代码的混淆在不同的时间进行混淆,得到的混淆效果不同:
因为为了降低混淆的程度和难度,混淆器上会有需要热更新的随机代码。 热更新的时候会进行比较,所以没有办法进行热更新。
2.Lua语句混乱的兼容性问题:
由于Lua句型的灵活性,反混淆处理存在很多兼容性问题;
3、开发者准入问题:
对于开发者来说,接入第三方并与第三方沟通解决问题的成本较高;
2.2luac方法
Luac是其自身语言的字节码格式,与Python等其他脚本语言等虚拟机中显示的字节码格式相同。 Lua加载到显存后,虚拟机加载对应的字节码,因为lua主要有5.1、5.2、5.3三个版本,所以三种格式也会有对应的luac版本。 目前手游主流版本是5.2版本;
事实上,luac不会以源码的形式出现,而且由于在Lua源码中可以窥探到Lua字节码的执行和格式,比如luadec反编译工具,所以luac的方式还是不安全的。 目前市场上针对这些保护的方式主要有以下三种:
2.2.1:Luac加密
从Lua虚拟机源码中我们可以知道Lua是在luaL_loadbuffer函数中加载的,所以有安全意识的厂商会对Lua进行加密。 更改此源代码并在实际执行之前显示它;
并且由于虚拟机的执行过程是开源的,但是由于cocos项目编译过程需要静态链接对应的引擎库,对对应的引擎so文件进行签名,所以对于攻击者来说,可以在luaL_loadbuffer函数处完成。 显存的DUMP得到正常的字节码,然后使用反编译工具进行处理,进行进一步的修改;
2.2.2:改变Lua虚拟机中操作码的顺序
对于Lua等解释性语言来说,无论是虚拟机还是对应的反编译工具都有固定的操作码顺序,有意识的安全厂商会通过改变对应操作码的顺序来对其进行保护,如右图所示:左边是顺序正常操作码,左边是随机化后的操作码;
这样,重新编译处理后的luac可以看到如右图所示:对应的opcode不同;
操作码不同,对应的解释顺序如下:
目前,对于这些自定义更改操作码的处理方式游戏源码设置,攻击者可以通过将目标虚拟机加载的Lua文件与正常虚拟机编译的luac进行比较,“吐出”对应的映射表,然后进一步利用在反编译工具中进行进一步处理。 反编译处理以进行进一步处理;
或者因为Lua本身的操作码不多,如上图所示,可以很容易定位到正常的执行顺序; 因此,这些处理方法都不是很安全。
2.2.3:保护Lua的虚拟机执行进程
可见,一些游戏厂商对Lua虚拟机进行安全编译处理,就是让整个虚拟机的解释过程变得复杂化。
与右图类似:左右是功能相同的函数,但左侧经过安全编译器处理:
以往的处理方法存在两个问题:
首先,由于Lua本身是开源的,因此经过安全编译处理后,相应的符号仍然存在; 攻击者可以轻松找到它们;
其次是攻击者可能不需要太关心中间的虚拟化解释和执行过程,所以从整体防护的角度来看,实质性的效果并不大。
2.2.4 小结:
目前以luac为主要表现方式的游戏厂商主要是为了综合利用前三种防护,经过分析可以看出,并没有从根本上起到很好的作用,只能阻挡一些中间攻击者。 真正的攻击点防护并不严密。
2.3luajit方式
考虑到Lua的执行效率,luajit诞生了。 从名字就可以看出,luajit是由Lua的即时编译器生成的。 它是一个通过手写汇编实现的Lua类库和一个可以直接生成机器代码的JIT编译器。 设备; 根据dynasm动态生成buildvm_xxx.h文件,并进一步解释执行;
目前很多游戏厂商,为了进一步保护游戏中的脚本,将Lua处理成luajit格式。 对于luajit来说,也有相应的反编译工具,ljd或者luajit-lang-toolkit或者luajit-decomp,所以有的游戏厂商会在luajit之后进行加密处理;
使用cocos自带的加密,大部分厂商都会设置自己的私钥和签名值,如下;
并调用对应的XXTEA加密算法,加密后可以看到如下luajit编码方式:
面对之前的加密处理方式,秘诀也很简单:
一是可以利用HOOK在关键函数处进行内存转储;
其次,也可以反编译代码,如右图所示,显示了某个著名游戏对应的key和sign值,然后调用XXTEA揭秘,得到标准的luajit方法; 然后使用反编译器进行反编译、更改等;
3、加强Lua保护
从之前lua、luac、luajit的保护和逆向方面来看,如果想要真正保护Lua游戏,可以从以下几个角度入手:
使用脚本选择保护算法?
如何进一步删除虚拟类库中的符号?
如何让开发者接入尽可能方便?
我们应该如何进一步考虑保护的硬度?
3.1 算法的选择性
目前很多游戏厂商都使用Quick-Cocos2dx或者cocos自带的算法,比如XXTEA等来进行加密处理,包括对脚本、zip包进行加密,这样攻击者就可以很方便的利用这个算法来完成操作比如去神秘化; 算法的设计越“私密”越好,这样可以在第一层阻止攻击者执行静态恢复脚本。
3.2 清除虚拟类库中的符号
通过它我们可以看到,无论是定制opcode类库游戏源码设置,还是使用安全编译器处理Lua虚拟机,都存在问题。 由于静态链接的问题,符号表暴露了。 符号表的存在为攻击者提供了丰富的分析线索,可以免杀Lua虚拟机解释引擎,不仅可以保护内部的私有化解密算法,还可以清除符号,使攻击者很难进一步进行攻击。分析。 已达到第二级保护。 同时,借助外壳,它会监视游戏周围的可疑环境,例如上面提到的HOOK。
3.3 让开发者尽可能方便的访问
比如上面提到的,Lua混淆的时候,应该尽可能的考虑到开发者的功能业务。 是游戏的逻辑业务还是热更新? 否则,就像上面提到的基于源代码的混乱一样,每次随机化都会造成事半功倍的结果。
3.4 如何进一步考虑防护硬度
从里面的分析过程可以看出,我们从以下几个角度来加强硬度:
在混淆Lua源码时,可以坑luac和luajit对应的反编译工具,因为有些攻击者不了解反编译的原理,而攻击者则加强了防止反编译;
由于Lua自身句型的灵活性,可以定制Lua自身的格式,同时可以更改相应的类库部分。 这样,攻击者就必须分析定制的格式和相应的类库部分,从而加大了分析的难度。
总结一下,如右图:
四。 概括
在游戏开发领域,Lua、C++、C#的结合带来了非常强大的功能,但也不可避免地存在被破解的风险。
安全攻击通常针对破解软件的代码。 在导致泄密的网络安全“短板”中,代码安全是最本质、最核心的问题。
不可证明的是,在数字经济时代,对于科技公司来说,代码不仅是垄断的一部分,更是核心商业秘密之一。 一旦核心代码泄露,就会导致软件核心技术外流,这对企业来说几乎是致命的打击。
黑客破壳逆向代码后,“裸奔”代码面临全面暴露的风险。 减少加密算法是非常有必要的。
网易易盾游戏反作弊,分享前沿技术知识和趋势,帮助企业规避影响业务健康发展的安全风险。 结合网易多年的游戏安全实践经验,亿盾针对游戏行业常见安全风险,提供一站式全生命周期手游安全解决方案。