不少安全专家表示,在互联网上失去对代码的控制,就像把银行的设计图交给抢劫犯一样。

Lua是一种被广泛用于游戏开发中的一种计算机语言,方便开发者定制自己所需的功能。其中,红遍全球的《愤怒的小鸟》就是由Lua语言用Wax开发的。此外,梦幻西游、奇迹暖暖、开心消消乐、放置奇兵、最强蜗牛等手游也采用了Lua语言进行编写。

近年来,Lua脚本在游戏行业长期流行,但Lua脚本泄露事件屡见不鲜,其安全性也引起关注。不法分子通过开私服、开外挂等途径,实现对游戏代码的商业变现,这给游戏开发者造成巨大经济损失,也危及游戏玩家包括账号、物件在内的虚拟资产安全。

本文将聚焦Lua脚本加密,深入阐述Lua常见的三种加密方式,并探索如何进一步的保护Lua代码。

一、背景

“Lua”在葡萄牙语中是“月亮”的意思,1993年由巴西的Pontifical Catholic University开发。

作为小巧的解释性语言,Lua具有简单、轻量、易维护的特点,且可以根据自身的特性来模拟面向对象,因此其被嵌入到越来越多的应用中,特别是游戏中,为游戏开发带来了很大的便捷性。例如,Cocos引擎的主流游戏、U3D游戏中的热更框架xlua都会用到Lua语言。

同时,由于Lua语言自身的这些特性,Lua代码本身并不安全,很多时候攻击者可以获取Lua源码进行阅读,分析,盗用以及篡改等,然后进一步的重打包,给游戏本身带来了很大的安全隐患。

二、Lua现有的保护

对于这种脚本解释性语言,从代码保护的角度跟它自身所表现的形式是密不可分的,对于Lua而言,目前市面上手游包中可以看到的主要是lua源码,luac,luajit三种的表现形式,接下来会详细的介绍每一种形式以及自身现有的保护以及所暴漏出来的优缺点。

2.1Lua源码

目前市面上用到Lua源码本身在游戏中呈现的并不是很多,但是在一些热更下发中会比较多;因此从源码保护的思路会很容易的想到针对Lua源码本身进行混淆保护的方案;目前市面上针对Lua源码进行混淆的厂家主要有以下这几家:

  • XFuscator:

  • Luraph:

  • Syanpse Xen:

  • Ironbrew:

  • Verdict: 

对于这种基于源码的混淆,优点是是Lua经过处理以后更加的复杂化了,增大了攻击者进行分析的成本和难度;由于攻防升级,对于上面的混淆也有相对的反混淆处理方式。同时混淆除了自己混淆本身所表现出来的兼容性问题以外,对于开发者也有以下这几个问题:

第一是同一段代码的混淆在不同时间进行混淆,所得到的混淆效果是不同的:

由于混淆器为了增大混淆的程度和难度,里面会有随机的代码要进行热更,热更的时候会进行比较,这样没办法进行热更处理;

第二是针对Lua语法混淆的兼容性问题:

由于Lua语法的灵活性,因此去混淆处理的兼容性问题比较多;

第三是开发者接入问题:

对于开发者而言进行接入以及出现问题跟第三方进行沟通解决的成本比较大;

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的虚拟机源码处可以得知在luaL_loadbuffer函数会加载Lua,因此有安全意识的厂家会对Lua进行加密。修改这个源码,在真正的执行前进行解密;

但是由于虚拟机的执行过程是开源的,并且由于cocos工程编译处理需要静态链接对应的引擎库,这样对应的引擎so文件是有符号的,因此对于攻击者来说,在luaL_loadbuffer函数处可以进行内存的DUMP得到正常的字节码,然后使用反编译工具进行处理,进行进一步的修改;

2.2.2:修改Lua虚拟机中opcode的顺序

对于Lua这种解释性语言,无论是虚拟机,还是对应反编译工具都是有一个固定的opcode的顺序,有意识的安全厂商会通过修改对应的opcode的顺序进行保护,如下图所示:左边是正常opcode的顺序,右边是进行随机化以后的opcode的;

这样从新编译处理完以后的luac可以看到如下图所示:对应的opcode是不一样的;

opcode不一样以及对应的解释顺序是如下:

目前对于这种自定义修改opcode的处理方式,目前攻击者可以根据通过目标虚拟机加载Lua文件跟正常虚拟机编译的luac进行对比“吐出”对应的映射表,然后进一步的借助于反编译工具进行反编译处理进一步的处理;

或者由于Lua自身的opcode不是很多,如上图所示可以很轻松的定位到正常的执行顺序;因此这种处理方式也不是很安全。

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自带的加密,大部分的厂商会通过如下设置自己私有的key和sign值;

以及调用对应的XXTEA的加密算法,可以看到经过加密以后得到如下的luajit的编码形式:

面对上面这种加密的处理方式,解密也非常的简单:

一是可以使用HOOK在关键的函数处进行内存DUMP;

二是也可以通过反编译代码,如下图所示为某知名游戏对应的key和sign值,然后调用XXTEA进行解密可以得到标准的luajit的形式;然后结合反编译器进行反编译修改等等;

三、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#的组合带来了十分强大的功能,但也难免存在被破解的风险。

安全攻击常常以代码为目标,达到破解软件的目的。在导致泄露的网络安全“短板”中,代码安全是最本质、最核心的问题。

不可否认的是,在数字经济时代,对于科技企业而言,代码既是著作权的一部分,也是核心商业机密之一。核心代码一旦泄露,导致软件的核心技术外流,这对于企业几乎是致命的打击。

黑客在砸壳、逆向之后,“裸奔”的代码就面临全部暴露的风险,增加加密算法十分有必要。

知物由学 | Lua脚本保护的前世今生相关推荐

  1. 深入分析 Redis Lua 脚本运行原理

    Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题.Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向服务器发送 lua 脚本来执 ...

  2. nx set 怎么实现的原子性_【redis进阶(1)】redis的Lua脚本控制(原子性)

    [toc] 为什么要用lua 减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成.使用脚本,减少了网络往返时延. 原子操作:Redis会将整个脚本作 ...

  3. 欲求不满之 Redis Lua 脚本的执行原理

    Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题.Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向服务器发送 lua 脚本来执 ...

  4. lua脚本加密,lua代码加密使用说明

    概述 xLua加密工具主要是一款Lua安全编译器,配置好xLua环境后,用几维提供的libluajit.a替换对应的默认文件,来实现对Lua文件的加密,加密后的Lua文件只能由几维提供的lua byt ...

  5. python写梦幻西游手游脚本辅助_深入解析Lua脚本加密技术,给游戏代码加上“紧箍咒”...

    不少安全专家表示,在互联网上失去对代码的控制,就像把银行的设计图交给抢劫犯一样. Lua是一种被广泛用于游戏开发中的计算机语言,方便开发者定制自己所需的功能.其中,红遍全球的<愤怒的小鸟> ...

  6. 浅析android手游lua脚本的加密与解密

    2018.05.02更新 这段时间在翻备份的硬盘,突然发现了以前的分析项目和代码,从里面提取了之前附件的内容,现在上传给大家,真是柳暗花明又一村啊.附件包括201703版本的梦幻手游里面提取的so文件 ...

  7. Redis学习笔记 - Lua脚本(2) - Lua脚本的实现

    参考:<<Redis设计与实现>> 注:这本书是基于Redis3.0版本写的,和后面的版本有点差异 Redis中Lua脚本相关命令介绍以及简单使用,参考博客:https://b ...

  8. Redis:EVAL执行Lua脚本

    EVAL 脚本 numkeys 键[键...] arg [arg ...] 自Redis2.6.0版本起可用. 时间复杂度:取决于执行的脚本. EVAL介绍 EVAL和EVALSHA用于从Redis2 ...

  9. lua脚本的加密与解密简单介绍

    1.lua脚本在手游中的现状 略. 2.lua.luac.luaJIT三种文件的关系 在学习lua手游过程中,本人遇到的lua文件大部分是这3种.其中lua是明文代码,直接用记事本就能打开,luac是 ...

最新文章

  1. 手机耗电统计app_Android O新特性:精确统计APP电量消耗
  2. mysql 实现按首字母字典序排序以及根据字段汉字首字母搜索
  3. 【LeetCode笔记】剑指 Offer 31. 栈的压入、弹出序列 (Java、栈)
  4. 最小权顶点覆盖问题分析
  5. 使用linux_使用 AppImage 进行 Linux 软件包管理 | Linux 中国
  6. charles测试学习 手机端连接电脑进行抓包分析
  7. 如何查找专栏(知乎专栏汇总)
  8. win10配置内外网同时使用
  9. linux系统sdio接口wifi编程,3个SDIO接口WiFi模块/WiFi+蓝牙组合模块介绍-SKYLAB
  10. 废弃台式计算机类别,废旧台式电脑(台式机)属于什么垃圾分类?
  11. 【疑难杂症】VScode底部状态栏不见、设置默认文件编码方式
  12. HDLBits Exams/ece241 2013 q4 水库题
  13. 关于QTableWidget 表头设置无效的原因
  14. java简单游戏制作教程,使用指南
  15. CTP程序化交易入门系列之一:准备
  16. 类别型数据的预处理方法
  17. airpods自动连接不上_首先在airpods pro上收听空间音频
  18. 今晚8点:手把手教你使用 ART-Pi 入门 TOUCHGFX
  19. tslib交叉编译与测试
  20. 代码中“发票”的英文

热门文章

  1. 个人前端学习笔记 html5+css(保持更新)
  2. 正交基 matlab,matlab基础学习(五)之映射和正交基
  3. 接口分析--今日头条天气数据接口
  4. TikTok刷赞刷评论刷播放有用吗?
  5. 杀不死的Webshell
  6. 关于逾期率你所不知道的秘密
  7. draggable拖拽组件的使用
  8. Qt嵌入浏览器开发——下载编译
  9. 怎么弄出满屏幕的字_怎么把屏幕字体全部显示出来
  10. 江西计算机信息科学,张光河 - 江西师范大学 - 计算机信息工程学院