【补档】 记解包一个Unity引擎的视觉小说

前言

对于解包Unity引擎的资源 已经有不少优秀的开源工具
但是这款游戏是厂商自己实现的资源加密 这几天有空就研究了下解包
文章中可能有不当之处 还请大牛们多多包涵

分析

dnspy打开游戏目录下的Assembly-CSharp.dll
先搜索游戏资源文件的后缀.dat

这个PRead的类比较像 进去看看有什么方法


通过查看调用 大致能猜到这个字节数组Data返回的应该是文件

这个字典ti存储了文件名和文件的信息
大致流程是先new一个PRead(.dat文件路径) 然后通过传入文件名让Data返回文件的字节数组
有了这些 可以试试解包了

写解包程序

vs新建个控制台项目 新建个PRead类
直接把dnspy反编译的代码粘贴过来
把需要用到的东西修饰符都改成public 防止访问不了

然后模仿刚才的流程 把返回的字节数组用BinaryWriter写入文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static void Main(string[] args)
{
PRead pRead;
Console.WriteLine("鍵入dat完整路徑(如C:\\Games\\[蒼の彼方のフォーリズム][苍之彼方的四重奏][sprite]\\Aokana_Data\\sprites.dat):");
String dat = Console.ReadLine();
Console.WriteLine("鍵入輸出路徑(如F:/):");
String outpath = Console.ReadLine();

pRead = new PRead(dat);
foreach (string fileName in pRead.ti.Keys) {
if (!Directory.Exists(outpath)){
Directory.CreateDirectory(outpath);
}
Directory.CreateDirectory(Path.GetDirectoryName(Path.Combine(outpath, fileName)));
FileStream fs = new FileStream(Path.Combine(outpath, fileName), FileMode.Create, FileAccess.Write);
BinaryWriter binaryWriter = new BinaryWriter(fs);
byte[] array = pRead.File(fileName);
if (array!=null)
{
foreach (byte b in array)
{
binaryWriter.Write(b);
}
binaryWriter.Close();
}
}
}


搞定 这里解包的是bg.dat 其他文件有的有点辣眼睛 就不截图了


【补档】 记解包一个Unity引擎的视觉小说
https://www.tonyha7.com/2023/11/12/记解包一个Unity引擎的视觉小说/
作者
th7
发布于
2023年11月12日
许可协议