dnSpy

神器如 dnSpy,无需源码也能修改 .NET 程序

Deadly 提交于 2021-01-17 06:39:12
dnSpy 是 0xd4d 开发的 .NET 程序调试神器。 说它是神器真的毫不为过!它能在完全没有源码的情况下即时调试程序,甚至还能修改程序!本文讲向大家介绍如何使用 dnSpy 修改 .NET 程序。 如果你发现本文原本应该有图的地方却没有看到图片,那可能是被某种特殊的网络屏蔽了。请移步至 神器如 dnSpy,无需源码也能修改 .NET 程序 - 吕毅 - gitee 阅读。 dnSpy 的主打功能是无需源码的调试, 林德熙 有一篇文章 断点调试 Windows 源代码 介绍了这个方法。而本文主要说其另一项强大的功能 —— 修改程序集。 看看 dnSpy dnSpy 长着一身 Visual Studio 一样的外观,调试的时候给你熟悉的感觉。 我们只需要讲我们需要调试或修改的程序集拖入左侧的程序集列表中即可(它会自动为我们把此程序集依赖的程序集也添加进来)。我把以前我写过的一个程序 ManipulationDemo 拖进来了。 实操修改程序集 现在我们来修改它,修改什么好呢?为了让效果明显一点,我决定在启动时弹一个窗口。于是我们展开进入到 App 类中。 然后在类中右键“Edit class (C#)”: 在里面重写 OnStartup 方法。发现,它竟然连智能感知提示都做了! 改完只需要点击一下右下角的编译,即可讲修改应用到我们刚刚打开的程序集中。 保存修改的程序集

.NET 反编译调试神器:dnSpy了解一下

亡梦爱人 提交于 2021-01-17 06:38:43
如果客户环境出了问题,而又无法快速定位问题,可以借助dnSpy进行反编译调试跟踪。 可前往[dnSpy官网下载: https://github.com/0xd4d/dnSpy ]或直接从我的[分享链接: https://1drv.ms/u/s!Ag9J9FrcQ96Zg-hU64GPaM-GtASMCA ]下载(内置包含.NET Framework 4.7.1,若运行提示需要安装,可解压找到 . NET Framework 4.7. 1- x86 - x64 - AllOS - ENU . exe 安装)。 具体操作步骤如下所示: 添加系统环境变量, COMPLUS_ZapDisable = 1 如果需要调试IIS进程,可进入 C : \Windows\System32\inetsrv 目录执行 appcmd list wp 查看对应的应用程序池进程ID 打开dnspy,调试-->附加到进程-->选择相应的进程ID-->附加(支持同时附加多个进程) 调试-->窗口-->模块-->搜索要调试的程序集-->双击 在程序集资源管理器找到要调试的类打开,打断点即可 右键要修改的类文件-->编辑类/方法-->修改类-->编译 文件-->保存模块-->选择要保存的路径-->保存 将保存的重新编译的程序集替换到目标路径即可 执行 iisreset (若为IIS应用) 图一:配置环境变量 图二

dnSpy反编译、部署调试神器

杀马特。学长 韩版系。学妹 提交于 2021-01-16 13:21:13
一、概要 在工作当中,当程序部署了之后就算打了日志遇到极个别的特殊异常没有在程序日志中体现出来或者没有详细的报错原因会让开发者非常头疼,不得不盲猜bug到底出在哪里。这里分享一下工作上经常会用到的工具,这款工具可以反编译并运行调试已经部署好的引用程序,不管是.net framework还是.net core的都可以进行操作同时也能看到IL指令集。 开源地址:https://github.com/dnSpy/dnSpy 下载可执行工具地址:https://github.com/dnSpy/dnSpy/releases 二、详细内容 在git上下载好程序之后 解压之后能看到dnSpy.exe和dnSpy-x86.exe,分别用来解析x64和x86的应用程序。这时候根据自己编译的版本来选择即可。 打开之后的界面,这时候直接点击“启动”或者直接F5。 选择你想调试的程序集。 这里就像使用IDE一样,可以设置断点可以修改代码、查看程序集的引用等等操作。 在文本区域点右键可以看到Edit class点击之后弹出框内可以直接修改编辑已部署好的代码。 dnSpy是一款功能非常强大基于.net程序的反编译调试工具,能熟练掌握它能给工作和学习带来非常的大的便利。如果访问github慢的小伙伴可以加下文章末尾的群。群里会不定时共享学习资源和技术讨论。 希望大家多多支持。不胜感激。 E-Mail

探索低版本 .Net 反序列化实现 Exchange RCE

大城市里の小女人 提交于 2020-10-20 10:53:30
作者:EazyLov3 本文为作者投稿,Seebug Paper 期待你的分享,凡经采用即有礼品相送! 投稿邮箱:paper@seebug.org 0x10 起因 近期在众所周知的活动中,各种漏洞利用花样不断,值得好好复盘一番。其中一位蓝方朋友负责的Exchange Server 2010沦陷引起了我的兴趣,因为日志被删没有第一时间找到入侵方法,对比备份后发现ecp目录下存在一名为LiveIdError.aspx的空白文件,Google了一下才发现是 CVE-2020-0688反序列化攻击 ,但细究一下竟发现没有针对Exchange Server 2010及以下版本的公开利用方法,似乎是因为低版本.Net Framework(下称fx)的反序列化限制而难以利用。 在可利用性得到@zcgonvh 前辈肯定之后,本文尝试复现这个漏洞在Exchange Server 2010环境下的利用方法。 0x20 漏洞相关资料 对.Net和Exchange都一无所知的我来说,首先要做的当然是先搞清楚为什么现有的PoC和利用方法不能利用在低版本,具体限制是什么。 0x21 现有的利用方式的关键Payload 在GitHub检索CVE-2020-0688关键字,排名靠前的有以下几个项目 https://github.com/Ridter/cve-2020-0688 https://github.com

用过 mongodb 吧, 这三个大坑踩过吗?

旧街凉风 提交于 2020-10-13 00:56:12
一:背景 1. 讲故事 前段时间有位朋友在微信群问,在向 mongodb 中插入的时间为啥取出来的时候少了 8 个小时,8 在时间处理上是一个非常敏感的数字,又吉利又是一个普适的话题,后来我想想初次使用 mongodb 的朋友一定还会遇到各种新坑,比如说: 插入的数据取不出来,看不爽的 ObjectID,时区不对等等,这篇就和大家一起聊一聊。 二: 1号坑 插进去的数据取不出来 1. 案例展示 这个问题是使用强类型操作 mongodb 你一定会遇到的问题,案例代码如下: class Program { static void Main(string[] args) { var client = new MongoClient("mongodb://192.168.1.128:27017"); var database = client.GetDatabase("school"); var table = database.GetCollection<Student>("student"); table.InsertOne(new Student() { StudentName = "hxc", Created = DateTime.Now }); var query = table.AsQueryable().ToList(); } } public class Student {

终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的

六眼飞鱼酱① 提交于 2020-09-29 15:42:22
一:背景 1. 讲故事 前几天有位朋友让我有时间分析一下 aspnetcore 中为什么向 ServiceCollection 中注入的 Class 可以做到 Singleton,Transient,Scoped,挺有意思,这篇就来聊一聊这一话题,自从 core 中有了 ServiceCollection, 再加上流行的 DDD 模式,相信很多朋友的项目中很少能看到 new 了,好歹 spring 十几年前就是这么干的。 二:Singleton,Transient,Scoped 基本用法 分析源码之前,我觉得有必要先介绍一下它们的玩法,为方便演示,我这里就新建一个 webapi 项目,定义一个 interface 和 concrete ,代码如下: public class OrderService : IOrderService { private string guid; public OrderService() { guid = $"时间:{DateTime.Now}, guid={ Guid.NewGuid()}"; } public override string ToString() { return guid; } } public interface IOrderService { } 1. AddSingleton 正如名字所示它可以在你的进程中保持着一个实例

await,async 我要把它翻个底朝天,这回你总该明白了吧

半世苍凉 提交于 2020-09-27 18:04:57
一:背景 1. 讲故事 await,async 这玩意的知识点已经被人说的烂的不能再烂了,看似没什么好说的,但我发现有不少文章还是从理论上讲述了这两个语法糖的用法,懂得还是懂,不懂的看似懂了过几天又不懂了,人生如戏全靠记是不行的哈😄😄😄,其实本质上来说 await, async 只是编译器层面上的语法糖,在 IL 层面都会被打成原型的,所以在这个层面上认识这两个语法糖是非常有必要的。 二:从 IL 层面认识 1. 使用 WebClient 下载 为了方便打回原型,我先上一个例子,使用 webclient 异步下载 http://cnblogs.com 的html,代码如下: class Program { static void Main(string[] args) { var html = GetResult(); Console.WriteLine("稍等... 正在下载 cnblogs -> html \r\n"); var content = html.Result; Console.WriteLine(content); } static async Task<string> GetResult() { var client = new WebClient(); var content = await client.DownloadStringTaskAsync(new

一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗

好久不见. 提交于 2020-08-20 06:32:28
一:背景 1. 讲故事 最近因为各方面原因换了一份工作,去了一家主营物联柜的公司,有意思的是物联柜上的终端是用 wpf 写的,代码也算是年久失修,感觉技术债还是蛮重的,前几天在调试一个bug的时候,看到了一段类似这样的代码: var dt = new DataTable(); SqlDataAdapter adapter = new SqlDataAdapter(new SqlCommand()); adapter.Fill(dt); 是不是很眼熟哈,或许你也已经多年不见了,犹记得那时候为了能从数据库获取数据,第一种方法就是采用 SqlDataReader 一行一行从数据库读取,而且还要操心 Reader 的 close 问题,第二种方法为了避免麻烦,就直接使用了本篇说到的 SqlDataAdapter ,简单粗暴,啥也不用操心,对了,不知道您是否和我一样对这个 Fill 方法很好奇呢?,它是如何将数据塞入到 DataTable 中的呢? 也是用的 SqlDataReader 吗? 而且 Fill 还有好几个扩展方法,哈哈,本篇就逐个聊一聊,就当回顾经典啦! 二:对Fill方法的探究 1. 使用 dnspy 查看Fill源码 dnspy小工具大家可以到GitHub上面去下载一下,这里就不具体说啦,接下来追一下Fill的最上层实现,如下代码: public int Fill

WPF 开机启动因为触摸初始化锁住界面显示

爷,独闯天下 提交于 2020-08-19 22:05:54
现象是设置 WPF 开机启动的时候,概率界面不显示,进程已经起来,同时占用内存极小。通过 dump 或附加调试可以看到主进程带等待触摸线程的回应 在我的某个有趣的设备上,这个设备开机启动的时候将会比较慢初始化完成 USB 设备,或者说是 HID 触摸屏设备 此时测试小伙伴告诉我说测试了几百次,会发现有一次某个开机启动的 WPF 应用起不来了 我使用 dnspy 附加调试看到了主线程其实执行了,但是在一个锁里面等待,如下图 实际上的进入锁的代码是没有意义的,需要看是业务上哪里进入了锁 从调用堆栈里面,如下图,可以看到是 PenThreadWorker.WorkerGetTabletsInfo 方法在等待锁 通过 WPF 触摸到事件 可以了解到这是在等待触摸线程执行 这是在 dnspy 断点不够准,实际的代码是 getTablets.DoneEvent.WaitOne(); 也就是这个是在等待一个锁,这个会在什么时候释放,会在 Stylus Input 线程执行完成之后释放,那么 Stylus Input 线程在做什么呢 这个 Stylus Input 线程在等待触摸消息,这就有趣了。主线程在等待触摸线程执行获取 Tablet 信息,而触摸线程在等待主线程初始化完成之后可以获取触摸消息 因此主线程等不到触摸线程执行获取触摸信息完成,也就是主线程被锁住

用过 mongodb 吧, 这三个大坑踩过吗?

别来无恙 提交于 2020-08-16 19:07:18
一:背景 1. 讲故事 前段时间有位朋友在微信群问,在向 mongodb 中插入的时间为啥取出来的时候少了 8 个小时,8 在时间处理上是一个非常敏感的数字,又吉利又是一个普适的话题,后来我想想初次使用 mongodb 的朋友一定还会遇到各种新坑,比如说: 插入的数据取不出来,看不爽的 ObjectID,时区不对等等,这篇就和大家一起聊一聊。 二: 1号坑 插进去的数据取不出来 1. 案例展示 这个问题是使用强类型操作 mongodb 你一定会遇到的问题,案例代码如下: class Program { static void Main(string[] args) { var client = new MongoClient("mongodb://192.168.1.128:27017"); var database = client.GetDatabase("school"); var table = database.GetCollection<Student>("student"); table.InsertOne(new Student() { StudentName = "hxc", Created = DateTime.Now }); var query = table.AsQueryable().ToList(); } } public class Student {