cocos2d手游逆向——XXTEA加密
因为最近在玩一款挂机类的手机游戏,但是玩的挺难受,网上搜了几篇文章,起了点逆向的兴趣。
遂拿起半吊子的技术尝试照猫画虎。
开始
先是将手机安装的 APK 文件导出,直接 adb pull 将/data/app 里的 APK 文件拉取。
然后解压查看 lib 目录发现

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

不过直接打开显示乱码,显然是经过加密的。
前期思考
网上搜索 cocos2d 加密,根据文件的内容结构,应该是以 cocos2dlua 默认的加密方法 XXTEA 算法进行加密的。
这种算法拥有相应的标识符和密钥,所以被加密的 lua 文件开头的一串FF98392D应该就是相应的标识

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

可以看到一个奇怪的字符串 witu_xxWEM,然后使用网上下载的 XXTEADecrypt 软件进行解码。
然后心满意足的打开.lua 脚本,惊讶的发现还是不可读的乱码。

不过这个文件的前几个字节还是一样的有标识LJ 所以我想是不是还是经过了一层 XXTEA 的加密。
于是我将LJ当做标识,IDA 里继续搜索LJ获得 Key,但是这次没有一个看似正确的结果。于是只能对汇编的代码进行分析。
半吊子汇编
在查阅 cocos2dlua 的资料后,我知道程序载入资源基本是通过 luaLoadBuffer,许多直接 hook 函数解码的方法也是对该函数进行 hook。
于是我就搜索 luaLoadBuffer 这个函数,与源码比对,发现似乎有点不一样。似乎是定义了自己的函数对密钥进行操作然后再调用官方的 decrypt()
不过找了好久都没有头绪
豁然开朗
因为分析了半天还是没有得出有用的结论,开始在搜索引擎上瞎找。
然后在搜索 LJ+cocos 关键词发现,用 UltraEdit 打开前几个字节是 LJ 的话,说明这个文件是通过 LuaJIT 编译后的文件。
所以思路就不对(〃>皿<)
结局
网上对 Luajit 的相关资料都好老,下次再慢慢整。
然后完全第一次搞逆向玩,了解到 IDA 这个神奇的工具,心想大概还需要汇编方面的知识,有机会这次之后好好学习。
cocos2d手游逆向——XXTEA加密
Author
enpitsulin
Posted on
Updated on