Dimole
文章9
标签13
分类6
Live2DViewerEX lpk文件加解密调试分析

Live2DViewerEX lpk文件加解密调试分析

很早以前就在 Steam 里购买了 Live2DViewerEX 用来做桌面,并且其创意工坊的二次元老婆也很多。但是有的模型不能满足某些需求(不能XX),需自己改模,但是里面的模型全部都被加密了,只有 lpk 文件,于是着手开始解密。

本文仅仅是技术向的学习和交流。
如果您认为本文侵犯了您的权益,请联系我删除。

文件分析

在创意工坊中以物品文件 ID 命名的目录下有三个文件

config.json       // 这个文件是记录创意工坊物品信息的
***.lpk           // 这个文件就是加密后打包的 lpk 了,文件名是物品文件 ID
***.png           // 这个文件是预览图,似乎是以打包时间命名的

随意看下,很容易就可以发现 lpk 文件就是应一个普通的 zip 压缩包,解压后有大量文件

1d862f7d02e6008f4550188a31ca654f    // 一个固定名字无后缀的小文件,未加密,内容与模型的信息有关
***.bin 或 ***.bin3                 // 一堆以 md5 格式命名的加密后的文件
***                                 // 一个无后缀的较大的文件,与前面的预览图是同一个文件

里面固定名字的文件 1d862f7d02e6008f4550188a31ca654f 是一个 JSON 格式文件,记录了模型的信息,其中 costum 中 path 的值是加密后的 model3.json 的文件名,是 Live2D 模型的模型配置文件。
对于这些 bin/bin3 文件的加密方式很无头绪,大概只能逆向解决,但是不知道应从何处入手,直到找到了两篇大佬的文章Live2DViewerEX 创意工坊lpk文件分析 – 动态调试Unity程序 Live2DViewerEX lpk格式加密分析 给了我很大启发。

调试分析

关于调试的准备工作如使用 dnSpy、修复 momo.dlldnSpy-Unity-mono 等,原仓库的 README 与大佬的文章都写得非常详细,这里就不多提了。

不过修补的 momo.dll 不同小版本似乎可以混合使用

Live2DViewerEX 中最易调试的是 EXStudio,替换 mono-2.0-bdwgc.dll 后直接在 dnSpy 里开始调试,并把 Assembly-CSharp.dll 也拖入 dnSpy 中。
先去 GitHub 随意找了一个 Live2D 模型仓库,搜索 lpk 到 ExportLpk 函数下断点,让 EXStudio 处理模型以便动态调试。
很容易就会看到一个疑似获取 key 的代码
获取 key
当导出的是普通 lpk 文件时,key 是打包 KeyId(可以很容易知道是时间戳,而这个在 1d862f7d02e6008f4550188a31ca654f 中存储)与文件名的字符串拼接合成的(文件名通过 ComputeHash 计算,为原始文件名经过处理后计算的 md5)。
当导出的是创意工坊文件时,key 是打包的 keyId、创意工坊文件 ID、文件名、创意工坊 metaData拼接而成(创意工坊的信息则在 config.json 中)。
进一步调试课发现这个 key 经过一系列运算生成了一个 num,这个 num 后面被用来加密文件
生成 num
加密用的是很简单的异或,可以很容易解密出来。加密时每次加密1024字节,每加密一个字节都让 num 与自身进行了一系列运算,然后与对应字节异或运算,每次加密结束会重新传入原 num
加密

编写解密程序

知道了解密算法,用自己熟悉的语言即可写出解密程序。
我是废物,只会用 C 简单写个单文件通用解密程序,然后 Node.js 写了批量调用的程序来解密。
文件类型重命名则直接判断解密后的文件头即可(记得把 JSON 里的 *.bin 文件名也换成新文件名)。
解密很成功,可以愉快的改模了
解密后

总结

无总结
(因为我太废物了,搞这些花了我挺多时间)

本文作者:Dimole
本文链接:https://blog.dml.ink/2022/07/23/l2d-lpk-decrypt/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可