记一次半吊子逆向工程的…不那么艰难的过程。
「逆向学习笔记 - Cocos2d Lua逆向提取资源 」难弟篇
前言
最近刷到一款某道换皮手游,玩法和美术风格都是我喜欢的类型。于是想着做点逆向学习,顺便捞一手美术资源。
动手
一个某道换皮手游,解压安装包:
1 | ├── AndroidManifest.xml |
注意到 assets/main.js 文件,根据 assets 目录结构猜测是 Cocos Creator 项目。
打开 lib 目录,下面子目录对应不同 CPU 架构。
1 | ├── arm64-v8a |
通过libcocos2djs.so结合刚才的main.js可以确定是 Cocos Creator 项目。
res 目录一般是 Android 工程的 Icon、Logo 等文件(忽略)。assets/assets 是我们要找的资源目录,随便挑一张图片文件打开是这样的:
通过文本编辑器打开内容是这样的:
打开多个文件发现头都是VZ7sx4MGw4这几个字符,猜测是 XXTEA 算法(是不是有点耳熟)。
分析
把 libcocos2djs.so 拖入 IDA 工具静态分析,点击 View->Open Subviews->Strings,搜索VZ7sx4MGw4,如果能够搜到就最简单,双击VZ7sx4MGw4进入 Hex View 页面能看到 Key(CeAcMKM6QveeNpymbm2v) 就在附近。
当然也可以直接搜索xxtea,找到jsb_set_xxtea_key函数,伪代码中的 v8 就是 Key(jiuzhou2025-6-10)。
等一下,为什么两个 Key 不一样!
先给结论,CeAcMKM6QveeNpymbm2v 并不是用于 XXTEA 的 Key。
顺着这个 Key 的交叉引用一路跟进,可以定位到 getDataFromFile 函数,发现以下这段代码基本确定是 XOR 算法。
解密资源
确定是 XOR 算法之后,解密逻辑就相当简单了。
1 | func main() { |