欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

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

来源:本站整理 作者:佚名 时间:2018-03-07 TAG: 我要投稿

之前一直和朋友在玩手游血族,有一天朋友问我能不能把里面某个角色的立绘拿下来,当时没多想就答应了,以为只要解压找到图片就行了。但是万万没想到,图片竟然打不开(被加密了)。
快速分析
下载最新的血族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个字节是否为0×53 0×44 0×47 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:脚本的长度。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载