Lua游戏逆向及破解方法介绍

Andy-ho

Andy-ho

2017-09-23 16:17

随着手游的发展,越来越多的Cocos-lua端游开发者转移到手游平台。Lua脚本编写逻辑的手游也是越来越多,如梦幻西游、刀塔传奇、开心消消乐、游龙英雄、奇迹暖暖、疾风猎人、万万没想到等手游。随着Lua手游的增加,其安全性更值得关注,在此归纳一些常用的分析方法,同时介绍一些辅助工具。

  背景介绍

  随着手游的发展,越来越多的Cocos-lua端游开发者转移到手游平台。Lua脚本编写逻辑的手游也是越来越多,如梦幻西游、刀塔传奇、开心消消乐、游龙英雄、奇迹暖暖、疾风猎人、万万没想到等手游。随着Lua手游的增加,其安全性更值得关注,在此归纳一些常用的分析方法,同时介绍一些辅助工具。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/android/)

  识别Lua游戏

  Android平台的apk包可以直接解压,找到./lib目录下的so逻辑模块,一个个分析其so,寻找是否内嵌lua引擎(一般情况下,最大的so最有可能内嵌lua引擎)。如果有libcocos2dlua、libhelLOLua字样,其内嵌lua引擎的可能性极大。

  将可疑so拖入IDA,查看lua引擎字符串,找到如图1所示的lua引擎内字符串,那该手游基本就可以确定是内嵌了一个lua引擎,有极大可能是用lua编写游戏逻辑。

095814lnd3kztdxqpn6gdx.png

  图1. Lua引擎相关字符串

  也可以配合留意下解压出来的assets目录下,是否包含脚本信息。这类信息一般是加密的(也有很多安全意识薄弱的是直接lua脚本明文存放的),但有个明显特征是:有多个文件存放。如图2和图3所示,分别是两款非常火热的Lua手游的assets目录下的lua脚本信息。其中D手游仅是对luac进行加密,而M手游则是连名字也弄个哈希加密。

095814ea6662zd6n66mayo.png

  图2. Lua手游asserts下可疑脚本信息案例手游D

095815uo80h80okfeohz7z.png

  图3. Lua手游asserts下可疑脚本信息案例手游M

  破解思路

  Lua手游的破解主要分成两步,一步是能获取游戏lua脚本;第二步是替换lua脚本。核心是找到lua脚本,然后修改生效。不同安全级别的手游,相应的lua脚本获取时机点会有所不同。(本质是沿着Lua引擎加载lua脚本的整条加载链,如图4所示,去不断分析找到合适时机点dump和替换。)

  另一类思路,是辅助工具常用的方法,比如叉叉的lua手游辅助。只需要获取游戏lua脚本信息,然后无需替换,而是直接加载自身的一个lua脚本(该脚本和游戏脚本在同一个命名空间,可直接修改游戏脚本数据,调用函数)。

  一、 直接assets资源可获取lua脚本

  这类比较初级,在assets目录下可获得lua或者luac源码。

  针对lua源码类型,直接修改然后apktool重打包即可。

  针对luac源码类型(luac是lua编译的lua字节码文件,包含lua脚本所有信息,具体可搜索lua字节码文件结构),可以使用unluac等开源项目/工具反编译回lua源码。然后修改直接替换回修改后的lua源码文件即可(lua引擎加载脚本的时候,会识别luac magic number判断是lua源码还是luac,直接替换源码下去是不会影响脚本加载执行的)。

  二、 在luaL_loadbuffer函数处获取

  luaL_loadbuffer是一个走得比较频繁的加载点。Cocos引擎的lua加载器为cocos2dx_lua_loader,如图4所示,最终都是调用luaL_loadbuffer函数来加载。一般厂商会在这层上面对lua脚本进行解密,既是在luaL_loadbuffer函数获取buff参数可得到解密后的lua脚本。修改逻辑后可以直接在这个点替换回去。

095815b3faaryqahu2qyar.png

  图4. cocos2dx_lua_loader函数

  三、 更底层的reader函数处获取

  lua引擎加载lua脚本最底层是到lua_reader函数。该函数负责最底层的脚本buff遍历,因此在此处dump出来的lua脚本是最纯正的lua脚本,所有加密都已经被去除(修改lua opcode或者引擎逻辑除外)。

  不过这个点的获取不到足够的文件信息(文件名、buff index等),需要配合上层函数拼凑lua脚本。

  常用工具

  一、 IDA工具

  可以进行动态调试和静态分析的工具,能在合适的位置下断点,修改指定寄存器和编写IDC脚本配合分析(这里可用来dump luac文件),不多介绍。

  二、 ChunkSpy

  用于解析lua字节码文件结构,方便luac的学习与阅读。

  三、 unluac

  Unluac是一个lua反编译器开源项目,可将luac文件反编译为lua代码。针对梦幻西游、刀塔传奇等修改了lua opcode的手游,在静态分析确认还原opcode后,可修改这个项目打包出个对应版本的反编译工具(直接修改OpcodeMap.java里的map,改成对应游戏修改后的Opcode即可)。

  常用逻辑修改方法

  (1)修改全局变量(全局配置之类的)

  (2)update函数的调用逻辑修改(不update或者update多次)

  (3)敌人类、主角类、武器类、技能的初始化过程,属性修改

  (4)一些过程处理函数的逻辑修改(如伤害计算、命中部位判定等)

  实战案例

  案例一:修改全局变量(开心消消乐暴分)

  在lua_reader函数可直接dump出游戏lua源码,在其/zoo/gamePlay/GamePlayConfig.lua文件中配置了游戏分数奖励等属性,修改如图5 所示为几个特效额外得分即可轻松暴分。

095815jc4dj8lv88b3n3xj.png

  图5. 开心消消乐分数配置表

  案例二:多次调用游戏响应函数(刀塔传奇快速战斗)

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/android/)

  这里给出叉叉的一个例子。叉叉针对刀塔传奇有相应的辅助,其中快速战斗实现如图6 所示:是通过HOOK了update函数(lua中函数名是指针,备份原先函数指针,直接重写即可实现HOOK),在update函数尾调用10次tick实现。

095815osw3afoawyiikofa.png

  图6. 叉叉实现快速战斗

  案例三:修改函数内部逻辑(开心消消乐增加步数)

  在lua_reader函数可直接dump出游戏lua源码,如图7 所示:MoveMode::useMove函数负责处理步数扣除,直接修改为增加10步即可实现步数增加功能。

095816i7kge9hspnzu7lhj.png

  图7. 开心消消乐步数修改

  小结

  Lua手游相对来说,还是不够安全的。因为lua引擎不仅是开源的,而且相对python等脚本引擎更简单。辅助作者在lua引擎底层如鱼得水。上面介绍的分析破解思路,就是沿着lua引擎加载脚本的函数链进行分析,找到一个解密后的点dump出脚本,针对脚本进行详细分析,尝试构造攻击点破解版游戏实现辅助功能。

展开更多 50%)
分享

猜你喜欢

Lua游戏逆向及破解方法介绍

Android
Lua游戏逆向及破解方法介绍

《权力的游戏》开箱及游戏介绍

电脑网络
《权力的游戏》开箱及游戏介绍

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

《地铁2033》开箱及游戏介绍

电脑网络
《地铁2033》开箱及游戏介绍

《传送门2》游戏心得及游戏介绍

电脑网络
《传送门2》游戏心得及游戏介绍

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

游戏也可训练孩子逆向思维

分娩
游戏也可训练孩子逆向思维

孩子的逆向思维从游戏开始

分娩
孩子的逆向思维从游戏开始

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

手机淘宝差评怎么删除 淘宝如何删除差评

手机淘宝差评怎么删除 淘宝如何删除差评

淘宝怎么投诉卖家 淘宝投诉流程图解

淘宝怎么投诉卖家  淘宝投诉流程图解
下拉加载更多内容 ↓