Galgame 引擎免封包略谈

Galgame 引擎免封包略谈

关于免封包

现在的Gal引擎解包工具是比较全的,基本上很多引擎你或多或少都能找到解包的工具、源码。虽然有些并非全自动,甚至需要找密钥,但是总的来说99%的Gal引擎基解包本是不成问题的。

那么对于汉化或者别的操作来说,封包,或是说让游戏读取我们修改过的文件,就成为了一个比较麻烦的事情。

封包程序

这是很自然的,有解包程序,我们就会想到封包程序,加上现在大部分解包程序的代码都是开源的,像是Crass,Garbro,都是很不错的项目。他们都提供了解包程序的源码,我个人是比较喜欢Crass的,它对封包的描述更加结构化,具体,方便我们编写封包程序。

不过这两个都很少提供封包程序,有次我在Garbro的issues里看到作者说是怕你去汉化游戏,所以不提供,具体怎么说我也忘记了,大家自行回去看吧。

当然也有一种情况你可能没办法写回封包的,或者比较困难。

Hook Buffer

这个也是比较常见的,一般来说游戏读取封包索引后会找到具体需要读取的资源文件的偏移,并把目标资源文件读入事先申请好的buffer里,然后会进行解压或者解密之类的操作。

这个时候可以对读取到buffer中的数据进行hook替换,不过这个方法比较麻烦的地方是,buffer的大小不一定是我们需要的,要是小于我们要替换的目录文件,我们就需要重新申请空间,这个时候就涉及到游戏内存的管理方式,如果是用库函数的new malloc这类的,可能需要去找到游戏内部这两个函数的地址,去hook和调用他们。原因是不同的编译器对标准库的实现是有差异的,相同的编译器也是有版本上的差异的,我们不能直接在我们的Hook DLL里直接写new 或 malloc,这样等游戏去调用释放内存的操作极大可能报错。要是系统API比如HeapAlloc, LoaclAlloc, GlobalAlloc那倒是轻松很多。

自带免封包

相信大家或多或少都听过或见过,一些引擎可以免封包读取目录下的文件。

有那种只需要把文件放到目录下就会直接读取的,有那种需要把原始封包删除才会读取的,也有需要修改相关配置文件才能生效的。

像是经典的BGI, Artemis,就属于目录下的文件优先级大于封包,直接读取。
NekoPack这个引擎则是需要删除封包才那读取目录下的文件,也就是封包优先级大于目录下的文件。
Yu-Ris的新版本和NeXAS则需要修改相关配置文件或exe。

还有一种是属于要屏蔽封包名才会去读取目录下的文件的。其实和上面说的第二种有点类似,不过具体实现肯定是每个引擎有差异。

像是AdvHD引擎它读取封包内容的函数,其中一个参数是封包名的字符串,一旦这个字符串为空或长度为0,引擎就进入从目录下搜索文件的分支,也就是免封包读取,像是SystemC这个引擎也有这样的特性。

之前还讲过CMVS,那个引擎则是判断脚本里写的路径的末尾有没有斜杠,来切换不同的读取模式的分支。

总之花式各异,不便于分类,但是从这也能看出,大部分引擎都是自带免封包读取的,或者说你可以认为是一种引擎的纠错机制。

以下列出我所接触和处理过的支持少量修改或直接支持免封包处理功能的引擎。
(一些本来就不封包的引擎就不列出了)

Krkr2 、krkrZ、Yu-Ris、NekoPack、QLIE、Artemis、SystemC、CMVS、AdvHD、ACV1、BGI、CatSystem2、SoftPal、NeXAS、Entis GLS、Maile、PIX STUDIO & DxLib、PJADV、Silky

当然应该还有许多,由于我个人时间和水平能力有限,目前只能止步于此。

其它

当然了,封包有各种各样的,Hook方法也有千奇百怪的,免封包也有各种情况,这里只是给大家简单聊聊。

免封包特征

这个问题其实不是很好回答,我的建议是你可以先试试能否直接免封包,如果不行的话就可以开始跟踪封包读取了。大部分时候你在逆封包结构的地方,一般都能看到游戏如果读取不到封包文件的时候会进行怎样的处理,这个时候就极有可能走进免封包的分支,当然前提是有这个分支,有些虽然有,但是可能会直接报错,需要在之前有一些小操作。

说完了那些模模糊糊的,来说点具体的吧!

大家在逆向的时候一定要站在正向的角度去考虑问题。当你封包读取失败的时候,你如果要进行异常的处理,这个时候需要去目录下找文件,你会怎么找?

据我观察,一些游戏会调用GetFileAttributes ,FindFirstFile,_findfirst _wfindfirst先查找有没这个文件,然后考虑打开文件返回句柄。当然你说一定要这些API吗?不一定,直接CreateFile或fopen,没打开就是不存在,也可以完成这样的搜索任务。所以只能说个大概的特征,当然大家也不要看见风就是雨,看见别人调用了这几个API就感觉免封包了,还是需要具体去看的,还是需要多提高自己的姿势水平的!

还有个特征,很多游戏会有视频文件,通常这些文件特别大,作为一个商业引擎,一般不会直接把这么大的文件直接申请内存空间,然后读进去,这个时候可能会走游戏的免封包分支,也就是免封包的功能,打开文件传回句柄,然后边播放边读取,当然你说游戏引擎特意写一个对视频播放的分支有可能吗?当然有。

反正如果看到游戏的视频文件裸露在外面没封包,就可以试着跟踪一下这些视频文件的读取,可能有惊喜。

总的来说,我的建议是,直接跟踪封包的读取,基本上你都能看到免封包读取的分支,或者你理清楚逻辑,并不用去解析封包,也能找到合适的hook点。

免封包的注意事项

这个和免封包估计关系不大,和解包有关系。

很多解包程序,会在解析完成资源文件后,对资源文件进一步解密。

这个时候有些引擎虽然支持免封包,但是你输入的资源文件,是已经解密的或是引擎不支持的文件,那也没办法直接读取。

像是一些游戏的脚本文件,比如CMVS,会对脚本压缩加密,Garbro提取的是解密解压后的文件,CMVS支持免封包读取,但是你给它一个解密解压的文件,本身引擎也没特别去判断,这个时候自然就读取失败了,AdvHD这个引擎也是一个道理。

所以免封包的时候一定也要关注资源的加密解密状态。

结束

好了,这些模糊的概念就说到这,理论只是对实践的总结,我们没必要纠结。后面有空我会拿一些实例出来讲解,大家见多了看多了,也就会了,要是能自己独立调试思考,相信你会有自己的体会和总结。

posted @ 2024-03-26 15:57  Dir-A  阅读(525)  评论(0编辑  收藏  举报