morkt / GARbro

Visual Novels resource browser
MIT License
2.28k stars 242 forks source link

大佬,知不知道.eme格式的引擎的有啥封包工具啊 #614

Open wycstc353 opened 9 months ago

wycstc353 commented 9 months ago

大佬,知不知道.eme格式的引擎的有啥封包工具啊 瞳の烙淫1-3三部都是这个引擎的

ist-42 commented 8 months ago

我暂时没有找到专门的封包工具。 通过研究garbro的解包脚本和游戏包体,我最近给一个老游戏写了个专门的封包脚本,有空的话会优化下代码放出来。

eme包体从头到尾依次是"RREDATA "签名,lzss压缩的数据段,每个由header和data组成;然后是40 byte的key,key的前8byte表示加密流程,后32byte是key的数据;接着是每个文件 0x60 byte的index,存着name, subtype, offset, size等metadata。最后是4byte的uint表示文件数量。

lzss压缩的代码可以在 https://github.com/differentrain/LzssStream 里面找到,eme的lzss压缩似乎是限定THRESHOLD为2,maxMatchLength为LzssInitPos (注意是头文件里面原始的LzssInitPos, 而不是在GARBro读取做减法取模运算后的值)

封包的难点一是header字段里面有些未知用处的字段。二是garbro只有decrypt()函数,想加密的话需要自己写个逆运算。比较幸运的是我处理的游戏似乎没有用到那些header里面的未知字段。然后我不太关心加密就直接把key的前8byte全设为0跳过加密了。

一个奇怪的小坑是,eme包体里8 bit的灰度图的header里对应的BPP是7,但实际上是按照8bit读和存的,不是特别清楚为什么,封包的时候遇到BPP为8的图直接存BPP=7就行。

wycstc353 commented 7 months ago

我暂时没有找到专门的封包工具。 通过研究garbro的解包脚本和游戏包体,我最近给一个老游戏写了个专门的封包脚本,有空的话会优化下代码放出来。

eme包体从头到尾依次是"RREDATA "签名,lzss压缩的数据段,每个由header和data组成;然后是40 byte的key,key的前8byte表示加密流程,后32byte是key的数据;接着是每个文件 0x60 byte的index,存着name, subtype, offset, size等metadata。最后是4byte的uint表示文件数量。

lzss压缩的代码可以在 https://github.com/differentrain/LzssStream 里面找到,eme的lzss压缩似乎是限定THRESHOLD为2,maxMatchLength为LzssInitPos (注意是头文件里面原始的LzssInitPos, 而不是在GARBro读取做减法取模运算后的值)

封包的难点一是header字段里面有些未知用处的字段。二是garbro只有decrypt()函数,想加密的话需要自己写个逆运算。比较幸运的是我处理的游戏似乎没有用到那些header里面的未知字段。然后我不太关心加密就直接把key的前8byte全设为0跳过加密了。

一个奇怪的小坑是,eme包体里8 bit的灰度图的header里对应的BPP是7,但实际上是按照8bit读和存的,不是特别清楚为什么,封包的时候遇到BPP为8的图直接存BPP=7就行。

额,看不懂,还是等之后大佬你发布工具吧