如何在没有第三方.NET库源码的情况,调试第三库代码?

大家好,我是沙漠尽头的狼。

本方首发于Dotnet9,介绍使用dnSpy调试第三方.NET库源码,行文目录:

  • 安装dnSpy
  • 编写示例程序
  • 调试示例程序
  • 调试.NET库原生方法
  • 总结

1. 安装dnSpy

dnSpy是一款功能强大的.NET程序反编译工具,可以对.NET程序进行反编译,代替库文档的功能,代码丢失或者损坏可直接恢复,所以能在完全没有源码的情况下即时调试程序,甚至还能修改程序!

Github有二进制可执行程序下载地址,也有源码可以自行编译,本文使用前者,Github地址是:https://github.com/dnSpy/dnSpy

2. 编写示例程序

示例为一个桌面程序,输入数字,右侧回显输入的数字是奇数还是偶数:

示例代码比较简单,界面绑定和ViewModel关系截图看完所有:

奇偶判断由类TestToolTellMeOddEven方法返回,再回看回显,咦,0是奇数?1是偶数?

TestTool类是其他库定义,我假装你没有源码哈,虽然你有:

类具体定义如下:

namespace TestDll;public class TestTool
{public string TellMeOddEven(int number){if (number % 2 == 1){return $"{number}是偶数";}return $"{number}是奇数";}
}

3. 调试示例程序

打开dnSpy,将主程序引用的TestDll拖入:

可以看到反编译后的代码:

反编译出来的方法定义会和第三方源码可能不同,以下是一些可能导致不同反编译结果的因素:

  1. 编译器优化:不同版本的编译器可能会对代码进行不同的优化,例如使用不同的算法、数据结构或者代码重排等。这些优化可能会导致反编译出来的代码结构和顺序不同,本文示例使用 .NET 8开发,.NET Framework编译的库可能反编译出来与源码几乎一致。

  2. 反编译工具更新:dnSpy本身也会不断更新,以适应新的.NET版本和编译器特性。这些更新可能会改变反编译算法和策略,从而导致不同版本的dnSpy反编译结果不一致。

代码简单,对比源码和反编译的代码查看,对整型入参除2取余,如果等于1判断为偶数,否则为奇数,当然这是错的,假如代码逻辑复杂,可以用dnSpy调试。

运行测试程序,并在dnSpy中给方法打断点,在调试菜单附加测试程序,就和VS中操作类似:

4. 调试.NET库方法

上面调试示例程序的方法可用于其他第三方.NET库,那么.NET自身库方法呢?

方法类似,找到.NET库对应类、对应方法,运行目标程序,然后打断点。.NET库方法这样找:点击【文件】》【从GAC打开】=》搜索目标库,双击库,再查找目标方法,后面调试步骤就是一样了:

5. 总结

  • 技术交流加群请添加站长微信号:dotnet9com
  • 文中示例代码:MultiVersionLibrary

dnSpy很强大的,还能直接监视第三方代码的变量、修改值等,就和你使用VS开发自己的程序一样,了解更多用法还请查看文章开头给的链接https://github.com/dnSpy/dnSpy, 这篇大佬的文章也不错,建议看看:《神器如 dnSpy,无需源码也能修改 .NET 程序》。

对了,示例程序中奇偶数判断不对,我又没代码我想纠正怎么办?

解决这个问题,上面大佬的文章您可以拜读了,下一篇站长继续讲解第三方库拦截,能实现不修改第三方库达到修改方法逻辑和返回结果的效果,可以提前预习快学会这个技能-.NET API拦截技法,当然下一篇会有新知识点:非公有类非公有方法拦截技法。

以原仓库两张dnSpy调试第三方库的动图结束本文:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/139030.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java 基础篇】Java线程安全与并发问题详解

多线程编程在Java中是一个常见的需求,它可以提高程序的性能和响应能力。然而,多线程编程也带来了一系列的线程安全与并发问题。在本文中,我们将深入探讨这些问题,以及如何解决它们,适用于Java初学者和基础用户。 什么…

【AI视野·今日NLP 自然语言处理论文速览 第三十六期】Wed, 20 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 20 Sep 2023 Totally 64 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers SlimPajama-DC: Understanding Data Combinations for LLM Training Authors Zhiqiang Shen, Tianhua Tao, Li…

原生js值之数据类型详解

js的数据类型 数据类型分类基本数据类型boolean:布尔类undefined:未定义的值null类型数值转换 NumberparseInt 转换整数 parseFloat转换浮点数 String类型特点如何转换成字符串模板字面量字符串插值模板字面量标签函数 symbol类型特性使用 BigInt类型复杂数据类型Object类属性与…

[杂谈]-八进制数

八进制数 文章目录 八进制数1、概述2、八进制数的表示2.1 八进制数2.2 以八进制计数2.3 二进制数补零 3、八进制到十进制转换4、十进制到八进制转换5、二进制到八进制转换示例6、八进制到二进制和十进制转换示例7、总结 1、概述 八进制编号系统是另一种使用基数为8计数系统&am…

【Stm32】【Lin通信协议】Lin通信点亮灯实验

Lin通信点亮灯实验 通过STM32的串口发送数据,然后通过串口转换模块将数据转换成LIN(Local Interconnect Network)协议,最终控制点亮灯。需要工程和入门资料的可以私信我,看到了马上回。 入门书本推荐: 一…

【C++面向对象侯捷下】2.转换函数 | 3.non-explicit-one-argument ctor

文章目录 operator double() const {} 歧义了 标准库的转换函数

exe文件运行后无输出直接闪退如何找解决办法

一.搜索栏搜事件查看器 二.点开windows日志下的应用程序 三.找到错误处 四.搜索异常代码 点开有错误的详细信息,直接用搜索引擎搜索这个异常代码能大致判断是什么问题,给了一个解决思路,不至于不知道到底哪里出了问题

AUTOSAR词典:CAN驱动Mailbox配置技术要点全解析

AUTOSAR词典:CAN驱动Mailbox配置技术要点全解析 前言 首先,请问大家几个小小问题,你清楚: AUTOSAR框架下的CAN驱动关键词定义吗?是不是有些总是傻傻分不清楚呢?CAN驱动Mailbox配置过程中有哪些关键配置参…

Angular变更检测机制

前段时间遇到这样一个 bug,通过一个 click 事件跳转到一个新页面,新页面迟迟不加载; 经过多次测试发现,将鼠标移入某个 tab ,页面就加载出来了。 举个例子,页面内容无法加载,但是将鼠标移入下图…

[面试] k8s面试题 2

文章目录 核心组件1.什么是 Kubernetes 中的控制器(Controller)?请提供一些常见的控制器类型。2.请解释一下 Kubernetes 中的 Ingress 是什么,以及它的作用。3.如何通过命令行在 Kubernetes 中创建一个 Pod?4.Stateful…

Pdf文件签名检查

如何检查pdf的签名 首先这里有一个已经签名的pdf文件&#xff0c;通过pdf软件可以看到文件的数字签名。 图1为签名后的文件&#xff0c;图2为签名后文件被篡改。 下面就是如何代码检查这里pdf文件的签名 1.引入依赖 <dependency><groupId>org.projectlombok<…

数据结构——单链表

目录 一.前言 二.链表表示和实现&#xff08;单链表&#xff09; 1.1 顺序表的优缺点 1.2 链表的概念及结构 1.3 打印函数 1.4 空间函数 1.5 尾插函数&#xff08;最最最麻烦的&#xff09; 1.5.1 尾插最关键部分&#xff01; 1.6 头插函数 1.7 尾删函数…

云流化:XR扩展现实应用发展的一个新方向!

扩展现实的发展已经改变了我们工作、生活和娱乐的方式&#xff0c;而且这才刚刚开始。扩展现实 (Extended reality, XR) 涵盖了沉浸式技术&#xff0c;包括虚拟现实、增强现实和混合现实。从游戏到虚拟制作再到产品设计&#xff0c;XR 使人们能够以前所未有的方式在计算机生成的…

#循循渐进学51单片机#指针基础与1602液晶的初步认识#not.11

1、把本节课的指针相关内容&#xff0c;反复学习3到5遍&#xff0c;彻底弄懂指针是怎么回事&#xff0c;即使是死记硬背也要记住&#xff0c;等到后边用的时候可以实现顿悟。学会指针&#xff0c;就是突破了C语言的一道壁垒。 2&#xff0c;1602所有的指令功能都应用一遍&#…

vue3——pixi初学,编写一个简单的小游戏,复制粘贴可用学习

pixi官网 小游戏效果 两个文件夹 一个index.html 一个data.js //data.js import { reactive } from "vue"; import { Sprite, utils, Rectangle, Application, Text, Graphics } from "pixi.js";//首先 先创建一个舞台 export const app new Applicat…

[Go疑难杂症]为什么nil不等于nil

现象 在日常开发中&#xff0c;可能一不小心就会掉进 Go 语言的某些陷阱里&#xff0c;而本文要介绍的 nil ≠ nil 问题&#xff0c;便是其中一个&#xff0c;初看起来会让人觉得很诡异&#xff0c;摸不着头脑。 先来看个例子&#xff1a; type CustomizedError struct {Err…

【面试必刷TOP101】 删除有序链表中重复的元素-I 删除有序链表中重复的元素-II

目录 题目&#xff1a;删除有序链表中重复的元素-I_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;删除有序链表中重复的元素-II_牛客题霸_牛客网 (nowcoder…

摩尔信使MThings实用功能盘点

“冗长的用户手册”与“精简的交互设计”之间势必产生一条信息鸿沟&#xff0c;现在就来盘点一下摩尔信使MThings有哪些隐蔽而实用的功能。 01 数据配置类 一键刷新 功能&#xff1a;快速读取所有位数据、寄存器数据的当前数值。 操作&#xff1a;双击“数值”列表头。 一键…

11:STM32---spl通信

目录 一:SPL通信 1:简历 2:硬件电路 3:移动数据图 4:SPI时序基本单元 A : 开/ 终条件 B:SPI时序基本单元 A:模式0 B:模式1 C:模式2 D:模式3 C:SPl时序 A:发送指令 B: 指定地址写 C:指定地址读 二: W25Q64 1:简历 2: 硬件电路 3:W25Q64框图 4: Flash操作注意…

MongoDB的搭建 和crud操作

MongoDB docker 下载 docker run --restartalways -d --name mongo -v /docker/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6使用navcat工具使用MongoDB Crud操作 jar包 <dependency><groupId>org.projectlombok</groupId><artifactId>lom…