资讯详情

Cocos Creator 2.4 APK逆向:完整还原游戏资源与工程

📅 2026/9/16 20:48:51 | 华诺云谱 👁 阅读
Cocos Creator 2.4 APK逆向:完整还原游戏资源与工程
做逆向这东西最重要的是先搞清楚你面对的是什么。Cocos Creator 2.4打包出来的APK和常规安卓APK不一样它核心逻辑和资源都塞在assets目录里而assets目录又分成src、res、library、settings四块。你如果没做过一次完整的逆向光看apktool解出来的那一堆文件很容易被绕晕。我这次要分享的是一次真实操作把一个Cocos Creator 2.4版本的APK拆开把里面的游戏资源完整提取出来再还原成一个能在Cocos Creator 2.4编辑器里直接打开、继续编辑的工程。这次实战里踩了不少坑尤其是资源引用关系、meta文件生成和脚本还原几块网上讲得都不细。我尽量把每一步的操作、原理和避坑点都写清楚适合刚接触APK逆向、或者卡在资源提取阶段想进阶的人。1. 项目概述Cocos Creator 2.4 APK逆向到底要解决什么问题1.1 逆向对象与核心需求Cocos Creator 2.4是Cocos引擎在2.x时代的一个成熟版本很多中轻度游戏都用它做资源管理遵循一套固定的规则。打包成APK之后游戏主逻辑通常会编译成JavaScript或转成ByteCode放在assets的src目录下美术资源、配置表、音频则放在res或library里。逆向目标一般有两种一种只想要美术资源和配置表用于做数据还原或风格参考另一种是想把皮肤、场景、脚本引用关系一起还原让整个工程能在编辑器里跑起来。前者相对简单后者比较麻烦。我这次对应的需求是后者完整提取并还原工程。1.2 为什么不能只靠解包工具一键搞定很多人以为拿到APK用Apktool解包就完了实际上Apktool解出来的只是一个壳Cocos资源是经过gzip压缩、打包进assets下的jsb-adapter或者application里的。资源索引文件通常叫config.json或settings.json记录了每个资源的uuid、url和类型。如果不处理这些索引直接把assets拖进Cocos Creator编辑器根本认不出来。我自己的经验是百分之八十的时间花在处理索引和文件路径而不是解包本身。这次分享适合这几类人想从竞品工程中学习资源组织方式的开发者接手了一个没有源项目的老APK需要做技术交接的人以及单纯对资源还原感兴趣、想搞懂Cocos资源格式的爱好者。不需要你是逆向专家但至少得用过Cocos Creator知道什么是场景、预制体、材质球不然后期还原工程时会比较被动。2. 逆向前的准备工具选型与原理解读2.1 Cocos Creator 2.4的assets目录结构在还原之前必须先搞懂Cocos Creator 2.4打包后的资源在APK里长什么样。正常打包后APK里会有这样一个核心目录assets存放工程的所有资源包括场景、预制体、图片、脚本、音频、图集等。打包后可能以.dat或序列化二进制文件出现也可能保持原始文件。library编辑器导入资源后生成的对象缓存比如fromation、import、uuid映射。APK里不一定有但如果有会非常有用。src打包后的脚本代码可能是明文js也可能是压缩混淆过的js。res原始资源目录比如图片、音频、字体通常是明文。如果没加密基本直接可用。settings项目设置包括构建配置还有version等。另外在assets目录下可能还有jsb-adapter看到这个基本可以确认是Cocos Creator 2.x。这个目录里一般放的是运行时适配脚本比如jsb-adapter-main.js对还原工程有一定参考价值但不需要完整还原。2.2 工具清单与分工我这次实战用到的工具全部来自常见开发者工具链不涉及任何花哨的“一键逆向”商业软件Apktool用于解包APK拿到完整assets目录和部分配置文件。jadx用于反编译Java层主要查看入口Activity、SDK初始化逻辑以及是否有资源解密代码。7-Zip或Python zipfile用于直接把APK当zip解压有时比Apktool更快更稳。VS Code或Sublime Text用于查看和搜索JSON、JS文件尤其是大文件里的uuid索引。Node.js或Python用于编写资源重命名、meta文件生成脚本。Cocos Creator 2.4编辑器用于最终验证还原成果。我本地装的是2.4.10。我建议不要用一些“全自动逆向神器”因为Cocos资源还原非常依赖项目结构全自动工具经常把资源和脚本对应关系搞乱最后还是得手动修。半自动脚本配合手动检查最可控。2.3 环境版本兼容问题Cocos Creator 2.4有多个小版本资源格式差异不大但meta文件格式有差异。还原工程时最好安装目标游戏用的相同主版本。比如你从libcocos.so或项目配置里看到是2.4.6就尽量用2.4.6或2.4.7编辑器打开。版本相差太大的话编辑器会做一次导入迁移可能把资源文件的序列化版本改了反而让引用关系变乱。我建议在还原之前先用jadx打开APK在assets/settings里找version文件或者用文本搜索“2.4.”能定位到具体引擎版本。3. 资源提取实操从APK拆包到assets整理3.1 用Apktool解包APK先说最常规的操作用Apktool解包APKjava -jar apktool.jar d game.apk -o game_apk解包后重点关注game_apk/assets/ game_apk/lib/ game_apk/classes.dexApktool会把资源文件反编译并重排但我们只需要assets目录。lib目录下的libcocos.so可以留着确认引擎版本。AndroidManifest里的入口activity对资源提取影响不大不过如果APK用了壳加固Apktool可能直接报错这种情况我会改用直接当zip解压的方式。注意Apktool解包时有时候会报“Failed to load dex”或者“resource file mismatched”这种通常是因为APK加固、资源混淆或签名校验。不用纠结直接把APK当zip解压很多时候能绕过这些问题。3.2 提取并整理Cocos资源解包后进入assets目录。看到类似下面的结构assets/ jsb-adapter/ src/ res/ library/ settings/ main.js project.json cocos2d-js-min.js其中project.json是入口配置记录了模块设置用文本编辑器打开看看可以了解游戏启用哪些模块。接下来最关键的是res目录原始资源通常直接躺在里面。但有时候Cocos会做资源打包文件不按原始路径摆放而是用uuid作为文件名比如图片文件可能叫4a7b2c45-0b41-4d0b-9d53-6c52e0c8a1e7.png场景文件是scene.json或者带后缀的序列化文件图集可能是.plist加.png需要成对保留如果你看到assets下还有多个.bundle或.zip文件那可能用了Asset Bundle。Asset Bundle在2.4里是很常见的分包方式比如“main”、“resources”、“ui”、“audio”等。这些bundle文件本身也是zip压缩包可以解压出对应子包内容。解压后保留原目录关系别打散。3.3 处理加密/自定义压缩资源有些游戏会对assets目录做整体加密。遇到这种情况我一般分三步处理用jadx在Java层搜索“assets”相关的解密逻辑很多游戏会在入口Activity里读取某个key然后用AES或XOR解密文件到临时目录。如果只是gzip压缩识别二进制头即可开头是1F 8B说明是gzip直接用Python的gzip库解压。如果文件头被篡改比如自定义魔数那需要写脚本批量替换文件头或者根据已知明文样本找回key。这属于深度定制的逆向了不展开讲。不过大部分Cocos Creator 2.4中小游戏不会加密加密的大多是海外发行或重度商业项目。我这次处理的就是未加密情况所以直接按标准流程走。4. 还原工程的完整流程从资源到可打开的Cocos Creator项目4.1 重建项目目录骨架要还原可打开的Cocos Creator工程最少要有这几个东西package.json编辑器识别项目的标识文件。assets/资源目录必须存在。settings/项目设置可让编辑器读取到历史配置。library/可选编辑器会自动生成但有的话能省去导入时间。如果APK里没有library完全不用担心Cocos Creator编辑器有“导入资源时自动生成library”的功能。但assets内部结构必须合理meta文件要齐全。手动创建工程目录mkdir restored_project mkdir restored_project/assets mkdir restored_project/settings touch restored_project/package.jsonpackage.json最简单的版本{ name: restored-game, version: 1.0.0, creator: { version: 2.4.10 } }如果你提取到的res目录里有config.json或project.json最好一起放回去。settings目录里如果是空的也没关系编辑器能用默认配置启动。4.2 资源文件与meta文件的对应关系Cocos Creator通过meta文件记录资源类型、uuid、导入参数。新建工程时编辑器会自动为每个资源生成meta文件但在逆向还原时我们希望保留原来的uuid因为场景、预制体里的引用全部依赖uuid。然而APK中不一定打包meta文件所以我们需要根据引用关系重建meta。具体思路是从assets下的场景、预制体、JavaScript文件里提取所有uuid字符串格式通常是xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。将uuid与文件路径建立映射。这个映射在打包后的config.json中通常能直接找到比如Cocos Creator 2.4生成的resources索引。每个资源文件旁边创建一个同名的.meta文件。meta文件里的uuid必须与场景引用一致否则编辑器会当成新资源引用就会断掉。meta文件模板{ ver: 1.1.48, importer: texture, imported: true, uuid: 替换为资源uuid, files: [], subMetas: {}, userData: {} }有些资源类型有扩展字段比如Atlas需要维护subMetas音频需要设置加载方式但没有这些字段编辑器也会自动补全所以先用基础模板就能跑起来。4.3 用脚本批量生成meta文件手动给几百个资源文件写meta不现实我用Python写了个扫描脚本遍历assets目录为每个文件生成同名.meta。如果通过config.json能拿到原始uuid就直接用原始uuid拿不到的话就先用相对路径稳定映射一个uuid保证编辑器能导入。下面的代码是简化版本但核心逻辑可以跑import os import json import uuid def load_config(config_path): with open(config_path, r, encodingutf-8) as f: return json.load(f) def build_uuid_map(config): uuid_map {} # 以实际config结构为准这里假设有assets字段 for item in config.get(assets, []): uuid_map[item[path]] item[uuid] return uuid_map def scan_and_gen_meta(root_dir, uuid_map): for root, dirs, files in os.walk(root_dir): for name in files: if name.endswith(.meta): continue full_path os.path.join(root, name) rel_path os.path.relpath(full_path, root_dir) meta_path full_path .meta if os.path.exists(meta_path): continue # 优先用已有uuid其次用相对路径生成 file_uuid uuid_map.get(rel_path) or str(uuid.uuid3(uuid.NAMESPACE_URL, rel_path)) importer get_importer(name) meta { ver: 1.1.48, importer: importer, imported: True, uuid: file_uuid, files: [], subMetas: {}, userData: {} } with open(meta_path, w, encodingutf-8) as f: json.dump(meta, f, indent2, ensure_asciiFalse) def get_importer(filename): if filename.endswith((.png, .jpg, .jpeg)): return texture if filename.endswith((.plist, .atlas)): return sprite-atlas if filename.endswith(.mp3): return audio-clip if filename.endswith(.json): return json return default注意这种随机uuid方式会导致内部引用“对不上”。所以只要源APK里有config.json或类似索引文件优先解析它拿原始uuid。随机uuid只是兜底方案用来让工程启动起来后续需要手动调整。4.4 还原场景、预制体与脚本引用关系场景和预制体在Cocos Creator 2.4里通常以JSON数组形式存储节点树、组件、属性。还原工程后如果meta正确场景文件就可以直接在编辑器打开。但脚本引用是个大问题脚本组件引用的字段可能存的是脚本uuid和脚本类名。如果脚本被压缩过编辑器无法编译场景打开就会报“missing script”。我的处理办法是把脚本尽量还原成可阅读的JS。如果脚本被压缩混淆先用prettier或js-beautify格式化再搜索cc.Class、property、_className这类定义提取出关键类名和属性然后为每个脚本生成一个最小可编译版本cc.Class({ extends: cc.Component, properties: { speed: { default: 1, type: cc.Float }, enemyPrefab: { default: null, type: cc.Prefab } }, onLoad() { // 原逻辑无法还原保留空实现 }, start() { // placeholder } });把这个JS文件放到assets/Scripts目录下并保持原脚本的meta uuid不变编辑器就能把场景里的“脚本组件”对应到新文件上。这个方法可以解决大量“脚本找不到”的报错。如果是字节码脚本那就只能放弃脚本逻辑只还原场景可视化部分。5. 常见问题与排查技巧实录5.1 场景打开黑屏/缺贴图缺贴图很多时候是UUID映射错误。Cocos Creator 2.4在场景里引用图片时不是按文件名而是按uuid。如果你meta里uuid写错了编辑器会加载默认白色块或直接显示“Missing”。排查方法用文本编辑器打开场景文件找到出现问题的图片uuid再去config.json里查这个uuid对应的原始路径然后重新生成meta文件。我碰到过很多次图集和散图uuid错位的情况基本都是因为从不同bundle复制资源时没有同步更新meta。5.2 脚本压缩/混淆导致报错如果你看到src目录下是一大串压缩的JS先试着格式化。再搜索cc.Class、cc._RF.push、_className等关键字定位到类定义。如果脚本内部直接调用了jsb.reflection.callStaticMethod这样的原生接口那说明游戏用到了Android原生扩展这部分逻辑在JS层不完整不用纠结还原。重点是把组件名和属性名保住让编辑器能顺利加载场景。5.3 Apktool解包报错或资源被加固前文提到过如果Apktool解包失败直接把APK当zip解压用重命名把game.apk改成game.zip。用7-Zip打开直接解压assets目录。如果有签名校验通常只影响运行不影响静态资源读取。这个办法在针对Cocos游戏时特别有用因为Cocos资源基本都在assets下根本不需要完整反编译dex。我甚至有几次直接改后缀为zip拖出来就拿到了全部资源。5.4 工具选型避坑不要用Unity AssetStudio新手最容易踩的坑用Unity的AssetStudio或UnityStudio去打开Cocos资源结果什么都看不到。原因很简单Cocos和Unity的资源格式完全不同。Cocos资源是JSON或二进制序列化依赖引擎运行时来反序列化Unity AssetStudio只认Unity的AssetBundle和FBX等格式。所以尽量使用Cocos官方的资源管理思路或者自己写解析脚本。与其花时间找“万能逆向工具”不如老老实实把Cocos资源目录结构搞明白。6. 写在最后个人经验与扩展思路我实际操作下来Cocos Creator 2.4 APK逆向最大的门槛不在于“解包”而在于“把资源按编辑器能接受的格式放回去”。尤其是meta文件和uuid映射一旦对齐整个工程就能恢复大半。工具方面我自己整理了一个小型工具包里面包含assets目录扫描复制脚本config.json解析与uuid映射脚本meta文件批量生成脚本JS脚本格式化与类名提取脚本场景文件引用关系替换脚本因为没有做GUI命令行就够用了。如果你只想要美术资源那可能不到半小时就能完成但想还原完整可编辑工程要做好心理准备脚本逻辑能恢复多少完全看有没有加密和混淆。最后再分享一个小技巧在解包前先用jadx看下assets/settings里的引擎版本号如果发现是2.4.6那就尽量用2.4.6或2.4.7编辑器来打开还原工程。版本不匹配虽然能打开但容易出现资源迁移误改反而让引用关系变得不可控。这是我还原三四个项目后总结出来的最省事经验。逆向本来就是反复试错的过程你能把索引和引用关系理顺这个项目就算成功一大半了。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。