血族手游Lua脚本及资源文件解密


 
  之前一直和朋友在玩手游血族。有一天朋友问我能不能把里面某个角色的立绘拿下来。当时没多想就答应了,以为只要解压找到图片就行了。但是万万没想到,图片竟然打不开(被加密了)。

 

快速分析

 
  下载最新的血族apk并解压之后看到assets\lua可以猜测这个游戏是由cocos2d-lua开发的。打开其中的一个lua脚本看到里面都是乱码而且开头也没有特征值,应该不是使用xxtea加密的。
 

story Lua.png
 
  打开png图片提示无法读取该文件。
 

png报错.png
 
  打开lib\armeabi文件夹,libgame.so是最大的也是等一下分析的重点文件。
 

libgame.png

 
快速分析小结

  1. 血族使用cocos2d-lua开发
  2. lua脚本和一些重要资源都已经被加密,但不是用官方的xxtea
  3. 加解密是由libgame.so进行


     

    静态分析libgame.so

     
      用IDA打开libgame.so,文件较大打开时间比较长。打开字符串窗口可以快速获得一些重要信息。比如LuaJIT2.0.1、Lua5.1等等。
      lua脚本由cocos2dx_lua_loader加载,最后由lua_loadbuffer函数加载到内存中。动态分析一般会在这两个地方下断点,然后将lua脚本dump下来。

 

cocos2dx_lua_loader分析

 
  找到cocos2dx_lua_loader之后f5查看反汇编代码。根据之后的动态调试分析可以知道,lua脚本是在第一个红色方框处进行解密操作。
 

Lua_load.png
 
  lua_load调用了CCFileUtilsAndroid::getFileData,接着调用CCFileUtilsAndroid::doGetFileData,然后调用decryptFile。其实所有的资源都是在decryptFile中进行解密操作。根据文件类型主要分为三大类:png、jpg、其他加密文件(Lua,csv,xml)。
 

decryptFile.png

 

cocos2d::decryptTxt分析

 
  在接下去分析会发现这三个类型的解密过程都是大同小异,先是判断该文件是否已经加密,如果加密了就调用了cocos2d::decryptData进行真正的解密,只是传入的参数有所差异。下面用cocos2d::decryptTxt作为例子
 

decryptTxt特征.png

    1.判断文件最后第4个字节到最后第2个字节是否为0x53 0x44 0x47
    2.调用cocos2d::decryptData进行解密操作,传入的参数只用到了前三个。第一个:开始解密的位置。第二个:需要解密的大小。第三个:用于后续解密的“密钥”


lua特征.png

 

cocos2d::decryptData分析

  解密的步骤如下:

1.将需要解密的第一个字节和“密钥”异或
2.将需要解密的最后一个字节和“密钥”异或
3.将第一个字节和最后一个字节交换
4."密钥" =("密钥"+1)%0xff
...

  解密的步骤还是比较简单的稍微花点时间就能看懂。
 

decryptData.png
 
静态分析小结
函数调用的顺序是:

1.cocos2dx_lua_loaderlua脚本加载函数
2.cocos2d::CCFileUtilsAndroid::GetFileData
3.cocos2d::CCFileUtilsAndroid::doGetFileData
4.cocos2d::decryptFile选择对应的解密函数
5.cocos2d::decryptTxt判断是否需要解密
6.cocos2d::decryptData解密完成


 

动态分析

 
  在lua_load和loadbuffer下断点
 

lua_load断点.png
 

loadbuffer断点.png
 
  点击游戏里的一些按钮触发断点,当运行到loadbuffer断点的时候,lua脚本源码已经出现在内存中了
 

loadbuffer动态调试.png

 

  • R1:脚本的起始位置
  • R2:脚本的长度

 
  可以使用IDC脚本将lua代码保存到本地
 

idc脚本.png
 
  效果源码如下图
 

storyLua源码.png
 
动态调试总结

在loadbuffer关键函数下断点可直接获得解密后的代码
使用IDC脚本将代码保存下来
优点:省略分析加解密算法的步骤,配合hook框架可以将运行过的代码都获取到
缺点:没运行到的代码依然得不到


 
  最后放几张jpg,png解密后的图片和解密脚本的效果
 

png解密.png
 

解密脚本效果.png

 



 

详细代码已经上传github

 
脚本代码链接

 



 

参考文章链接

 
浅析android手游lua脚本的加密与解密
Lua游戏逆向及破解方法介绍

原文地址:http://blog.51cto.com/13620939/2084071

时间: 2024-11-07 10:58:43

血族手游Lua脚本及资源文件解密的相关文章

关于cocos2dx手游lua文件加密的解决方案

很多使用cocos2dx+lua做游戏的同学,都会想到一个问题,我的游戏一旦发布,怎样才能保证的我脚本代码不被破解,不泄露代码.虽然这和开源.共享的原则不合,但是代码也是coder的劳动成果,理应得到保护.特别是商业游戏更是如此,不希望被别人破解掉源码并且进行修改. 今天的话题就是如何实现lua脚本文件的加密和解密. 我在网络上查过,解决方案http://www.ijiami.cn/appprotect_mobile_games然后我经过考虑之后,总结出两种解决方案,供大家参考. 1.轻量级的解

关于cocos2dx手游lua文件加密的解决方式

非常多使用cocos2dx+lua做游戏的同学.都会想到一个问题,我的游戏一旦公布,如何才干保证的我脚本代码不被破解.不泄露代码.尽管这和开源.共享的原则不合.可是代码也是coder的劳动成果,理应得到保护. 特别是商业游戏更是如此,不希望被别人破解掉源代码而且进行改动. 今天的话题就是怎样实现lua脚本文件的加密和解密. 我在网络上查过,都没有成熟的解决方式.然后我经过考虑之后,总结出两种解决方式,供大家參考. 1.轻量级的解决方式.APK打包之前,用工具把全部的lua文件加密,详细是将lua

mir9-lua——《热血沙城》45度ARPG手游-Lua移植版

mir9--<热血沙城>,是9秒论坛开源的一个使用Cocos2d-x-2.2.1引擎开发的45度ARPG手游Demo,源代码为c++.mir9-lua是mir9的Lua移植版,使用Quick-Cocos2d-x-2.2.5引擎开发.由于移植得比较匆忙,代码写得可能比较混乱,请见谅. 已知Bug: 1.Label字体在Windows上面显示模糊 2.小地图在已是最左或最下的情况下,仍可以向上或或向滑动一段距离,并且不弹回原样 3.切换地图后小地图还是打开状态,并且显示的是之前的小地图 4.人物移

Unity手游之路&lt;十一&gt;资源打包Assetbundle

http://blog.csdn.net/janeky/article/details/17652021 在手游的运营过程中,更新资源是比不可少的.资源管理第一步是资源打包.传统的打包可以将所有物件制成预设Prefab,打包成场景.今天我们来一起学习官方推荐的Assetbundle,它是Unity(Pro)提供的资源打包策略.利用AssetBundle,可以将几乎所有的资源都打包封装,便于客户端更新下载新的资源. (转载请注明原文出处http://blog.csdn.net/janeky/art

在Unity3d中解析Lua脚本的方法

由于近期项目中提出了热更新的需求,因此本周末在Lua的陪伴下度过.对Lua与Unity3d的搭配使用,仅仅达到了一个初窥门径的程度,记录一二于此.水平有限,欢迎批评指正. 网络上关于Lua脚本和Unity3d的配合使用的资料不多,例子工程大多相同.大概了解到针对性的插件有uLua.UniLua.KopiLua三种.试用了前两种,抛开效率与安全性不说,感觉uLua试用起来比较简单,本文只介绍uLua的使用步骤. uLua的原理是在Unity3d中解析字符串形式的Lua脚本,让Lua与C#相互传递参

【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePacker工具来加密的,不过针对性还是不够强. 分析一下原理为: 1,转格式:将需要加密的文件转为流的方式: 2,加密:根据自己需要使用加密手段,MD5,AES,甚至可以直接改变位移,加一些自己的特殊字符也可以使文件简单加密,加密完后基本保证 图片类型基本用特殊软件预览不了也打不开,Lua文件加密后一片乱

(转)Unity3D研究院之手游开发中所有特殊的文件夹(assetbundle与Application.persistentDataPath)

这里列举出手游开发中用到了所有特殊文件夹. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor  和 /Editor 是一样的,无论多少个叫Editor的文件夹都可以.Editor下面放的所有资源文件或者脚本文件都不会被打进发布包中,并且脚本也只能在编辑时使用.一般呢会把一些工具类的脚本放在这里,或者是一些编辑时用的DLL. 比如我们现在要做类似技能编辑器,那么编辑器的代码放在这里是再好不过了,因为实际运行

手游公司运维之利用Rundeck自动化运维工具和Shell脚本构建测试环境代码发布平台和生产环境代码发布平台

在做手游运维工作之前,我接触的代码发布都是常规的软件发布,有固定的发布周期.之前工作的那个外企有严格的发布周期,一年中的所有发布计划都是由Release Manager来控制,每次发布之前都需要做一些准备工作,如填写发布表单,上传发布需要的资源文件,联系发布过程中的相关人员,如开发和测试.最后在公司内部开发的发布平台上按照指定的时间点击鼠标对一个集群内的几台主机或全部主机进行代码发布.这个发布平台还是基于rsync服务实现的.虽然每个星期都有各种服务的发布,但是整个发布流程是可以控制的,并且发布

基于cocos2dx的2D手游美术资源制作技术选型(2)--动作编辑器选择

Cocostudio是cocos2dx官方提供的游戏制作工具,其中包含了动作编辑器,其编辑好的动画导出的文件有三种:Atlastexture,json的AtalasTexture描述文件和plist动画描述文件,可以使用LibExtension Amature加载和播放. 但Cocostduio的动作编辑器也有一些不足的地方: 1. Cocostduio的崩溃率较高,很容易造成编辑过程中的数据丢失 2. Cocostudio的动作编辑方式对美术来说学习成本大,使用上也多不方便,美术对此非常抗拒