在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
之前一直和朋友在玩手游血族。有一天朋友问我能不能把里面某个角色的立绘拿下来。当时没多想就答应了,以为只要解压找到图片就行了。但是万万没想到,图片竟然打不开(被加密了)。 快速分析下载最新的血族apk并解压之后看到assets\lua可以猜测这个游戏是由cocos2d-lua开发的。打开其中的一个lua脚本看到里面都是乱码而且开头也没有特征值,应该不是使用xxtea加密的。 story Lua.png 打开png图片提示无法读取该文件。 png报错.png 打开lib\armeabi文件夹,libgame.so是最大的也是等一下分析的重点文件。 libgame.png
静态分析libgame.so用IDA打开libgame.so,文件较大打开时间比较长。打开字符串窗口可以快速获得一些重要信息。比如LuaJIT2.0.1、Lua5.1等等。 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
lua特征.png cocos2d::decryptData分析解密的步骤如下:
解密的步骤还是比较简单的稍微花点时间就能看懂。 decryptData.png
动态分析在lua_load和loadbuffer下断点 lua_load断点.png
loadbuffer断点.png 点击游戏里的一些按钮触发断点,当运行到loadbuffer断点的时候,lua脚本源码已经出现在内存中了 loadbuffer动态调试.png
可以使用IDC脚本将lua代码保存到本地 idc脚本.png 效果源码如下图 storyLua源码.png
最后放几张jpg,png解密后的图片和解密脚本的效果 png解密.png 解密脚本效果.png 详细代码已经上传github 参考文章链接 浅析android手游lua脚本的加密与解密 |
请发表评论