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这个仓库。

  1. 首先把mono官方仓库clone下来

    git clone https://github.com/Unity-Technologies/mono

  2. 把dnSpy-Unity-mono也clone下来

    git clone https://github.com/dnSpy/dnSpy-Unity-mono

  3. 编译umpatcher,这个在dnSpy-Unity-mono/src/umpathcer里,需要使用vs进行编译。(需要安装.Net框架)

  1. 找到你需要的Mono版本,一般可以从Unity程序的properties里面看到

    比如这个就是2019.4.37-mbe

  2. 在mono官方仓库里找到对应tags的最新一个commit,把commitId记下来

    这里2019.4.37-mbe对应的就是 66f6777a1aa48e3f7455172146303ced039fc2d7

    或者也可以按dnSpy-Unity-mono里面说的,到Unity官网下个对应的Setup.exe,解包出来mono.dll看时间戳去找对应commit。

  3. 在mono仓库里切换到对应的tag,这里就是2019.4.37f1 (不确定是否必需)

  4. 使用umpatcher进行patch

    umpatcher 2019.4.37-mbe 66f6777a1aa48e3f7455172146303ced039fc2d7 "\path\to\Unity-mono" "\path\to\dnSpy-Unity-mono"

    如果是MonoBleedingEdge一定要加上-mbe,程序会用这个判断patch模式。

  5. 在dnSpy-Unity-mono仓库中找到对应的vs项目文件,开始编译,这里就是dnSpy-Unity-mono-v2019.x-V40.sln (需要windowsSDK)

  6. 把编译好的dll丢到程序对应位置,使用dnSpy开始调试。