原文链接:https://www.cnblogs.com/zhaotianff/p/17352882.html
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对一般的程序集进行调试和修改了。复杂的情况,我目前也在摸索中。