首页 > 其他分享 >Galgame 引擎免封包略谈

Galgame 引擎免封包略谈

时间:2024-03-26 16:13:55浏览次数:27  
标签: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这个引擎也是一个道理。

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

结束

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

标签:Galgame,封包,略谈,文件,解包,游戏,引擎,读取
From: https://www.cnblogs.com/Dir-A/p/18096904

相关文章

  • RTP封包
    一、前言RTP(Real-timeTransportProtocol),即实时传输协议,RTP协议定义了在网络上传输音频和视频的标准数据包的格式。通常RTP和RTSP协议一起用于流媒体传输系统。RTP标准中包含了两个子协议,RTP和RTCP。当网络为UDP传输方式的时候RTP通常和RTCP协议配合使用,实现流媒体音视频质量......
  • [PJADV] 封包结构分析
    [PJADV]封包结构分析目标游戏:ティンクル☆くるせいだーすPSSv.1.19这篇就详细写一下,后面就全当读者有相关背景知识,因为这样写实在很累(假设结构先正常安装游戏,并打上更新补丁(如果太乱可以先不打更新补丁,视情况而定)(是不是可以观察一下打补丁前后变化?补丁本身?)先浏览一遍游戏......
  • 10 信息打点——APP&小程序篇&抓包封包&XP框架&反编译&资产提取
    一、APP资产收集对APP进行资产收集,不但要用Fiddler等抓包工具,对外在资产进行分析收集;还要使用AppInfoScanner等工具,对内在资产(源码)进行反编译分析。安卓APP入手1、APP-外在资产收集1.将APP安装在模拟器中,修改模拟器代理设置,使用Fiddler、Burpsuite、Charles等抓包工具抓......
  • Galgame封包逆向入门
    Galgame封包逆向入门这里就简单聊一下封包逆向分析的一些注意点吧,其实也是初入逆向的注意点了,本质差不多。正向基础语言基础:ASM、C、C++平台基础:Win32、PE、GDI、DirectX引擎基础:游戏引擎架构虽然说的逆向,其实和正向的水平、见识、经验是强相关的,如果你没写过相关的程序又......
  • 【补充】Minio存储桶封包指南
    【一】Docker部署Minio容器【1】Minio容器介绍Minio是一个开源的对象存储服务器,使用ApacheLicensev2.0开源协议。它提供了一个存储桶(bucket)的概念,类似于文件系统中的目录,用于存储对象文件。Minio与亚马逊S3云存储服务兼容,使得它可以轻松地与现有的S3应用程序集成。......
  • Aspose.cell 常用封包
    导出成List[AttributeUsage(AttributeTargets.Property,AllowMultiple=false)]publicclassExcelColumnAttribute:Attribute{publicExcelColumnAttribute(intcolumnIndex){ColumnIndex=columnIndex;}......
  • 发送IP封包到高层协议
    intip_local_deliver(structsk_buff*skb){/**ReassembleIPfragments.*/structnet*net=dev_net(skb->dev);if(ip_is_fragment(ip_hdr(skb))){if(ip_defrag(net,skb,IP_DEFRAG_LOCAL_DELIVER))return0;}returnNF_HOOK......
  • 「学习笔记」略谈点分治
    点分治适合处理大规模的树上路径信息问题。引入给定一棵\(n\)个点树和一个整数\(k\),求树上两点间的距离小于等于\(k\)的点对有多少。对于这个题,如果我们进行\(O_{n^3}\)搜索,那只要\(n\)一大,铁定超时。所以,我们要用一个更优秀的解法,这就是我们的点分治。淀粉质可......
  • APP自动化--封包
    常用的导包数据,可以直接封装起来,以便后期使用,可以在project添加名为Package的python软件包,如常用下面的包和APP自动远程的链接信息,可以进行封装fromappium.webdriverimportRemote#导入远程包fromappium.webdriver.common.appiumbyimportAppiumByasBy#引用app......
  • 【专栏精选】网络封包神器protobuf简介
    本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可转载。洪流学堂公众号回复专栏,查看更多专栏文章。洪流学堂,让你快人几步。你好,我是郑洪智。大智:“上次我们在学习如何进行数据包封包的时候说到:在网络传输时数据包需要定义好格式,这个格式就是数据在字节流中是如何排......