galgame解包(封包)记录

时间:2023-08-01 17:12:03 来源: 哔哩哔哩

起因

前两天下了个叫《幼なじみお嬢様とHでヒミツな同棲生活》的黄油,瞥了一眼看到pac文件。下意识以为用的是戏画那个引擎,还在想戏画不是都亡了,这社和戏画什么关系,怎么还能用它的引擎。结果发现用的其实是水晶社(CRYSTALiA)同款引擎(是同一母公司,我下游戏的时候没太注意,后面才发现)。以前完全没摸过这个引擎,所以就想稍微看看。弄了一下发现异常简单,发个专栏来水水()

不是很清楚这个引擎叫啥,我看/GARbro/上写着Unison Shift(就是《あなたに恋する恋愛ルセット》那个社),于是就叫它unison了,下文若提及unison,介是指此引擎


(资料图片)

本人逆的样本是水晶社的red_cherish以及它的(主要是这游戏就在我桌面,弄起来方便),接下来的内容介以此为例,不同版本可能存在细微差异

解包

这个引擎的解包非常简单,瞪眼法看出结构即可

用010Editor打开

前4个字节一定是文件头无误,0x8-0xC应该是封包内的文件数。再下面则是一堆意义不明的数据。

打开其它封包看一下,会发现所有的封包都会从0x804这个地方开始显示字符串

说明从这个地方开始就会是文件的目录(至于前面那部分初步推测是什么校验,先不管它),两个字符串开头固定间距为0x28字节。从0x20开始还会有一些数据,基本可以猜到目录的一项就是0x28字节,前0x20字节就是文件名的部分。但是后面两个4字节的部分作用还不明朗,而且一般来说作为目录信息好像有点少。

继续往下看,可以看到大量明文,说明这个封包的数据应该是没有压缩和加密的

那上方目录部分,剩余两个字节基本可以确定一个是数据偏移,一个是数据大小。再稍微观察以下,发现前一个4字节有时候会特别小,很多时候会在目录前面。那么它大概率是数据的尺寸。后面一个4字节则是数据偏移

现在可以推断游戏目录的结构如下

char fileName[0x20];

int dataSize;

int dataOffset;

照这个结构写个解包测试一下,成功提取

封包

解包完成后,反向写个封包出来。0x804前面未知的那部分直接填0。写出来发现,成品对比原封包,在EOF标志少了4字节

基本可以判断这个地方应该是个类似crc32之类的校验,有没有都没关系。先不要管它

测试一下发现替换原封包后,游戏没有显示按钮。说明我们的封包是有问题的。

尝试轻微改动一下原封包0x804以前的部分,发现按钮正常显示,但如果全部替换为0,则同样无法显示按钮。说明前面这部分涉及到封包内文件的读取(也可以尝试改动一下EOF标志前的4字节,会发现没影响)

到这里,我已经没有什么能用瞪眼法观察出来的信息了(当然如果你是大佬,或许上面那部分也可以直接看出来),需要上x64dbg了。

用x64dbg打开游戏,createFileA下个断点,很容易就能找到一个游戏经常光顾的函数,在里

也可以用ida打开看看

发现游戏会先尝试以文件夹的方式create文件,失败后再从封包找。不用做任何处理,游戏就可以免封包,非常方便。知道这点的话,也没必要研究什么封包了。不过我的目的不是汉化,就是想看看这个封包具体长什么样,所以还是要继续看下去。

这个函数是游戏用来获取需要的文件的。最关键的一个参数是需要文件的文件名,因为游戏会取这个文件的首字母<<3作为一个偏移,去读取封包0xC-0x804这个部分,然后找到这个偏移的前一个4字节再作为一个偏移跳转到封包的目录中。

稍微观察一下,会发现0x804-0xC=0x7F8(十进制:2040),0x7F8/0x8=0xFF。一个char的范围,0x8代表其中每一项是8字节。而且游戏通过首字母偏移后,会读取它的前一个4字节跳到封包目录中某一项的fileName的位置

所以0xC-0x804这部分是用来做一个索引的,把这部分填0的话游戏会索引不到文件。替换封包之后游戏标题界面的按钮也就无法显示。

游戏的行为就是:获取文件名首字母->跳转到索引区->读取其前一个4字节,跳转到封包目录

接下来只要找出每项两个4字节的关系即可,最简单的方式就是跟断点,以中的为例,V=0x53,(0x53<<3)+0xC=0x2A4

这是索引区中的某一项,游戏读取时还会在0x2A4上+0x4,读取0x2A8这个位置上的值,然后判断这个值是否为0,为0则会退出函数。这个值是什么意思?看下从这个封包导出的文件,以S开头的文件有4个,这个值的意义也不言而喻。不然可以跟一下,会发现函数后面会通过这个值来决定循环次数

现在就知道了索引区中的一项后4字节代表了封包中以某个字符开头的文件数。前4字节的含义仍然未知,不过继续看看索引区后面的部分,每项前4个字节的最大值为0x12。可以猜到这个值大概是什么意思。

x64dbg跟一下,可以推倒出游戏跳转的大概计算方式:(0x8*0x28)+0x804=0x944。看到文件的这个部分。

发现该项包括后面3个项都是以S开头的文件,那么索引区每一项的前4字节代表以某字符开头的文件在目录中的最小索引。后面只要一个个对比就能从封包找出需要的文件

即索引区每一项结构为

int  firstIndexInUnsionEntity; //封包目录中以该字母开头的文件的最小index

int InitialsUsageCount; //该字符作为文件首字符的计数

不过游戏计算目录位置的方式其实要稍微有所优化

如果不放心可以用其它文件的首字母验证一下

总结出结构后修改一下封包程序,再次尝试

成功显示按钮,同时说明EOF标志的前4个字节对游戏读取文件并无明显影响,应该就是个crc32之类的东西。

到这里整个引擎的封包结构已基本明了,不过后面拿着数据算了算,发现这个4字节值应该不是crc32。所以去跟了下游戏的FileChecker。

发现这个值的确是个校验,只不过方式比较抽象。FileChecker会计算封包除最后8字节外的所有字节的和(就是除了这个值和EOF标志),保存在该位置。所以这个值的确是个checkSum没错。不过这个验证方式导致FileChecker在验证一些较大封包时效率感人。

到这里整个封包的结构完全明了,大致如下

看设计,这引擎应该是个老古董了,不免封包的话,读取文件的效率会很低。

后面我又找了下文本文件,发现也是大片明文,应该也不需要花什么功夫。不过我暂时应该是没什么兴趣了。

标签:

精彩推送

原神角色怎么使用

原神角色怎么使用攻略一起来看看吧,这款游戏是最近的爆款,吸引了很多

来源:2023.07.28

低度酒销售市场规模整体保持高速增长 低度酒行业市场深度分析2023

低度酒行业市场前景怎样?低度酒赛道在明显升温,成为越来越多年轻消费

来源:2023.07.28

沪深股通|金智科技7月27日获外资卖出0.05%股份

同花顺数据显示,2023年7月27日,金智科技获外资卖出18 1万股,占流通

来源:2023.07.28

美国计划2027年测试核动力火箭:发动机配“控制棒”

快科技7月28日消息,美国计划最早于2027年在太空中测试核动力火箭。火

来源:2023.07.28

剧本杀《超级的我》复盘评测(内含剧透解析+真相答案)

《超级的我》剧本杀,谋杀之谜中的佳作本文包含:剧本杀《超级的我》复

来源:2023.07.28

佛山中考第三批录取分数线

2022年佛山中考第三批分数线:佛山市2022年高中阶段学校招生第三批各层

来源:2023.07.28

双良节能:目前硅片价格开始回暖,暂时没有跌价损失压力

双良节能7月28日在互动平台表示,二季度光伏产业链价格大幅波动,受硅

来源:2023.07.28

13岁女孩体内抽出2000毫升乳白色血 平时喜欢暴饮暴食

【13岁女孩体内抽出2000毫升乳白色血医生:2次发病住院都是吃了土豆粉

来源:2023.07.28

盐湖提锂 绿色赋能

7月27日,许昌市建安区环保装备产业园,工人在三达膜盐湖提锂设备生产

来源:2023.07.28

新闻快讯

X 关闭

X 关闭

新闻快讯