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

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

相关推荐
我曾经是个程序员28 分钟前
C#File文件基础操作大全
开发语言·c#
三天不学习1 小时前
C# 中的记录类型简介 【代码之美系列】
后端·c#·微软技术·record·记录类型
Artistation Game2 小时前
一、c#基础
游戏·unity·c#·游戏引擎
chen_2272 小时前
kanzi3.6.10 窗口插件-查找绑定信息
c#·kanzi
Murphy20235 小时前
.net4.0 调用API(form-data)上传文件及传参
开发语言·c#·api·httpwebrequest·form-data·uploadfile·multipart/form-
我曾经是个程序员5 小时前
C#Directory类文件夹基本操作大全
服务器·开发语言·c#
鸿喵小仙女6 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
一个不正经的林Sir7 小时前
C#WPF基础介绍/第一个WPF程序
开发语言·c#·wpf
码农君莫笑17 小时前
使用blazor开发信息管理系统的应用场景
数据库·信息可视化·c#·.net·visual studio
可喜~可乐19 小时前
C# WPF开发
microsoft·c#·wpf