首先我也是创建完这个blog的看板娘后发现的live2DviewerEX,突发奇想能不能将Live2DViewerEX里面的看板娘导出来,结果发现格式不一样,这里是被加密过的,于是乎就开始在网上搜索解密。在我实现过程中,网上生成mono-2.0-bdwgc.dll对我这种对于vs和dnspy不熟悉的用户有些不友好,然后下面就是我写一份比较完善的指南

介绍

首先可以看看Live2DViewerEX文件到底长什么样子

这里原本有三份文件

img

这里的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配置文件,如下图

img

开始

然后我们着手去生成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

img

先去下载一个.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打开

img

我用的是上面文件夹里面的那个umpatcher.sln,不知道这个对生成有没有关系。在这里右键选择用vs打开然后双击umpatcher.sln也行

img

这里点击生成就行

然后你就能在类似于这样的地址中找到

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

image-20240718090921607

那么它的小版本就是2019.4.40,它的大版本是unity-2019.4-mbe

可以在github中搜到

image-20240718091211386

打开本地的git,打开mono,使用git checkout 生成/切换到这个mbe

image-20240718091433919

然后在这里输入gitk,打开一个新的应用界面,然后在这里翻,找到你的小版本,然后点击即可

image-20240718091605025

点击之后跳转出的这个玩意就是你的commit hash,记录下你的commit hash

image-20240718091702751

下载一个dnspy做为文件分析器,它本来就是用于二进制逆向的一款工具

1
2
3
https://github.com/dnSpy/dnSpy/releases
或者
https://blog.csdn.net/aeaxea43/article/details/108632786

如果dnspy提示需要下什么,就下。

然后使用dnspy打开steam下的mono-2.0-bdwgc.dll,类似于下面这个地址

1
F:\steam\steamapps\common\Live2DViewerEX\bin\lw\MonoBleedingEdge\EmbedRuntime

然后你就能看到时间戳类似于这样,但下面这个是我新生成的。 记一下你的生成时间,比如我这里是2024/7/18

image-20240718090517082

这里时间戳的用处就是比较一下你和在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"

image-20240718101202860

这样就是成功了的

如果报错为Git working tree is not clean. Check in the modified files. (Repo: C:\Users\xxx\dnSpy-Unity-mono)

那么在git中去到dnSpy-Unity-mono下运行

1
2
3
4
5
6
7
8
9
git status 查看有哪些改变

使用git reset --hard清除

或者

git add .

git commit -m "mono" 提交改变

然后使用git status再次查看有哪些改变如果没有了,就再尝试使用umpatcher

如果出现submodule相关问题,那么就使用

1
git submodule update

进行更新即可

最后会生成一个unity-2019.4.40-mbe和其他东西在C:\Users\xxx\dnSpy-Unity-mono文件夹下面

image-20240718102328988

如果你下面没有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

image-20240718102721723

最后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)

【逆向工程】生成能够用dnSpy调试的mono-2.0-bdwgc.dll(一)-CSDN博客