.NET程序集编辑器/调试器 dnSpy 使用介绍

dnSpy

dnSpy是一个.NET程序集调试器和编辑器。它可以用它来编辑和调试程序集,即使在没有源码的情况下。

主要功能:

调试.NET和Unity程序集
编辑.NET和Unity程序集

项目地址:

https://github.com/dnSpy/dnSpy

直接下载Release即可。

完整的功能介绍可以参考 项目下的README

 

这玩意儿简直就是神器啊,像平常win32程序,反汇编出来,只能通过修改汇编代码来达到修改程序的目的。

dnSpy除了具备了.NET Reflector、ILSpy等工具的反编译功能外,还具备了调试和编辑程序集的功能。

在最初我接触这个还是为了修改程序集里的资源文本,后面在论坛看到使用dnSpy修改程序集达到破解的目的。这里就系统的学习一下dnSpy,并做个总结。

 

反编译功能

直接通过文件菜单,打开本地程序集或者GAC程序集,就可以对程序集进行反编译。

对于.NET自带程序集里InternalXXX或XXXInternal的函数,可以参考https://www.cnblogs.com/zhaotianff/p/16555734.html

 

如何修改程序集资源

如果程序集里定义了字符串资源,在没有源码的情况下,可以利用dnSpy修改程序集资源

最初我用dnSpy也是修改程序集里多语言翻译的字符串

 

创建一个WPF工程,增加一条字符串资源 

然后在界面上增加一个按钮,在按钮事件里使用消息框输出这条字符串

 

然后使用dnSpy打开,找到这条字符串资源,可以直接编辑

 

 

编辑完成后,再运行程序,结果如下

 

说明:

dnSpy不支持修改XAML,所以定义在XAML里的字符串是无法修改的

 

如何调试程序集

使用dnSpy打开需要调试的程序集

 

找到需要调试的代码段,添加断点

 

 

点击启动按钮,

如果调试的是DLL,需要在可执行程序这里选择调用这个DLL的程序。

中断于这里可以根据这里需求进行选择,如果想直接跳到自己设置的断点处开始调试,可以选择不要中断

单击确定,即可开始调试程序。

 

说明:

1.dnSpy的调试和Visual Studio调试差不多,这里就不做详细介绍了。快捷键啥的也和Visual Studio基本上差不多,如添加断点可以按F9,F10逐过程,F11逐语句等。

2.对于已经混淆过的代码,可以使用de4dot进行还原。https://www.cnblogs.com/zhaotianff/p/17229625.html

 

开始调试后,在局部变量这里可以看到实时变量信息

 

如何修改方法/类

在没有源码的情况下,可以使用dnSpy修改方法/类的代码。

 

这里还是以前面的代码为例

 

假设我们要修改按钮点击事件的处理代码,直接在函数上右键,选择编辑方法

 

添加一行,然后点编译按钮

 

说明:如果模块的依赖库没有在dnSpy中打开,会报类型找不到,类似下面这样。

 在左下角添加类型引用即可(如果是.Net Framwork自带的类,从GAC中打开就可以)

编译通过后,打开文件菜单,选择保存模块

 

单击确定,就可以将刚才修改的内容保存到模块中去。此时我们再运行,点击 按钮,就会弹出Modified by dnSpy,再弹出HelloWorld

 

 dnSpy还提供了其它几种编辑类型,跟上面的操作大同小异,可以自行尝试。

 

说明:

如果要修改已经混淆过,而且不能还原的代码,可以

1.寻找能通过编译的函数进行修改,这种方式不一定能达到预期效果,因为有可能取不到自己所需要的变量值。

2.直接修改IL代码,对于不懂IL的人来说这种方式有点困难。不过可以先模仿编写C#代码,再获取IL代码。

 

对于异步代码,目前还需要研究async/await的实现原理,后面再更新。

 

到这里,已经可以使用dnSpy对一般的程序集进行调试和修改了。复杂的情况,我目前也在摸索中。

posted @ 2023-04-25 15:56  zhaotianff  阅读(4495)  评论(0编辑  收藏  举报