血族手游Lua脚本及资源文件解密
本帖最后由 abel_xu 于 2018-1-13 12:54 编辑#快速分析
下载最新的血族apk并解压之后看到**assets\lua**可以猜测这个游戏是由cocos2d-lua开发的。打开其中的一个lua脚本看到里面都是乱码而且开头也没有特征值,应该不是使用xxtea加密的。
!(http://upload-images.jianshu.io/upload_images/2977663-1a0c4fa74f92219f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
打开png图片提示无法读取该文件。
!(http://upload-images.jianshu.io/upload_images/2977663-6c1b875388f06192.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
打开**lib\armeabi**文件夹,libgame.so是最大的也是等一下分析的重点文件。
!(http://upload-images.jianshu.io/upload_images/2977663-07f9758974a52b17.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>快速分析小结
>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脚本是在第一个红色方框处进行解密操作。
!(http://upload-images.jianshu.io/upload_images/2977663-d80ae69e7043b652.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**lua_load**调用了**CCFileUtilsAndroid::getFileData**,接着调用**CCFileUtilsAndroid::doGetFileData**,然后调用**decryptFile**。其实所有的资源都是在**decryptFile**中进行解密操作。根据文件类型主要分为三大类:png、jpg、其他加密文件(Lua,csv,xml)。
!(http://upload-images.jianshu.io/upload_images/2977663-c3557f6a31c2674f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
###cocos2d::decryptTxt分析
在接下去分析会发现这三个类型的解密过程都是大同小异,先是判断该文件是否已经加密,如果加密了就调用了**cocos2d::decryptData**进行真正的解密,只是传入的参数有所差异。下面用**cocos2d::decryptTxt**作为例子
!(http://upload-images.jianshu.io/upload_images/2977663-0da608fbefee5eef.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
1.判断文件最后第4个字节到最后第2个字节是否为**0x53 0x44 0x47**
2.调用**cocos2d::decryptData**进行解密操作,传入的参数只用到了前三个。第一个:开始解密的位置。第二个:需要解密的大小。第三个:用于后续解密的“密钥”
!(http://upload-images.jianshu.io/upload_images/2977663-d2275e5ed7254f3b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
###cocos2d::decryptData分析
解密的步骤如下:
1.将需要解密的第一个字节和“密钥”异或
2.将需要解密的最后一个字节和“密钥”异或
3.将第一个字节和最后一个字节交换
4."密钥" =("密钥"+1)%0xff
...
解密的步骤还是比较简单的稍微花点时间就能看懂。
!(http://upload-images.jianshu.io/upload_images/2977663-393aa949f504f728.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>**静态分析小结**
>函数调用的顺序是:
>1.**cocos2dx_lua_loader**lua脚本加载函数
>2.**cocos2d::CCFileUtilsAndroid::GetFileData**
>3.**cocos2d::CCFileUtilsAndroid::doGetFileData**
>4.**cocos2d::decryptFile**选择对应的解密函数
>5.**cocos2d::decryptTxt**判断是否需要解密
>6.**cocos2d::decryptData**解密完成
---
#动态分析
在lua_load和loadbuffer下断点
!(http://upload-images.jianshu.io/upload_images/2977663-c105cb61cbd01acd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
!(http://upload-images.jianshu.io/upload_images/2977663-0baf079908ea890f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
点击游戏里的一些按钮触发断点,当运行到loadbuffer断点的时候,lua脚本源码已经出现在内存中了
!(http://upload-images.jianshu.io/upload_images/2977663-f044076323313a75.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>R1:脚本的起始位置
>R2:脚本的长度
可以使用IDC脚本将lua代码保存到本地
!(http://upload-images.jianshu.io/upload_images/2977663-1ee0f930a1b09390.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
效果源码如下图
!(http://upload-images.jianshu.io/upload_images/2977663-960193d9fcaab431.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>动态调试总结
>在loadbuffer关键函数下断点可直接获得解密后的代码
>使用IDC脚本将代码保存下来
>优点:省略分析加解密算法的步骤,配合hook框架可以将运行过的代码都获取到
>缺点:没运行到的代码依然得不到
---
最后放几张jpg,png解密后的图片和解密脚本的效果
!(http://upload-images.jianshu.io/upload_images/2977663-5785db98127c39df.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
!(http://upload-images.jianshu.io/upload_images/2977663-8134939dddca4abe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![解密脚本效果.png](http://upload-images.jianshu.io/upload_images/2977663-d76b9e6ebab80dd3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
###详细代码已经上传github
python版本3.6
**[脚本代码链接](https://github.com/bigkan/decrypt-xuezu)**
###参考文章链接
[浅析android手游lua脚本的加密与解密](https://bbs.pediy.com/thread-216969.htm)
(http://gad.qq.com/article/detail/21645) 杀阡陌爱花千骨 发表于 2018-1-12 13:08
感谢分享技术帖。学习了,不过我遇到的lua脚本都是配合unity热更新使用的
还没碰到过lua脚本配合unity热跟新的。当时只是想看看图片而已,做到最后的时候发现解密的地方是同一个就把资源和脚本一起做了。 楼主这个是MT1的老游戏了。能帮我看看TAB的解密同加密过程吗。成功有心意~~
链接:https://pan.baidu.com/s/1slXATfZ 密码:xgcu 感谢分享 学习啦 参考了,感谢分享了 666.思路可以啊 F5大法万岁 多谢楼主分享{:301_993:} 就没有你们破解不了的软件 天天脱壳 我都懂很多了 感谢分享了,谢谢楼主 参考了,感谢分享了 感谢分享 学习啦