这两天搞了一下 yu-ris 的 ypf 封包,这里做个简单的记录。
ypf 主要用了 zlib 进行压缩处理。包头里有文件数量和数据区起始地址等信息。文件索引表里包含了文件的偏移、压缩后长度和原始长度等基本信息,文件名则是经过取反后存储的。文件索引表非定长。
ypf 封包
封包的结构如下:
struct YpfHeader { uint32_t mMagic; uint32_t mVersionTmp; // 应该是版本号之类的 uint32_t mFileCount; uint32_t mDataStart; uint8_t mZero[16]; }; struct YpfEntry { uint32_t unknown; uint8_t name_length; // 要解码 uint8_t name[1]; // 要解码 uint8_t filetype; uint8_t zlib_compress_flag; uint32_t original_length; uint32_t compressd_length; uint32_t offset; uint32_t unknwon; // 估计是 crc 之类的 };
目前手头上两款游戏的 YpfHeader::mVersionTmp 字段不同,并且 YpfEntry 中也有(微小的)差异,版号大的 YpfEntry 结构中多了一个全零的 uint32_t。
文件名前面有一个指示长度的字节,但是需要经过运算才能得到真实的文件名长度。为简便起见,可以在解码过程中识别文件扩展名之前的 ‘.’,然后加上最后 3 个字符的扩展名就得到完整文件名了。
根据索引表中的偏移长度提速数据并解压即可解出原始文件。
ycg 文件
ycg 是经 zlib 压缩后的图像。其中头 0x38 个字节记录了文件信息,结构如下:
struct YcgHeader { uint32_t mMagic; uint32_t mWidth; uint32_t mHeight; uint32_t mBpp; uint32_t mUnkonwn[4]; uint32_t mPart1PlainLength; uint32_t mPart1PackedLength; uint32_t mMaybeImgPosition[2]; uint32_t mPart2PlainLength; uint32_t mPart2PackedLength; };
这两部分就对应着上下半张图像,对两部分分别解压后直接拼接,最后再补上 bmp 文件头即可。
ybn 文件
经过编译后的脚本文件,带有 YSTB 标志。使用异或解码,key 要在 exe 文件中找,搜索字符串 “ysbin\yst%05d.ybn” 即可快速空降到目标附近。每个游戏的 key 应该都不相同,毕竟可以自定义。
关于YBN文件的异或解码和KEY的查找还是不太清楚,如果方便的话请发给我一份详细的教程!不胜感激。
在 OD 里搜这个字符串的引用,没记错的话在引用位置之后应该有个小循环用来对读取出的 ybn 文件内容进行逐双字异或,key 则是在循环里直接引用的一个静态区 4 字节整数,把它取出来就可以了。
大佬厉害,我最近再搞黑兽2(YU-RIS Ver.479),文本在bin.ypf中,其中还包含了一些音频和图片,请问:
1要查找调用zlib函数的位置应该下什么断点。能不能把zlib函数直接弄掉,然后让程序直接读取未经过zlib压缩的文本,因为我想要省去回封过程。(目前我用tachie FF抑或后能提取,但是放在bin文件夹中打开游戏提示错误中提到zlib,所以我怀疑问题出在这里)。
2我的封包里还有音频(ogg)以及图片(png),格式和上面好像对不上,大佬要不一起做了,要参考文件我这边可以提供。
其实知道用了 zlib 后也不用特地去移除它,因为索引表已经有足够的信息来处理了,直接调就行。是不是回封后封包索引表没更新导致解码失败?
至于音频的话大多数都是未经压缩的,直接解压就可以播放;png 同理,一般资源会选择直接压缩位图,png 很可能也没做多少处理的
细节记不太清,只能仅供参考了,哈哈
多谢大佬解答,再问一下回封的时候文件前后顺序修改掉有关系吗,比如先写2.ybn再写1.ybn
还有offset是相对于文件开始位置还是数据开始位置?
好吧是相对于开头的,那我现在问题就只有上面那个了
一般没有哪个二货特地把文件的先后顺序给设定死,基本就是索引表里放个校验值,所以只要文件本身没啥问题不影响处理就好了
大佬,想问一下您有没有见过这个引擎里面的动画,我解了个包,发现里面的动画全是.jpg格式的图片组成的,但是按理说jpg格式的图片是不带alpha通道的,但是在游戏里底却是透明的,我发现每个动画的目录下都包含了
00000000.jpg
00000001.jpg
00000002.jpg
00000003.jpg
这样四个ps和系统图片查看器都打不开的文件,想请大佬帮忙分析一下这样的jpg图片能不能转成带alpha通道的图片(或者是动画)
参考动画解包文件链接:
链接:https://pan.baidu.com/s/1lOxy0fX3wEf6dyQNHydhDQ
提取码:qxqm
希望大佬能抽空看一下,指点一下怎么做才能把这样的jpg图片能不能转成带alpha通道的图片(或者是动画),非常感谢!
我看了下,这几个文件里包含了不少完整的 jpg 文件,里面的数据直接保存出来就是文件夹里的帧动画。提取出的文件虽然少但它带有 8 位的掩码文件,这样渲染的时候就能做出透明效果了。想保存的话可以试试写点代码直接把文件夹里那些现成的 jpg 黑色像素当成透明,再存成 png。
好的,多谢大佬指点