galgame解包(封包)记录
起因
前两天下了个叫《幼なじみお嬢様と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在验证一些较大封包时效率感人。
到这里整个封包的结构完全明了,大致如下
看设计,这引擎应该是个老古董了,不免封包的话,读取文件的效率会很低。
后面我又找了下文本文件,发现也是大片明文,应该也不需要花什么功夫。不过我暂时应该是没什么兴趣了。
标签:
精彩推送
新闻快讯
X 关闭
X 关闭
新闻快讯
- galgame解包(封包)记录
- 2023天津8月限号表(高清版)
- 【恋与】据说我脚踏五条船。(3)
- 维宏股份:接受国金证券调研
- 太极股份董秘回复:截止2023年7月31日,公司的股东户数为40372户
- 长城WEY:8、9、11月将分别推出三款新车
- 企业实施精细化管理的意义何在? 企业精细化管理实施方案
- 国金证券:给予安井食品买入评级
- 建工修复:参展第四届湖南绿博会 助力“三湘大地”绿色低碳循环发展
- 纵观天下|官方通报“西藏日喀则景区保安禁止游客在国道边停车拍照”
- 军委国防动员部构建仓库管理“四化”新模式
- 永辉超市涨逾3% 稍早一度涨8% 此前有报道称
- 8月1日天津港鱼粉市场坚挺持稳
- 胡莱三国真关羽技能搭配(胡莱三国真关羽和曹操哪个厉害)
- 初高中英语培训机构排名榜?
- 王楚然工作室回应近期争议 表示对于谣言保留追责权利
- @哈尔滨人,免费发布便民服务信息的机会来了!
- 在全国第一方阵中争先进位 浙江持续擦亮双拥工作金名片
- 翼子板修复技术标准是什么(修复翼子板需要多久?)
- 河北全力应对持续强降雨 开展防汛抢险工作
- 记者:哈维今天联系了B席,告知巴萨正在努力签他&让他继续等待
- 撤诉申请书图片 撤诉申请书
- 安德鲁·布莱克(关于安德鲁·布莱克简述)
- 监管通报短期健康险业务四大问题和风险 要求相关公司自查整改
- 旅游 | 三地联手 共创共赢——晋冀康养之旅在山西忻州开启
- 受灾老人简易铁皮房住了近5年!福建连城明确安置新村建成时间表
- 中级经济师人力资源专业考什么?23年备考这样学!
- 小时雨强达100毫米以上!北京三区再发暴雨红色预警
- 到荷花池买买买、吃鸳鸯锅,外国运动员是懂成都的!
- 苦瓜干泡水喝一次泡多少 哪些人不能喝苦瓜茶
- 大中街道聚力打造现代化农业品牌助力乡村振兴
- 浙大校长杜江峰:基础学科研究是科技革命和产业变革的源头
- 顶流花花洗澡全国人民都知道了,真的判若两“花”,白到发光!
- 高通启动全新长期产品计划,涵盖 16 款物联网系统级芯片
- 共442家!武汉发布2023年测绘资质单位名单
- 道氏技术:公司对正极材料行业发展长期看好
- 吉利缤瑞 COOL 冠军版官方图发布:售价低于8万元
- 中国潜伏了多少间谍?触目惊心!
- 和田白玉的
- 以“专业”家用品质满足研学家庭出游,风行游艇再获用户肯定
- 基建股震荡走高 天健集团触及涨停
- 7月28日上海期货市场锌锭报价
- 安徽金寨:10小时奋战 七旬老人被成功救出
- 11次风险提示 ST泰禾将直接退市没有整理期 《电鳗财经》注意到,在ST泰禾股价低于1元面值的20个交易日中,出现过14个跌停板,停牌前的股价为0.43元。按照当前24.89亿股总股本计算,该公司总市值仅有10.7027亿元。...
- 2023 年下半年停产车型盘点,美系肌肉、低价宝马统统说再见
- 电子商务主要学什么就业方向 电子商务是干什么的
- 莫道桑榆晚 为霞尚满天
- gtx660相当于什么显卡多少钱(gtx660相当于什么集成显卡)
- 拯救者R9000X 2023全面解读 换装锐龙7 7840H 价格更便宜
- 天之大歌词的含义_天之大歌词有何含义