有什么方法能从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压缩密码 百度网盘我也传了一份