[PJADV] 封包结构分析
目标游戏:ティンクル☆くるせいだーすPSS v.1.19
这篇就详细写一下,后面就全当读者有相关背景知识,因为这样写实在很累(
假设结构
先正常安装游戏,并打上更新补丁(如果太乱可以先不打更新补丁,视情况而定)(是不是可以观察一下打补丁前后变化?补丁本身?)
先浏览一遍游戏的目录,尽可以收集信息,方便之后仔细分析。
可用看到游戏目录下有两个ini
文件,一个记录了各个封包名的字段,一个记录了存档目录(注意这个ini
文件的编码为sjis(从图中可见它在GBK下乱码了))
-
从
archive.ini
推测应该是和封包加载有关,或者只是个记录文件,可以尝试修改这个ini看看效果 -
从
install.ini
文件内只有个存档路径来看,有可能只是个存档路径设置文件
游戏封包为.dat后缀,用winhex查看并对比一下不同的封包(使用winhex查看后发现instdata.pak其实也是一样结构的封包)
对比封包的时候尽量选中体积小的,这样可以比较容易看出封包的结构,有些时候根本不用调试分析游戏,就可以直接看出结构
先来对比一个封包结构,依据经验,封包开头一般都有一段标识数据,用来识别该结构的封包文件
多查看几个封包后,可以发现,每个封包的头12个字节都是 GAMEDAT PAC2
,这个一般叫标识头,或者signature,反正就是拿来方便程序判断这个文件确实是它需要的文件。
然后对比紧接着的4个字节
这里是因为依据一般的封包结构,一个封包一般会有 标识头,文件索引表,文件数量等字段,索引表一般里面还包括文件名,文件数据的偏移,文件数据的大小之类的信息,而文件偏移,大小,数量,这些字段一般都是4个字节,但也不一定,所以实际上是不是这样,也不一定,比如文件数量可以通过索引表算出来,偏移和大小也不一定要同时有,文件名也不一定需要,所以对于这种猜测,应该大胆假设,小心求证,从这也说明,应该多了解几个游戏的封包文件结构,总结把握大概的雏形和规律。
可以发现,extenPSS101.dat
的标识头后4个字节,是0xA,而instdata.pak
是0x9,那么他们分别代表什么呢?我们可以大胆的猜,比如可能是索引表的大小?索引表的偏移?或者只是单纯的版本、优先级标记?又或者是文件数量?或者说现在还猜不出来,那么我们就先看下面的数据
下面的数据就简单了
不难发现,这个是文件名,而且每个文件名的长度最大就32个字节,由于这个封包里的文件很少(这也就是为什么选择体积小的封包分析的原因,如果体积太大,有些结构或成员可能一下子看不出来),那么我们算一下文件名的个数,恰好是10个,那么是不是证明这4个字节是文件数量?
为了求证这点,我们可以多打开几个封包算一下文件名个数,反复对比后会发现,这个4个字段确实是和文件数量对应的。
那么现在我们对封包结构的猜测可以写成这样
struct PAJ_Pack_FileName
{
char aFileName[32];
};
struct PAJ_Pack
{
char aSignature[12];
uint32_t uiFileCount;
PAJ_Pack_FileName aNameList[uiFileCount];
// data..
};
好了,现在,我们应该只差文件的大小和文件数据偏移了(依据最少信息可解出封包文件的原则(这原则是我瞎说的
标签:分析,文件,封包,PJADV,偏移,PAJ,结构,Pack From: https://www.cnblogs.com/Dir-A/p/17993483