有什么方法能从cocos creator构建的游戏里还原出live2d或spine动画资源?

找到l2d少的部分配置文件的位置了,在apk包的res下有个data.bin文件 用十六进制显示查看看到 里面有json这样的文件名称 认为应该就是配置文件了 看到pk以为是压缩包 改zip尝试解压不能成功


分析了一下包内内容 看到里面有明文也有部分乱码 发现乱码似乎有之前解l2d bin的头部特征 猜测应该是采用gzip压缩的 通过分析 我个人认为的包体结构是这样的 包体文头部分23个字节 应该包含文件大小和文件数什么的 我不太清楚具体怎么划分的 就都算在头部里面了 然后是配置json文件名称 占41字节 不过还有一种短的配置json文件名称 占14个字节 然后1个字节 判断是否压缩 01则代表压缩 如果是 则用三个字节代表文件原来的大小 再用三个字节代表压缩文件的大小 然后2字节 00 29 用于分开两个文件 如果是非压缩 则为00 然后三个字节代表文件大小 文件内容后2字节 00 29 按此规则解包 包体最后10个字节代表尾部 按照这个逻辑写了个python代码 将json文件解包出来

import os
import gzip

filepath =r"C:\Users\zjbook\Desktop\新建文件夹\data.bin"
outputpath = r"C:\Users\zjbook\Desktop\新建文件夹\output"

with open(filepath,"rb") as f :
    data = f.read()
    data = data[23:-10]

i = 0
while i < len(data):
    if data[i:i+41][-4:] == b'json':
        file_name = data[i:i+ 41].decode('utf-8')
        i += 41
        if data[i:i + 1] == b'\x01':  # 压缩文件
            file_length = int.from_bytes(data[i:i + 7][-3 :], byteorder='big')
            i += 7
            file_content = gzip.decompress(data[i:i + file_length])
            i += file_length + 2
            with open(os.path.join(outputpath, file_name), 'wb') as f :
                f.write(file_content)
                f.close()

        elif data[i:i + 1] == b'\x00':  # 非压缩文件
            file_length = int.from_bytes(data[i:i + 4][-3 : ], byteorder='big')
            i += 4
            file_content = data[i:i + file_length]
            i += file_length + 2

            with open(os.path.join(outputpath, file_name), 'wb') as f :
                f.write(file_content)
                f.close()

    elif data[i:i+14][-4:] == b'json':
        file_name = data[i:i + 14].decode('utf-8')
        i += 14
        file_length = int.from_bytes(data[i:i + 7][-3:], byteorder='big')
        i += 7
        file_content = gzip.decompress(data[i:i + file_length])
        i += file_length + 2
        with open(os.path.join(outputpath, file_name), 'wb') as f:
            f.write(file_content)
            f.close()

        if data[i:i + 1] == b'\x01':  # 压缩文件

            file_length = int.from_bytes(data[i:i + 7][-3:], byteorder='big')
            i += 7
            file_content = gzip.decompress(data[i:i + file_length])
            i += file_length + 2
            with open(os.path.join(outputpath, file_name), 'wb') as f:
                f.write(file_content)
                f.close()

        elif data[i:i + 1] == b'\x00':  # 非压缩文件
            file_length = int.from_bytes(data[i:i + 4][-3:], byteorder='big')
            i += 4
            file_content = data[i:i + file_length]
            i += file_length + 2
            with open(os.path.join(outputpath, file_name), 'wb') as f:
                f.write(file_content)
                f.close()

    else:

        print("解包失败,位置在",i)
        break

然后根据之前的经验 来还原moc3和贴图的名称 不过仍有几张图片名称没找到对应 不太清楚为什么 不过不重要 名称已经还原了 然后根据名称 把高分辨率的图片找出来 高分辨率的名称都是texture没办法 只能手动找了 语音的配置文件也找到了 不过还没还原 估计也少 l2d动作很多 不怎么好做lpk和wpk 就直接分享吧 也懒得做配置了 就弄了个基础配置 看了下应该没什么问题 这次用的夸克盘 zgirl3 l2d 夸克好像有点问题不知道会不会被过滤 我又加了一个123压缩密码 百度网盘我也传了一份

其实是我怕不止百度网盘,而是所有要登录帐号并验证手机号码下载的网站服务… :dizzy_face:

看完了,然后自己尝试解了一遍,我靠,这个解包我写代码我就总共写了不下500行,太麻烦了

看来未来有一堆游戏会从u3d跳到这个cocos creator上开发
所以我感觉到未加密就门槛就难受…
https://jsoneditoronline.org/ 先推荐个json编辑工具来分析import文件夹里的文件或者拆分xxx.model3.json
问题关键是怎样解index.jsc GitHub - NickMonkeys/CocosCreatorJscDecrypt: 解密CocosCreator构建的jsc文件 (我没法运行java脚本也就没试下去)
然后根据资源的uuid/文件名反向从import文件夹的json甚至index.jsc中找对应的话,能否减少解包代码行数?
比如说这个zgirls3除了热更新外是不是还有资源从服务器下载到手机本地?

大佬,很抱歉过节的时候打扰你,但是看帖操作的时候发现连接炸了,实在心痒难耐,所以恳请您上线的时候有空补个链接