博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
血族手游Lua脚本及资源文件解密
阅读量:4043 次
发布时间:2019-05-24

本文共 1859 字,大约阅读时间需要 6 分钟。

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

快速分析

下载最新的血族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


参考文章链接

你可能感兴趣的文章
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
coursesa课程 Python 3 programming The while Statement
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>
浅析:setsockopt()改善程序的健壮性
查看>>
关于对象赋值及返回临时对象过程中的构造与析构
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>
SQL 多表联合查询
查看>>
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>