- 前言
- 一、环境
- 二、使用步骤
- 三、解决问题
前言
dnSpy反编译工具读取dll文件内容并且在dnspy里面调试dll文件。
在说反编译工具之前,先说一下我为什么会用到反编译工具。
前因:这是一个后端管理网站,因为客户那面在正式网址里面出现,同一个值,两个页面取出来的值不一样。测试网址取出来的值是一致的,所以需要在客户正式服务器上进行排查问题。
思考:既然是取得同一个值,两个页面取出来的数据却不一样,很明显,其中一个页面的取值有问题。
解决:这就用到了dnSpy反编译工具,把正式服务器上发布的dll程序集进行反编译,并且调试反编译出来的代码。
一、环境其实很多刚接触net的可能对dll、反编译的概念比较模糊。这里稍微说下我的理解:在vs里面我使用汇编语言c#进行代码的编写,在我写好c#语言代码后,这时候在电脑上运行代码需要通过CLR(公共语音运行时,net里面的核心机制)把c#语言转换成电脑机器可以识别的语言,通过CRL转换之后你的c#代码就会变成一个个dll程序集(基本一个类库一个程序集),虽然这些dll程序集你看不懂,但是电脑机器可以读懂。这个dll文件你用其他软件是打不开的,就算打开也是一堆乱码,这样做也有好处,就是可以保护程序的安全性。但是你想看里面的一些东西也会看不到,那怎么办,我有时候没有源码,或者源码发生更改了,需要看dll里面的东西,这时候可以使用反编译工具(有很多工具这里使用的dnSpy)解析里面的内容,反编译工具的作用就是可以看到dll里面的源码。能看到源码如果还找不到问题点,那么就可以使用dnSpy进行dll源码调试。
先附上dnSpy(6.1.8版本)网盘连接:
链接:https://pan.baidu.com/s/1EVB89FwXIPrjirEeCfr-Ow
提取码:4os2
调试项目为net5.0框架,发布到iis上之后,通过对发布文件里面dll(程序集)文件反编译,并且实现断点调试。
1:添加系统环境变量,COMPLUS_ZapDisable = 1
2:如果需要调试IIS进程,可进入C:WindowsSystem32inetsrv目录执行appcmd list wp 查看对应的应用程序池进程ID
3:打开dnspy,调试–>附加到进程–>选择相应的进程ID–>附加
4:调试–>窗口–>模块–>搜索要调试的程序集–>双击
5:在程序集资源管理器找到要调试的类打开,打断点即可
附上步骤图片:
添加环境变量
查看对应的应用程序池进程ID,其实如果进程里面只有一个w3wp.exe进程根本不需要进程ID进行区分,不过方法还是要写出来。
cd c:windowssystem32inetsrv
appcmd list wp
发现报错 message:WAS 服务不可用 - 请先尝试启动该服务。
解决办法:管理员方式运行 cmd(命令提示符)
打开dnspy,附加进程进行调试
这个时候就可以调试了,下面是我调试的时候遇到的几个问题。
1:不能把dll文件直接拖到dnSpy里面,直接复制或者拖拽进来的dll无法命中断点。需要按照步骤:点【调试】-【附加到进程】-选择【w3wp.exe】进程,进程ID就是命令提示符里面获取到的那个(我这里是25560,每个不一样)。
选择完进程,在【模块】里面就可以看到当前进程下面的dll文件了,我需要调试web.dll,所以就双击web.dll就可以在右侧看到这个dll文件了。
2:按照上面的步骤进去发现附加到进程里面没有w3wp.exe进程,原因是没有使用管理员运行dnSpy工具。检查网站已经打开运行、使用管理员模式运行dnSpy,这两步做好进程就不会出现这个问题了。



