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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Spread Privacy
Spread Privacy
H
Hacker News: Front Page
PCI Perspectives
PCI Perspectives
Webroot Blog
Webroot Blog
罗磊的独立博客
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Last Week in AI
Last Week in AI
美团技术团队
Help Net Security
Help Net Security
The Hacker News
The Hacker News
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
The Register - Security
The Register - Security
IT之家
IT之家
WordPress大学
WordPress大学
Jina AI
Jina AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Help Net Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
NISL@THU
NISL@THU
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
B
Blog
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
S
Security Affairs
小众软件
小众软件
Hacker News: Ask HN
Hacker News: Ask HN
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
A
Arctic Wolf
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence

VnYzm的博客

游戏玩后感: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 游戏玩后感:AtriMyDearMoments 游戏玩后感:极限脱出 游戏玩后感:魔女的夜宴 SSH实现多跳代理 动漫观后感:向山进发 flv重封装H264、AAC流 动漫观后感:夏日重现 CSP模板 游戏玩后感:海沙风云 动漫观后感:灵能百分百 游戏玩后感:交响乐之雨 游戏玩后感:爱上火车LastRun 游戏玩后感:LittleBustersEX 游戏玩后感:SummerPockets 游戏玩后感:逆转裁判 Ultra96V2开发板简单使用 SpinalWorkshop实验笔记(三) SpinalWorkshop实验笔记(二) SpinalWorkshop实验笔记(一) PYNQ开发板上使用USB声卡+OSS兼容层播放音频 TestOS移植K210开发板 rCore-Tutorial-Book-v3学习笔记(七) 动漫观后感:凉宫春日的忧郁 rCore-Tutorial-Book-v3学习笔记(♭七) rCore-Tutorial-Book-v3学习笔记(六) rCore-Tutorial-Book-v3学习笔记(五) rCore-Tutorial-Book-v3学习笔记(四) rCore-Tutorial-Book-v3学习笔记(三) rCore-Tutorial-Book-v3学习笔记(二) rCore-Tutorial-Book-v3学习笔记(一) 游戏玩后感:RewritePlus MIT-6.S081-2020实验(xv6-riscv64)十一:net MIT-6.S081-2020实验(xv6-riscv64)十:mmap MIT-6.S081-2020实验(xv6-riscv64)九:fs MIT-6.S081-2020实验(xv6-riscv64)八:lock MIT-6.S081-2020实验(xv6-riscv64)七:thread MIT-6.S081-2020实验(xv6-riscv64)六:cow MIT-6.S081-2020实验(xv6-riscv64)五:lazy MIT-6.S081-2020实验(xv6-riscv64)四:traps MIT-6.S081-2020实验(xv6-riscv64)三:pgtbl MIT-6.S081-2020实验(xv6-riscv64)二:syscall 动漫观后感:吹响吧上低音号 MIT-6.S081-2020实验(xv6-riscv64)一:util 快速生成网络mp4视频缩略图技术 用plantuml画图示例 QQ缩略图和大图不同实现 Python制作字符图片 动漫观后感:命运石之门 使用OpenCV对图片进行特征点检测和匹配
krkr引擎解包工具介绍
VnYzm · 2023-09-03 · via VnYzm的博客

背景

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保存下来自己欣赏,这样就不需要保存整部游戏,节省硬盘空间。实际上解包最主要的应用应该还是汉化游戏,这方面我不太了解,所以也不能确定以上方法一定有效。