安卓逆向 Unity手游BlueArchive蔚蓝档案剧情文本提取

admin 2024年12月16日23:36:52评论29 views字数 2330阅读7分46秒阅读模式
一直没见着有人做,以为是啥很难的活,实际上难度不大。  

下手的是国际服(因为一下子就能解出五种语言的脚本),剧情是能不换包体动态更新的,所以肯定得在数据目录下找。  

翻目录找到可疑的文件Android/data/com.nexon.bluearchive/files/PUB/Resource/Preload/TableBundles下的ExcelDB.db和Excel.zip  

先复制出来再说,简单看一下Excel.zip,似乎全是角色和关卡数据之类的,和咱们要找的剧情文本没关系。  

转战ExcelDB,SQLiteStudio打开

安卓逆向  Unity手游BlueArchive蔚蓝档案剧情文本提取

欸,ScenarioScriptDBSchema,这表名一看就对劲了,再看一眼数据

安卓逆向  Unity手游BlueArchive蔚蓝档案剧情文本提取

更对劲了

接下来就是这个Bytes怎么解析的问题。

你要是现在能看出来这是flatbuffers,那此贴到这就完结了,但是铸币楼主当时就愣是没看出来,还以为是啥自行实现的序列化方法。

然后就对于这类U3D il2cpp的游戏,公式化的提取libil2cpp.so和global-metadata.dat,然后用Il2CppDumper反编译

..Il2CppDumper.exe libil2cpp.soglobal-metadata.dat ..output

运行完先别急着开IDA,打开dump.cs,搜索ScenarioScriptExcel,直接就能找到结构体定义

安卓逆向  Unity手游BlueArchive蔚蓝档案剧情文本提取

(IFlatbufferObject善意提醒大家这是flatbuffers)

根据定义,写出schema文件(fbs文件):

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,运行

flatc --python ScenarioScriptExcel.fbs

得到用来反序列化的python代码,然后写个脚本

import flatbuffersimport MX.Data.Excel.ScenarioScriptExcel as ScenarioScriptExcelimport jsonimport sqlite3conn = sqlite3.connect('../ExcelDB.db')cursor = conn.cursor()d = cursor.execute("select * from ScenarioScriptDBSchema")l = list(d)datas = []defread_bin_file(file_path):withopen(file_path, 'rb'as f:return f.read()defparse_scenario_script(buffer):    buf = bytearray(buffer)    fb = flatbuffers.Builder(0)    fb.Bytes = buf    scenario = ScenarioScriptExcel.ScenarioScriptExcel.GetRootAsScenarioScriptExcel(buf, 0)return scenariodefprocess(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])withopen("scenario_script.json""w", encoding="utf-8"as f:    json.dump(datas, f, ensure_ascii=False, indent=4)
安卓逆向  Unity手游BlueArchive蔚蓝档案剧情文本提取

· 今 日 推 荐 ·

安卓逆向  Unity手游BlueArchive蔚蓝档案剧情文本提取

本文内容来自网络,如有侵权请联系删除

原文始发于微信公众号(逆向有你):安卓逆向 -- Unity手游BlueArchive蔚蓝档案剧情文本提取

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月16日23:36:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安卓逆向 Unity手游BlueArchive蔚蓝档案剧情文本提取https://cn-sec.com/archives/3502573.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息