简介corona-archiver是一个面向Solar2D/Corona游戏开发者、Mod制作者及安全研究者的Python脚本工具用来打包和解压缩.car存档文件。通过命令行指定输入输出路径即可把资源目录封装为.car或将已有.car完整解开适用于游戏资源提取、汉化替换、存档编辑和备份恢复等常见工作流。整个资源包共6个文件核心代码由2个Python脚本构成同时配有依赖说明、使用文档和开源许可压缩后大小仅6KB结构精炼也便于迁移部署。目前已有302人学习浏览作者额外提供了Windows可直接运行的exe程序即使本机没有Python环境也能通过命令行完成同样操作。脚本基于标准库编写命令格式直观学习成本很低即可上手操作。更难能可贵的是源码清楚展示了.car的内部组成包含4字节标识魔数、版本修订号、数据区起始偏移和索引区大小等关键字段读者既能直接用于处理手头文件也可以借此掌握Solar2D资源归档的编码规则并将打包解包能力集成到自己的自动化构建或资源分析流程中提升日常开发效率。 做 Solar2D老玩家更习惯叫它 Corona SDK项目的朋友多半都跟 .car 文件打过交道。游戏打包出来之后Lua 脚本、图片、音频、config.lua 这些资源会被引擎统一打成一个后缀为 .car 的归档文件Android 的 assets 里、iOS 的 bundle 里都有它的身影。这个格式官方只在构建流程里用平时你想把里面的资源单独捞出来看看或者改完一张图再塞回去会发现手边缺一个趁手的工具。corona-archiver 就是为这个场景写的一个纯 Python 实现的小脚本既能解包 .car 文件也能把整个目录重新打包回 .car全程不需要装 Corona 或 Solar2D 编辑器。对做素材抽取、mod、本地化补丁以及排查“资源没生效”问题的人来说这个工具非常实用而且它只依赖 Python 标准库拿到就能跑新手和老手都能直接用。1. .car 是什么一个只属于 Corona/Solar2D 的资源包1.1 两个名字一个引擎Corona SDK 与 Solar2D 的关系先把绕口的名字理清楚。Corona SDK 是早年很流行的移动端 2D 游戏引擎主打 Lua 脚本驱动开发开发者写 Lua 逻辑引擎负责打包成 iOS、Android 原生应用。后来引擎开源改名叫 Solar2D所以你在网上搜 Corona、Solar2D甚至 CoronaSolar2D 这种混写指的都是同一个东西。项目标题里的“CoronaSolar2D”其实就是大家把新旧两个名字拼在一起了不用纠结。只要看到 .car 后缀基本就能确定这是来自 Corona/Solar2D 构建流程里的产物。1.2 为什么引擎不使用现成的 zip.car 是 Corona Archive 的缩写是引擎自有的资源归档格式。它的作用和 zip 类似都是把一堆零散文件打包成一个文件但引擎没有直接用通用压缩包主要是三个原因。一是读取效率。引擎启动时希望基于目录表快速定位单个资源而不是像 zip 那样先扫描中央目录再逐个解压。.car 的结构非常简单头部读完直接拿到条目表一次 seek 就能跳到目标资源。二是完整性校验。每条资源都带 CRC32 校验值加载时能立刻发现包损坏这对手机上的弱网更新场景很重要。三是格式私有。早期也算给资源加了一层“防君子不防小人”的保护虽然这层保护现在基本等于装饰但历史原因确实存在。1.3 谁需要 corona-archiver什么场景下用这个工具面向的典型场景包括从自己的构建产物里抽出素材做复盘、写 mod 替换游戏资源、给本地化版本改文本配置、以及把两个构建打出来的 .car 做 diff排查为什么某个改动没有进包。我自己最常用的场景是排障。游戏里一张图没显示与其猜是代码问题还是资源问题不如直接把 .car 解开看看目标图片到底在不在、路径对不对、CRC 是否一致。十次里至少有七次问题都出在“资源压根没进包”或者“路径大小写不匹配”上。需要提醒的是解包本身没有技术门槛但请只处理你自己有权使用的文件。别人打包好的商业游戏未经授权就别拿去改包分发这个边界大家心里有数就好。2. 逆向笔记.car 的头、条目表、名字区和数据段2.1 整体布局和 zip 对比着看.zip 的结构是“一堆本地文件头 数据 中央目录”.car 比它更简单核心是“一个头 一张条目表 一段名字区 一大块数据区”数据挨个拼接在文件末尾。用一张表表示大概是区域内容说明Header签名“CORONA”6 字节 版本号 4 字节 条目数量 4 字节魔数不对就直接报错Entry Table每条 20 字节重复 N 次记录名字哈希、偏移、大小、校验值Name AreaN 个字符串长度前缀或 null 结尾两种都见过Data AreaN 个文件内容可能压缩可能裸存解包的核心逻辑就是读头拿到版本和条数读条目表知道每个资源在哪、多大、是不是压缩的读名字区知道每个条目对应什么文件路径最后按偏移把数据捞出来写盘。2.2 条目表里五个字段各管什么每个条目固定 20 字节是五个 uint32名字哈希、数据偏移、原始大小、压缩后大小、CRC32 校验值。名字哈希是运行时快速查找用的文件内容在数据区解包时不关心哈希也能工作因为真正的路径字符串在名字区里。数据偏移是相对于文件开头的绝对偏移原始大小是解压后的字节数压缩后大小是存盘时的字节数校验值是对原始数据算的 CRC32。2.3 v1 与 v2压缩和校验怎么判断我见过的 .car 主要有两个版本版本号分别是 0x01000000俗称 v1和 0x01010000俗称 v2。两者的核心区别在于压缩v1 基本是裸存compressed_size 和 size 相等v2 引入了 zlib 压缩payload 是标准的 zlib 流。所以解包时有个通用判断逻辑如果 compressed_size ! size就对读出来的数据做 zlib.decompress否则直接当原始数据用。解出来之后再算一遍 CRC32和条目里存的校验值对比能快速发现是不是读错了位置。这个“压缩则解压解完必校验”的套路是所有归档解析工具的基本功。2.4 端序、名字哈希、路径规范化端序是这类逆向工具翻车的重灾区。Solar2D 的 C 端读取在不同版本里写法不完全一致有的按小端读有的按大端写 Python 工具时不要想当然第一步就是拿一个已知样本验证端序。名字哈希也不是什么神秘算法常见实现是 CRC32(规范化后的相对路径)规范化指的是把路径分隔符统一成/Windows 下的反斜杠必须转掉。3. corona-archiver 的核心设计解包与打包两条主线3.1 为什么这个工具适合用 Python 写选 Python 不是随意拍板。这个工具需要的全部能力——struct 解析二进制、zlib 压缩解压、argparse 做命令行参数、os 处理路径——都在标准库里不需要装任何第三方依赖。对于游戏开发者和 modder 来说Python 也是接受度最高的脚本语言拿过来就能看懂、能改、能定制。另一个理由是跨平台。Corona/Solar2D 的项目资源在 Windows、macOS、Linux 上都可能产生一个python3 xxx.py到处能跑不用为每个平台编译一份二进制。后面如果你真需要分发给不懂 Python 的人再考虑用 PyInstaller 打包成 exe这是后话。3.2 解包主线从魔数到逐条落盘解包路径先是解析头部魔数不对直接报“不是标准 .car 文件”import struct import zlib import os def read_car_header(f): if f.read(6) ! bCORONA: raise ValueError(不是标准的 .car 文件) version, count struct.unpack(2I, f.read(8)) return version, count接着读条目表每条 20 字节拆成五个字段。注意端序下面的是小端如果你的样本发现解析结果全是乱码优先把它换成试试。class Entry: __slots__ (name, name_hash, offset, size, compressed_size, checksum) def __init__(self, name_hash, offset, size, compressed_size, checksum): self.name_hash name_hash self.offset offset self.size size self.compressed_size compressed_size self.checksum checksum self.name def read_entry(f): fields struct.unpack(5I, f.read(20)) return Entry(*fields)解包单条资源的核心方法就是“seek 到偏移读 compressed_size 字节按需解压校验落盘”def extract_entry(f, entry, output_dir): f.seek(entry.offset) payload f.read(entry.compressed_size) if entry.compressed_size ! entry.size: payload zlib.decompress(payload) if (zlib.crc32(payload) 0xFFFFFFFF p a hrefhttps://download.csdn.net/download/weixin_42131861/18427052 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p