碧蓝航线Lua代码和JSON数据提取方案

AutumnSun

最终成果

Lua代码: AzurLaneTools/AzurLaneLuaScripts

JSON数据: AzurLaneTools/AzurLaneData

相关工具

数据解密工具

碧蓝航线使用了luajit作为脚本引擎, 核心代码都保存在 scripts32 文件中, 此外还有部分数据保存在 sharecfgdata 目录下.

scripts32文件使用了两层加密: 外层是对 UnityAssetBundle 文件整个加密, 可以使用 uabdec 进行还原.

还原后, 得到 UnityAssetBundle 文件, 可以使用 UnityPy 等工具提取出加密后的 LuaJIT 字节码. (PS: 其实是对字节码进行了部分魔改)

这些字节码可以使用 bcdec 进行还原, 还原后将会得到正常版本的 LuaJIT字节码.

开发过程中, 也尝试对上面两个解密工具进行了一些二次开发, 例如linux环境适配、支持使用stdin/stdout直接输出等.

对于JSON数据提取来说, 可以直接补全或者模拟部分运行环境后, 直接执行这些LuaJIT字节码, 可以免除反编译的时间. AzurLaneData 目前的提取流程就是使用的这一方式.

当然, 在没有看到过反编译结果的情况下, 补全或者模拟运行环境其实是不太现实的任务, 因此在分析阶段还是会依赖于反编译的结果.

反编译工具

LuaJIT 字节码的反编译也有一些现成的工具, AzurLaneLuaScripts 目前使用的是AzurLaneTools/ljd .

这是基于Dr-MTN/luajit-decompiler 进行了一些针对性二次修改的版本, 主要修改其实就是针对反编译时的各种报错进行手动处理.

此外, 还加上了一些辅助函数, 例如支持bytes的输入和输出, 从而减少文件IO.

其他工具

除了数据处理之外, 数据获取也是一个不可忽略的部分. 这里需要的文件是 scripts32 文件, 以及 sharecfgdata 目录下的所有文件.

具体实现方案最初是基于 nobbyfix/AzurLaneTools 的代码实现的. 后期通过对Lua代码的分析重新实现了一套更完善的、包含其他数据解析的方案, 但基本操作还是没有变化, 这里就先忽略了.

上述这些工具结合在一起, 再加上 Github Actions 以及相关的组装代码, 就实现了这两套自动化的数据提取流程.

定时任务实现

实际实现中, 最麻烦的地方其实还是如何减少重复任务的执行. 因为Lua文件的数量非常庞大, 因此如果每次都全部重跑的话, 每个服务器的耗时都会是几小时的级别.

再加上目标是使用 Github Actions 实现自动化, 因此测试起来自然是远不如本地执行方便, 花了不少时间进行调试, 并且中途还出现过几次数据消失的情况.

不过, 现在来看当时的选择还是很正确的, 因为Github Actions的存在, 保证了相对及时的自动更新, 免除了大量维护需求.

毕竟, 大部分情况下机器都要比人更加可靠, 尤其是我这种比较懒的人😜.

  • 标题: 碧蓝航线Lua代码和JSON数据提取方案
  • 作者: AutumnSun
  • 创建于: 2022-06-15 19:52:51
  • 更新于: 2023-04-05 22:35:57
  • 链接: https://autumn21.top/blog/2022-06-15/51831f8fea33/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
碧蓝航线Lua代码和JSON数据提取方案