惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
D
Docker
S
SegmentFault 最新的问题
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
GbyAI
GbyAI
L
LangChain Blog
Vercel News
Vercel News
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
T
Threat Research - Cisco Blogs
T
Threatpost
Scott Helme
Scott Helme
T
Tailwind CSS Blog
Latest news
Latest news
Stack Overflow Blog
Stack Overflow Blog
Blog — PlanetScale
Blog — PlanetScale
The Register - Security
The Register - Security
罗磊的独立博客
P
Proofpoint News Feed
腾讯CDC
S
Schneier on Security
雷峰网
雷峰网
A
About on SuperTechFans
T
Tenable Blog
F
Full Disclosure
Cyberwarzone
Cyberwarzone
博客园_首页
有赞技术团队
有赞技术团队
K
Kaspersky official blog

文章列表

游戏玩后感:ReLief:献给亲爱的你 我的周边(谷子)分享 游戏玩后感:Kanon 简谱:致真实的你 《Rust中常见的有关生命周期的误解》学习笔记 简谱:StarMap 简谱:かく咲きたらばいと恋ひめやも 简谱:东风 简谱:无法诉说的思念 简谱:Girlish 游戏玩后感:时钟机关的Layline 简谱:风之琶音 简谱:星空的记忆 简谱:因为遇见了你 简谱:月童 番茄简谱脚本转调器 游戏玩后感:青空下的约定:Refine 游戏玩后感:在这苍穹展翅 书籍读后感:控制论与科学方法论 游戏玩后感:恋爱表达式 游戏玩后感:樱之诗 MLIR-tutorial学习笔记 游戏玩后感:潜伏之赤途 游戏玩后感:纯爱咖啡厅:帕露菲重制版 游戏玩后感:智以泪聚 游戏玩后感:初雪樱 游戏玩后感:告别回忆:从今以后 游戏玩后感:梦灯花 游戏玩后感:金辉恋曲四重奏 游戏玩后感:五彩斑斓的世界 昇腾310P使用记录 游戏玩后感:AIR 游戏玩后感:弹丸论破 游戏玩后感:流景之海的艾佩莉亚 Xilinx_HLS上板过程记录 游戏玩后感:告别回忆2 游戏玩后感:恋爱绮谭 Faiss和Rapidsai_Raft使用记录 游戏玩后感:近月少女的礼仪 游戏玩后感:樱色之云,绯色之恋 游戏玩后感:幸运草的约定 游戏玩后感:星之梦、候鸟和丸子与银河龙 游戏玩后感:白色相簿2 Windows上使用VTune分析PyTorchExtension调用的Cpp程序 SpinalHDL上板过程记录 游戏玩后感:仰望夜空的星辰 最简单的算卦方法之一:梅花易数法 游戏玩后感:苍之彼方的四重奏 自定义CUDA实现PyTorch算子的四种简单方法 游戏玩后感:星空的记忆 游戏玩后感:9nine 游戏玩后感:LittleBustersEX 游戏玩后感:SummerPockets 游戏玩后感:逆转裁判 动漫观后感:吹响吧上低音号 git基本操作
krkr引擎解包工具介绍
VnYzm · 2023-09-03 · via

背景

krkr引擎,是日本的一个开源免费galgame游戏引擎,由于不用钱,也不用游戏厂家自己维护,所以被广为使用。我知道的就包括柚子社全家桶、Lose全家桶、《9nine》、《Atri》这些。由于这个引擎可定制化非常高,所以厂家经常会对游戏资源进行各种各样的加密,这也给解包带来了困难,好在引擎是统一的,所以也有一些针对krkr引擎的通用解包工具。接下来首先会介绍一些krkr引擎的游戏特征和加载包的大致流程,然后介绍比较实用的解包工具,最后介绍一下动态解包Steam版galgame需要进行的操作。

krkr引擎的游戏特征

右键点击游戏的exe主程序,选择属性-详细信息,在版权那一栏看到KIRI KIRI core...字样,就说明是krkr引擎的游戏了。不过也有一些版本会删去这条信息,好在还有其他的特征,包括:

  • 游戏资源文件扩展名是xp3
  • 程序文件夹下有名为plugin的子文件夹,里面包含了很多dll格式的动态链接库
  • 游戏内可以设置显示标题栏下的工具栏

krkr引擎加载包的大致流程

  1. 读取游戏资源文件中的子文件列表,可以将xp3文件理解成一个压缩包,子文件列表就是压缩包中包含的文件的列表
  2. 当需要某个资源时,发出子文件名请求,通过子文件列表查找到子文件对应的位置,将子文件从xp3文件提取出来,注意这时候读取出的子文件是加密过的
  3. 调用解密模块,对子文件进行解密,然后执行接下来的资源处理流程

从这个流程可以看到,krkr引擎的解包基本也就分两种方式:

  • 静态解包:直接把解密模块反编译,然后用反编译后的程序对xp3文件进行解压和解密。
  • 动态解包:在程序执行过程中,给解密模块的末尾添加一个hook,让它把解密好的文件保存到硬盘上。

静态解包的好处是直接对整个xp3文件进行解包,一次就能得到所有解密后的文件,方便快捷。坏处一个是需要反编译解密模块,当然这对那些逆向大佬说不是什么难题,另一个更主要的是工具制作者要将五花八门的解密程序统一成一个框架,还要对后续出现的新游戏、新加密方式进行不断的添加维护,这工作量就不是一点半点了,正如之前的非常流行,但现在停更的解包工具KrkrExtract作者所说:

受保护的程序一律不支持,支持就是打开潘多拉魔盒,你得保证各类bypass不冲突。

动态解包的好处是万金油,基本所有的程序都可以用这种方法解决,不需要不断更新。但坏处就是资源必须游戏发起了相应的请求才能hook到,如果像获取所有解密后的文件,可能就需要把整部游戏的所有情节过一遍,时间成本非常高,甚至某些游戏触发CG啥的有特殊条件(比如当前时间、情节过的次数等),那更是麻烦。

解包工具

Garbro

Garbro是一个非常强大的解包工具,支持多种格式的galgame解包,基本常见厂家的引擎它都支持(除了key社的Siglus Engine和Unity,不过这两种有其他的解包工具),krkr也包括在内。不过前面说了,krkr引擎的游戏加密方式五花八门,作为静态解包工具,Garbro虽然现在还一直在更新,但也总有游戏是解不了的。而且,即使是同一个游戏的不同版本,也有可能有的能解有的不能解,比如《Maitetsu Last Run》Garbro显示能解,但我的Steam中文版《爱上火车Last Run》却解不了,可能能解的是日语原版或英文版;又比如9nine官汉的前四部能解,但民汉的新章不能解,这都得看运气。Github上还有大佬fork了Garbro然后自己补充了一些krkr游戏的解密程序,比如这个仓库,可以根据需要选择,哪个支持自己想解包的游戏就选哪个。

KrkrzExtract和上面说的KrkrExtract是同一个作者。这个工具使用的是动态解包,使用方法就是直接让KrkrzExtract运行游戏文件,它就会自动注入hook,游戏运行过程中加载的资源文件都会被保存下来。正如上面所说,适用范围很广,而且不需要更新,但是想获取所有文件比较麻烦。

基于子文件列表的工具

我之前用KrkrzExtract的时候就在想,它的局限性是想要的资源文件并不一定会被游戏加载。而加载的过程,必然也是游戏中的一个函数,那么我在游戏的某个位置hook一下,然后将xp3子文件列表的所有文件都作为参数调用一下这个函数,那不就能保存解包出来的所有文件了。后来一搜,果然有这类工具,比如这位大佬的仓库,他在这篇文章里介绍了这个工具的原理,和我的想法基本一致。不过文章也提到,xp3的子文件列表也不一定每种游戏的实现方式都一样,所以该工具可能泛用性还是不如KrkrzExtract,不过比起多种多样的加密方式,子文件列表的实现方式应该会少很多,所以泛用性应该比Garbro会强一些。使用方式和KrkrzExtract也差不多,都是让它运行游戏文件,自动注入然后游戏运行过程中保存文件,不过和KrkrzExtract不同,参数里需要选择xp3文件名,保存的是这个xp3解包的所有文件而不是游戏主动加载的文件。

前面所说的fork了Garbro并自行添加功能的大佬也实现了一个解包工具,我没有用过,原理应该也是基于子文件列表的,但因为没有文章介绍,所以我也不清楚它是怎么考虑xp3子文件列表的的兼容性问题的。

动态解包Steam版krkr游戏

比起硬盘版游戏,动态解包Steam版游戏要稍微麻烦一点,主要有两个原因:

  • Steam版游戏的启动过程和动态解包工具的启动过程矛盾。Steam版游戏需要由Steam作为启动器,所以执行游戏程序本质上是先执行Steam,再由Steam执行真正的游戏;而前面介绍的动态解包工具需要由自己去执行真正的游戏,因为操作系统规定了被注入hook的进程必须是注入hook的进程的子进程。
  • Steam会检测动态解包工具的运行,如果运行了则会让游戏闪退。这一点是“现象”,我个人认为Steam检测的实际上是对游戏进程的注入行为。网上说这是Steam的DRM(数字版权管理)机制,这个名称看起来好像是Steam不想让我们解包,实际上我觉得是Steam怕游戏被破解,根本还是防盗版和防外挂。

不管怎么说,想动态解包Steam版游戏就需要两步:把DRM去掉,以及让游戏能独立执行(不需要Steam作为启动器)。前者可以用Steamless,它会将游戏主程序的DRM机制去掉,生成一个新的游戏主程序,但这个程序往往不能直接执行,因为它还是依赖Steam作为启动器给它提供各种API支持。后者可以用GoldBerg Emulator,它提供修改之后的steam_api.dll等Steam环境动态链接库,用它们替换原游戏文件下的同类文件即可。之后就可以按照硬盘版的方式运行动态解包工具了。当然这个方法不保证成功,毕竟这一套流程也是制作盗版游戏的流程,技术力高的厂家可能会在这一点做专门的防范。

这里有一个需要额外的注意的地方,就是像KrkrzExtract只会保存游戏加载的文件,所以要是修改后的游戏没有继承存档就会很难受。这里说一下继承存档的方法,在Steam的安装文件夹下应该会有一个userdata文件夹,里面有个数字文件夹,数字文件夹打开之后是一堆数字文件夹,这些数字实际上是游戏的id,根据游戏的id打开对应的文件夹,再打开remote文件夹,里面那些东西就是存档相关的文件。然后再找到GoldBerg Emulator的存档目录,复制过去就可以了。

总结

以上就是krkr引擎解包相关的一些介绍。我个人解包纯粹是为了把CG保存下来自己欣赏,这样就不需要保存整部游戏,节省硬盘空间。实际上解包最主要的应用应该还是汉化游戏,这方面我不太了解,所以也不能确定以上方法一定有效。