enpitsulin

cocos2d手游逆向——XXTEA加密

因为最近在玩一款挂机类的手机游戏,但是玩的挺难受,网上搜了几篇文章,起了点逆向的兴趣。

遂拿起半吊子的技术尝试照猫画虎。

开始

先是将手机安装的 APK 文件导出,直接 adb pull 将/data/app 里的 APK 文件拉取。

然后解压查看 lib 目录发现

lib目录|717x138

很明显这是一款基于 cocos2dlua 开发的手游,然后来到\assets\src 目录下

src目录|720x168

不过直接打开显示乱码,显然是经过加密的。

前期思考

网上搜索 cocos2d 加密,根据文件的内容结构,应该是以 cocos2dlua 默认的加密方法 XXTEA 算法进行加密的。

这种算法拥有相应的标识符和密钥,所以被加密的 lua 文件开头的一串FF98392D应该就是相应的标识

sign标识|1051x508

接下来需要拿到密钥,直接拿起 IDA 对 cocos2dlua.so 进行调试。用 IDA 打开 so 等待自动分析完成,然后建立 string list,直接搜索这个标识FF98392D

定位到密钥和标识|673x73

可以看到一个奇怪的字符串 witu_xxWEM,然后使用网上下载的 XXTEADecrypt 软件进行解码。

然后心满意足的打开.lua 脚本,惊讶的发现还是不可读的乱码。

还是乱码|1060x241

不过这个文件的前几个字节还是一样的有标识LJ 所以我想是不是还是经过了一层 XXTEA 的加密。

于是我将LJ当做标识,IDA 里继续搜索LJ获得 Key,但是这次没有一个看似正确的结果。于是只能对汇编的代码进行分析。

半吊子汇编

在查阅 cocos2dlua 的资料后,我知道程序载入资源基本是通过 luaLoadBuffer,许多直接 hook 函数解码的方法也是对该函数进行 hook。

于是我就搜索 luaLoadBuffer 这个函数,与源码比对,发现似乎有点不一样。似乎是定义了自己的函数对密钥进行操作然后再调用官方的 decrypt()

不过找了好久都没有头绪

豁然开朗

因为分析了半天还是没有得出有用的结论,开始在搜索引擎上瞎找。

然后在搜索 LJ+cocos 关键词发现,用 UltraEdit 打开前几个字节是 LJ 的话,说明这个文件是通过 LuaJIT 编译后的文件。

所以思路就不对(〃>皿<)

结局

网上对 Luajit 的相关资料都好老,下次再慢慢整。

然后完全第一次搞逆向玩,了解到 IDA 这个神奇的工具,心想大概还需要汇编方面的知识,有机会这次之后好好学习。

cocos2d手游逆向——XXTEA加密

https://enpitsulin.xyz/blog/coco2d-decrypt/

Author

enpitsulin

Posted on

Updated on

Licensed under