前言
近日看石头门0的动画入迷了,想要入手个游戏来玩玩。
近期steam刚好又有打折活动,不过可惜石头门0只有10%折扣,所以还是以后再买了。
但是石头门打折40%,于是乎又想回顾一下剧情,所以就。。。买!买!买!(买情怀)
当我通关全线后,忽然发现壁纸很久没换了,想换套壁纸,上网搜寻一番mpk解包工具,无果,于是乎就萌生了现在这个Mpk文件解析的念头。
文件结构
虽然mpk的文件结构简单,但是由于没有足够的样本,并不能推敲出所有参数。
结构分析图
为了直观的表达,以下为文件结构分析图。
结构解析
以下带“?”的项为不确定项,有可能为其它情况。
名称 | 说明 | 类型 | 备注 |
---|---|---|---|
magic | 文件标识 | char[4] | 用于判断是否为mpk文件 |
version | 文件版本 | int | 值:131072,数据:00 00 02 00 |
count | 文件数量 | int | |
空白 | byte[52] | 由0填充 | |
files | 文件信息 | file_info[count] | 参考下方结构体 |
空白 | byte[?] | 由0填充,大小不定 | |
data | 数据 | byte[?][count] | 大小由file_info决定 |
- file_info(struct) - 文件信息
名称 | 说明 | 类型 | 备注 |
---|---|---|---|
is_zip | 是否压缩? | int | 由0填充,估计是int,用于判断压缩 |
index | 索引 | int | |
offset | 偏移位置 | long | |
data_size | 数据大小 | long | 值与后者一致,有可能为压缩大小 |
zip_size | 压缩大小? | long | 估计为压缩大小,但未发现压缩样本 |
name | 文件名 | char[224] |
有以上信息,已经足以制作提取工具了,所以也不往下探索了。(我只是想要提取cg当壁纸而已)
下载
随着分析的完成,接着一番code之后,解包工具完成。
-
Windows(拖放文件到exe即可,需要VC2015环境)