调试Unity游戏
dnSpy可以调试Unity调试版本和发布版本。发布版本需要修改的文件是mono-2.0-bdwgc.dll / mono.dll。也可以将发布版本转换为调试版本(还不会)。
调试发行版
先备份游戏,然后进行调试。
调试就需要对mono-2.0-bdwgc.dll / mono.dll进行打补丁,有现成的,需要调试,直接替换文件即可。
首先需要知道Unity的版本号,直接看游戏主程序的属性即可。
版本号是2018.3.8
我们需要找到mono-2.0-bdwgc.dll / mono.dll。
根据Unity版本,此文件存储在不同的位置:
● <root> \ <GAME> _Data \ Mono \ mono.dll
● <root> \ <GAME> _Data \ Mono \ EmbedRuntime \ mono.dll
● <root> \ <GAME> _Data \ MonoBleedingEdge \ EmbedRuntime \ mono-2.0-bdwgc.dll
● <root> \ Mono \ EmbedRuntime \ mono.dll
● <root> \ MonoBleedingEdge \ EmbedRuntime \ mono-2.0-bdwgc.dll
将dnspy的补丁mono.dll/mono-2.0-bdwgc.dll文件复制到游戏中,覆盖其文件。
可以在下方下载补丁文件。
https://github.com/0xd4d/dnSpy/releases
现在转到debug->start debugging并选择Unity debug engine。如果游戏崩溃,您可能使用了错误的版本,或者在游戏为64位时使用了32位文件,反之亦然。
可以看到,我们动态调试成功了。
静态分析
用一道题看看静态吧。
dnspy载入Assembly-CSharp.dll,找到输出flag的源码:
可以看出,要得到flag,必须得到redList,blueList,Moon的坐标,Cloud的坐标,hp,score。
可以猜到,hp,score是要爆破的,拿坐标怎么拿呢?
可以通过修改代码,让输出的flag为我们需要的变量,像这样:
运行游戏会得到如下输出,说明s3=17.
继续修改变量,得到所有的未知变量。
然后写爆破脚本就可以了。