Palworld存档逆向工程:深度解析palworld-save-tools的技术实现
Palworld存档逆向工程深度解析palworld-save-tools的技术实现【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools在《Palworld》这款备受瞩目的生存游戏中玩家们的游戏进度和珍贵回忆都存储在神秘的.sav文件中。这些文件采用Unreal Engine的序列化格式对普通玩家和技术爱好者来说如同黑盒。palworld-save-tools项目通过逆向工程破解了这一难题实现了.sav文件与JSON格式的双向转换为游戏数据分析、存档编辑和二次开发打开了技术大门。技术挑战Unreal Engine存档的复杂结构解析Palworld的存档文件采用了Unreal Engine特有的序列化机制这种机制在游戏开发中广泛使用但对逆向工程提出了严峻挑战。主要的难点包括压缩格式的复杂性Palworld存档采用自定义的压缩算法包含单层和双层zlib压缩两种模式需要精确识别和正确处理。二进制数据结构的深度嵌套游戏中的实体如玩家角色、帕鲁、建筑、物品容器等都采用复杂的嵌套结构存储需要精确解析每个字段的含义。Unreal Engine特有的数据类型如GUID全局唯一标识符、FStringUnreal字符串、FTransform变换矩阵等特殊数据类型需要特殊处理。版本兼容性问题不同游戏版本可能修改数据结构工具需要保持向前和向后兼容。解决方案模块化的逆向工程架构palworld-save-tools采用了分层架构设计将复杂的解析任务分解为多个独立的模块核心解析引擎FArchiveReader/FArchiveWriter项目的核心是FArchiveReader和FArchiveWriter类它们实现了Unreal Engine序列化格式的读写接口。这两个类提供了完整的二进制数据解析能力# 示例向量数据的读取 def vector(self) - tuple[Optional[_float], Optional[_float], Optional[_float]]: x self.float() y self.float() z self.float() return (x, y, z)数据类型映射系统项目通过paltypes.py定义了Palworld特有的数据类型映射这是逆向工程的核心成果# 关键数据结构类型定义 PALWORLD_TYPE_HINTS { .worldSaveData.GroupSaveDataMap: MapProperty, .worldSaveData.CharacterSaveParameterMap: MapProperty, .worldSaveData.MapObjectSaveData: MapProperty, # ... 更多类型定义 }自定义属性解析器每个游戏实体都有对应的解析器模块如character.py处理角色数据item_container.py处理物品容器# 角色数据解析示例 def decode_bytes(parent_reader: FArchiveReader, char_bytes: Sequence[int]) - dict[str, Any]: 解析角色二进制数据为结构化字典 reader parent_reader.internal_copy(bytes(char_bytes), parent_reader.debug) return { type: reader.fstring(), properties: reader.properties_until_end(), }技术实现细节从二进制到JSON的完整流程1. 压缩层处理sav文件首先需要解压缩palworld-save-tools通过palsav.py模块处理这一过程def decompress_sav_to_gvas(data: bytes) - tuple[bytes, int]: # 解析文件头识别压缩类型 magic_bytes data[8:11] save_type data[11] # 支持单层和双层zlib压缩 if save_type 0x31: uncompressed_data zlib.decompress(data[data_start_offset:]) elif save_type 0x32: # 双层压缩需要两次解压 uncompressed_data zlib.decompress(data[data_start_offset:]) uncompressed_data zlib.decompress(uncompressed_data) return uncompressed_data, save_type2. GVAS格式解析解压后的数据是Unreal Engine的GVASGame Virtual Address Space格式gvas.py模块负责解析这种格式class GvasFile: def __init__(self, header: GvasHeader, properties: dict[str, Any]): self.header header self.properties properties classmethod def read(cls, data: bytes, type_hints: dict[str, str] {}, custom_properties: dict[str, tuple[Callable, Callable]] {}) - GvasFile: # 解析GVAS文件头和数据 reader FArchiveReader(data, type_hintstype_hints, custom_propertiescustom_properties) header GvasHeader.read(reader) properties reader.properties_until_end() return cls(header, properties)3. 游戏特定数据解析这是工具最复杂的部分需要理解Palworld的游戏逻辑# 在character.py中解析角色属性 def decode(reader: FArchiveReader, type_name: str, size: int, path: str) - dict[str, Any]: 解析角色保存参数 if type_name StructProperty: struct_type reader.fstring() if struct_type PalCharacterParameterSaveData: # 读取角色特有的属性 return { struct_type: struct_type, id: reader.guid(), unknown_bytes: reader.byte_list(1), type: reader.fstring(), raw_data: reader.property(ArrayProperty, size - 49, path), } return None4. JSON序列化与反序列化json_tools.py模块提供了自定义的JSON编码器处理特殊数据类型class CustomEncoder(json.JSONEncoder): 自定义JSON编码器处理UUID等特殊类型 def default(self, obj): if isinstance(obj, UUID): return str(obj) # 处理其他特殊类型 return super().default(obj)实际应用场景与技术价值存档分析与数据挖掘通过将.sav文件转换为JSON技术爱好者可以分析游戏状态查看玩家等级、资源数量、帕鲁属性等关键数据统计游戏进度分析游戏时长、完成度、收集进度等识别游戏模式区分单人游戏、多人合作、专用服务器等不同模式存档编辑与自定义工具的双向转换能力支持角色属性修改调整玩家等级、技能、属性点物品管理添加、删除或修改物品库存世界状态调整修改游戏时间、天气、难度设置服务器管理与迁移对于服务器管理员工具提供了存档迁移在不同服务器实例间迁移玩家数据数据备份创建存档的快照和备份问题诊断分析损坏的存档文件尝试修复技术亮点与设计哲学无依赖设计项目坚持无额外依赖的设计原则仅使用Python标准库# pyproject.toml中的配置 [project.optional-dependencies] # 这些是仅用于测试的依赖 # 库的默认使用不能依赖任何外部依赖 tests [ parameterized0.9.0, mypy1.8.0 ]正确性优先开发团队强调转换过程的正确性比性能更重要SAV JSON SAV应该产生比特级相同的文件压缩前模块化架构每个游戏实体都有独立的解析模块便于维护和扩展palworld_save_tools/ ├── rawdata/ │ ├── character.py # 角色数据 │ ├── item_container.py # 物品容器 │ ├── map_object.py # 地图对象 │ ├── group.py # 组织/公会 │ └── ... # 其他实体性能优化策略虽然正确性是首要目标但项目仍包含多项性能优化选择性解析通过--custom-properties参数仅解析需要的部分数据JSON最小化使用--minify-json减少输出文件大小内存优化流式处理大文件避免一次性加载全部数据开源生态与社区贡献palworld-save-tools已经形成了一个活跃的开源生态上游项目作为基础库被多个工具使用下游应用如PalEditGUI编辑工具、palworld-server-tool服务器管理工具社区协作通过GitHub Issues和Pull Requests持续改进技术展望与未来方向随着Palworld游戏的更新工具也在不断进化新数据结构的支持持续逆向工程新的游戏版本性能优化改进内存使用和解析速度API扩展提供更丰富的编程接口工具链完善开发更多辅助工具和可视化界面结语开源逆向工程的价值palworld-save-tools不仅是一个技术工具更是开源社区协作的典范。它展示了如何通过逆向工程理解复杂的游戏数据格式为游戏数据分析、存档管理和二次开发提供了技术基础。对于技术爱好者而言这个项目是学习二进制数据解析、游戏逆向工程和开源协作的绝佳案例。通过深入理解Palworld存档的结构开发者可以创建更丰富的工具生态玩家可以获得更个性化的游戏体验而整个游戏社区则因为这样的开源项目而更加繁荣。这正是开源软件和逆向工程技术为游戏产业带来的独特价值。【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考