对Live2DViewerEX生成可用mono-2.0-bdwgc.dll的尝试
首先我也是创建完这个blog的看板娘后发现的live2DviewerEX,突发奇想能不能将Live2DViewerEX里面的看板娘导出来,结果发现格式不一样,这里是被加密过的,于是乎就开始在网上搜索解密。在我实现过程中,网上生成mono-2.0-bdwgc.dll对我这种对于vs和dnspy不熟悉的用户有些不友好,然后下面就是我写一份比较完善的指南
介绍
首先可以看看Live2DViewerEX文件到底长什么样子
这里原本有三份文件
这里的lpk文件后缀可以用zip格式打开,然后解压出来是一些bin3/bin文件,里面包含了模型的参数配置,这里是被加密过的,而我们需要的是没被加密过的moc3/moc文件,原理上来说,应该是Live2DViewerEX在接受了这些bin后会将其生成为moc3/moc。
厂商会通过给mono-2.0-bdwgc.dll再做加密让我们没法直接破解它的一些逻辑,但其实我们可以自己生成一份没有加密过的mono-2.0-bdwgc.dll,来绕过厂商的限制,在Live2DViewerEX层拿到我们需要的moc文件。可以尝试hook劫持或者破译加密。网上的方法一般是破解加密,但是因为我太菜了,只做到了生成mono-2.0-bdwgc.dll,后面的我也没做。
另外提一嘴,在解压出来的文件中你可以看到两个没有后缀的文件,其实比较大的那个是模型的图的文件,另一个是模型的json配置文件,如下图
开始
然后我们着手去生成mono-2.0-bdwgc.dll文件
首先使用git下载官方的mono库和另一个工具库dnSpy-Unity-mono
1 | git clone https://github.com/Unity-Technologies/mono |
1 | git clone https://github.com/dnSpy/dnSpy-Unity-mono |
对于master分支和dnSpy两个分支的问题,其实使用git clone 的时候已经拉下来了,只需要进去后使用git checkout切换即可。(如果这里看不懂的话,建议得去搜一下git怎么使用
1 | git checkout dnSpy |
先去下载一个.NET SDK
1 | 下载地址:https://dotnet.microsoft.com/zh-cn/download |
然后我们打开vs,注意不是vscode,vscode对sln生成不太好。
1 | 下载网址:https://visualstudio.microsoft.com/zh-hans/vs/ |
首先在上面clone的dnspy-unity-mono中找到umpatcher.sln,使用vs打开
我用的是上面文件夹里面的那个umpatcher.sln,不知道这个对生成有没有关系。在这里右键选择用vs打开然后双击umpatcher.sln也行
这里点击生成就行
然后你就能在类似于这样的地址中找到
1 | C:\Users\xxxxx\dnSpy-Unity-mono\src\umpatcher\umpatcher\obj\Release\net48 |
但我建议使用everything找。
查看当前的mono版本和生成时间
找到Live2DViewerEX本地文件下的lw.exe,查看版本
1 | F:\steam\steamapps\common\Live2DViewerEX\bin\lw |
那么它的小版本就是2019.4.40,它的大版本是unity-2019.4-mbe
可以在github中搜到
打开本地的git,打开mono,使用git checkout 生成/切换到这个mbe
然后在这里输入gitk,打开一个新的应用界面,然后在这里翻,找到你的小版本,然后点击即可
点击之后跳转出的这个玩意就是你的commit hash,记录下你的commit hash
下载一个dnspy做为文件分析器,它本来就是用于二进制逆向的一款工具
1 | https://github.com/dnSpy/dnSpy/releases |
如果dnspy提示需要下什么,就下。
然后使用dnspy打开steam下的mono-2.0-bdwgc.dll,类似于下面这个地址
1 | F:\steam\steamapps\common\Live2DViewerEX\bin\lw\MonoBleedingEdge\EmbedRuntime |
然后你就能看到时间戳类似于这样,但下面这个是我新生成的。 记一下你的生成时间,比如我这里是2024/7/18
这里时间戳的用处就是比较一下你和在gitk中找到的是否是一致的,如果在那个时间点左右,多少差一点没关系。如果时间跨度很大,那可能是找错了
1 | C:\Users\xxx\dnSpy-Unity-mono\src\umpatcher\umpatcher\obj\Debug\net48\umpatcher.exe 2019.4.40-mbe 5c72e2513122ba54eb1dcaef03df123ca1a2809b "C:\Users\90674\mono" "C:\Users\xxx\dnSpy-Unity-mono" |
这样就是成功了的
如果报错为Git working tree is not clean. Check in the modified files. (Repo: C:\Users\xxx\dnSpy-Unity-mono)
那么在git中去到dnSpy-Unity-mono下运行
1 | git status 查看有哪些改变 |
然后使用git status再次查看有哪些改变如果没有了,就再尝试使用umpatcher
如果出现submodule相关问题,那么就使用
1 | git submodule update |
进行更新即可
最后会生成一个unity-2019.4.40-mbe和其他东西在C:\Users\xxx\dnSpy-Unity-mono文件夹下面
如果你下面没有dnSpy-Unity-mono-2019.x.sln等文件的话,可能和文件夹里mono.sln有关?这个我不太清除,你们可以看看
1 | "C:\Users\xxx\dnSpy-Unity-mono\unity-2019.4.40-mbe\msvc\mono.sln" |
有dnSpy-Unity-mono-2019.x.sln等东西的话,可以去直接在vs中生成一下相应的dll
最后dll文件会出现在
1 | C:\Users\xxx\dnSpy-Unity-mono\builds\Release\unity-2019.4.40\win64 |
现在就完成了生成,接下了就将dll文件替换掉live2DviewerEX现有的同名文件,然后再用dnspy进行逆向即可啦/这步我不会(悲)
参考链接:
Live2DViewerEX 创意工坊文件解密 - 洛绫璃 - 博客园 (cnblogs.com)
Live2DViewerEX 创意工坊lpk文件分析 - 动态调试Unity程序 - α-Lyraeα-Lyrae (chr.fan)