dnSpy调试Unity程序
Background
想日一个东西,发现是个Unity写的程序,而且被混淆过,有点难看。
想去动调,发现Unity写的东西想调试Assembly-Csharp.dll不能直接用dnSpy起,没法动调,看了下github的仓库,发现仓库已经是Archived的了,很多东西都没了。网上找了下资料很多也语焉不详,这里记录一下怎么用dnSpy去调Unity。
Patch Mono
用dnSpy去调试Unity需要魔改Mono的代码,详细可以看https://github.com/dnSpy/dnSpy-Unity-mono这个仓库。
首先把mono官方仓库clone下来
git clone https://github.com/Unity-Technologies/mono
把dnSpy-Unity-mono也clone下来
git clone https://github.com/dnSpy/dnSpy-Unity-mono
编译umpatcher,这个在dnSpy-Unity-mono/src/umpathcer里,需要使用vs进行编译。(需要安装.Net框架)
找到你需要的Mono版本,一般可以从Unity程序的properties里面看到
比如这个就是2019.4.37-mbe
在mono官方仓库里找到对应tags的最新一个commit,把commitId记下来
这里2019.4.37-mbe对应的就是
66f6777a1aa48e3f7455172146303ced039fc2d7
或者也可以按dnSpy-Unity-mono里面说的,到Unity官网下个对应的Setup.exe,解包出来mono.dll看时间戳去找对应commit。
在mono仓库里切换到对应的tag,这里就是2019.4.37f1 (不确定是否必需)
使用umpatcher进行patch
umpatcher 2019.4.37-mbe 66f6777a1aa48e3f7455172146303ced039fc2d7 "\path\to\Unity-mono" "\path\to\dnSpy-Unity-mono"
如果是MonoBleedingEdge一定要加上-mbe,程序会用这个判断patch模式。
在dnSpy-Unity-mono仓库中找到对应的vs项目文件,开始编译,这里就是
dnSpy-Unity-mono-v2019.x-V40.sln
(需要windowsSDK)把编译好的dll丢到程序对应位置,使用dnSpy开始调试。