吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1839|回复: 36
收起左侧

[Android 原创] Unity手游BlueArchive蔚蓝档案剧情文本提取

  [复制链接]
k96e 发表于 2024-11-20 22:07
一直没见着有人做,以为是啥很难的活,实际上难度不大。  
下手的是国际服(因为一下子就能解出五种语言的脚本),剧情是能不换包体动态更新的,所以肯定得在数据目录下找。  
翻目录找到可疑的文件Android/data/com.nexon.bluearchive/files/PUB/Resource/Preload/TableBundles下的ExcelDB.db和Excel.zip  
先复制出来再说,简单看一下Excel.zip,似乎全是角色和关卡数据之类的,和咱们要找的剧情文本没关系。  
转战ExcelDB,SQLiteStudio打开
{019CD806-0AE9-4607-9BFC-D279BDE734F3}.png
欸,ScenarioScriptDBSchema,这表名一看就对劲了,再看一眼数据
{DD57D1F4-979A-4C75-9498-35C7543747F1}.png
更对劲了
接下来就是这个Bytes怎么解析的问题。
你要是现在能看出来这是flatbuffers,那此贴到这就完结了,但是铸币楼主当时就愣是没看出来,还以为是啥自行实现的序列化方法。
然后就对于这类U3D il2cpp的游戏,公式化的提取libil2cpp.so和global-metadata.dat,然后用Il2CppDumper反编译
[Shell] 纯文本查看 复制代码
1
..\Il2CppDumper.exe libil2cpp.so global-metadata.dat ..\output

运行完先别急着开IDA,打开dump.cs,搜索ScenarioScriptExcel,直接就能找到结构体定义
{61B4D716-7A56-4996-B1D7-5A352C876ED7}.png
(IFlatbufferObject善意提醒大家这是flatbuffers)
根据定义,写出schema文件(fbs文件):
[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
namespace MX.Data.Excel;
 
table ScenarioScriptExcel {
  GroupId:long;
  SelectionGroup:long;
  BGMId:long;
  Sound:string;
  Transition:uint;
  BGName:uint;
  BGEffect:uint;
  PopupFileName:string;
  ScriptKr:string;
  TextJp:string;
  TextTh:string;
  TextTw:string;
  TextEn:string;
  VoiceId:uint;
  TeenMode:bool;
}
 
root_type ScenarioScriptExcel;

安装flatbuffers的schema编译器flatc,运行
[Shell] 纯文本查看 复制代码
1
flatc --python ScenarioScriptExcel.fbs

得到用来反序列化的python代码,然后写个脚本
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import flatbuffers
import MX.Data.Excel.ScenarioScriptExcel as ScenarioScriptExcel
import json
import sqlite3
 
conn = sqlite3.connect('../ExcelDB.db')
cursor = conn.cursor()
d = cursor.execute("select * from ScenarioScriptDBSchema")
l = list(d)
datas = []
def read_bin_file(file_path):
    with open(file_path, 'rb') as f:
        return f.read()
 
def parse_scenario_script(buffer):
    buf = bytearray(buffer)
    fb = flatbuffers.Builder(0)
    fb.Bytes = buf
    scenario = ScenarioScriptExcel.ScenarioScriptExcel.GetRootAsScenarioScriptExcel(buf, 0)
    return scenario
 
def process(buffer):
    global datas
    scenario = parse_scenario_script(buffer)
    datas.append({
        "GroupId": scenario.GroupId(),
        "SelectionGroup": scenario.SelectionGroup(),
        "BGMId": scenario.Bgmid(),
        "Transition": scenario.Transition(),
        "BGName": scenario.Bgname(),
        "BGEffect": scenario.Bgeffect(),
        "ScriptKr": scenario.ScriptKr().decode('utf-8'),
        "TextJp": scenario.TextJp().decode('utf-8'),
        "TextTh": scenario.TextTh().decode('utf-8'),
        "TextTw": scenario.TextTw().decode('utf-8'),
        "TextEn": scenario.TextEn().decode('utf-8'),
        "VoiceId": scenario.VoiceId(),
        "TeenMode": scenario.TeenMode()
    })
 
for i in l:
    process(i[1])
 
with open("scenario_script.json", "w", encoding="utf-8") as f:
    json.dump(datas, f, ensure_ascii=False, indent=4)

完事
{CBAF6385-CBEE-4D46-9A71-DC0BE3A53766}.png

免费评分

参与人数 10吾爱币 +16 热心值 +7 收起 理由
iwxr + 1 谢谢@Thanks!
Adran + 1 + 1 谢谢@Thanks!
helloworld0011 + 1 + 1 谢谢@Thanks!
WoeLyx + 1 + 1 我很赞同!
book222 + 1 用心讨论,共获提升!
notool + 1 + 1 我很赞同!
llm0197 + 1 + 1 我很赞同!
complex + 1 用心讨论,共获提升!
无奈的地刺王 + 1 + 1 我很赞同!
正己 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Forze 发表于 2024-12-29 13:11
用了楼主的.fbs,把除jp的语言注释了,成功提取了日服的文本,然后修改重新写入数据实现了汉化。我想问下libil2cpp.so是从哪里获取的?dump.cs只要用Il2CppDumper.exe就可以获得吗?谢谢
hhao7780 发表于 2024-11-21 10:32
rnaapp 发表于 2024-11-21 10:48
Jiu9Hao 发表于 2024-11-21 10:48
经验学习了,感谢分享
hayatecn 发表于 2024-11-21 11:05
有没有原神的?
xieyinghao 发表于 2024-11-21 11:13
很厉害的大佬,666,感谢恩人
无奈的地刺王 发表于 2024-11-21 11:53
感谢分享,学习了
zyh5028 发表于 2024-11-21 12:10
学习了,感谢
xy1687 发表于 2024-11-21 13:21

感谢分享,学习了
LHHK 发表于 2024-11-21 15:41
感谢分享,学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-11 20:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表