Web Analytics
yangyang

码农兼一个普普通通小青年

DotNet Framework


一个完整的阻止远程桌面登录攻击的程序

在大概一年多以前,我写了一个简单的通过程序判断和阻止来自特定IP地址的远程桌面连接攻击的程序,一直以来是作为一个简单的控制台程序来使用的,用起来效果很不错。最近我在自己的阿里云服务器上也发现了很多这种远程桌面登录连接的尝试,但这也没有办法,只要端口对外网暴露,就免不了会有这种攻击。于是我对之前的那个小程序做了一些调整和完善,主要改进了: 程序不一定要监控特定端口,只要在日志里查找到了类型ID为4625的错误日志,就认为是远程桌面连接登录。 当远程桌面登录失败尝试超过3次后,除了添加到防火墙之外,还记录该远程信息到日志,包括远程IP尝试登录时采用的用户名,IP归属地等信息。 平台使用最新的.NET 8.0来重写,程序可以作为控制台程序,或Windows Service 安装运行。 添加白名单机制,对于白名单里面的IP地址不做登录失败校验。 …

Dependency Injection Background services RDP netsh advfirewall NetFwTypeLib

从零开始申请Google Gemini Advance 15个月免费试用

最近大模型热火朝天,于是我也开始在工作中尝试使用这类工具来提高编码效率。工作中编码时,我主要使用的是豆包,它有专门的桌面客户端。本文介绍了如何申请Google Gemini Advance的15个月免费试用,内容包括如何使用稳定线路的美国网络,如何提供满足条件的Google账户,如果申请美国edu邮箱,如何申请符合条件的美国信用卡,在满足以上条件之后,如何免费申请Google Gemini Advance的15个月学生优惠免费试用。 …

gemini advance student discount

自定义JSON序列化

JSON的序列化和反序列化在工作中偶尔会用到,特别是在处理网络请求的时候。通常的网站或者api接口会提供json数据格式,要将json字符串转换为C#中的对象,就要用到序列化和反序列化。恰好最近刚有一个需求,需要从某个网站上获取一下Shibor数据,这里涉及到了自定义的JSON序列化,简单记录一下。 …

Shibor JSON Serialization

解决Socket编程中对端意外断开而导致的“卡死”问题

在上一篇文章中提到了最近写的一个网络收发程序的一个问题。一开始还以为是因为计算机休眠会把线程杀死,导致程序在唤醒后接收不到服务端程序发送的数据,后来通过使用WinDbg分析dmp文件发现在网络异常断开后,接收数据的线程并没有退出,而是程序卡在了NetworkStream.Read方法那里,即使后来网络连通了也得不到通知和接收不了数据。这就引出了本篇要解决的问题,即在网络收发中,如何解决由于网络意外断开,客户端程序Socket的卡在了网络读取方法的问题。解决方法有两种:一种是在客户端读取数据时添加超时,另外就是增加心跳。 …

socket heartbeat

使用WinDbg查看所有的C#线程及其名称

最近程序遇到了一个问题,当写的一个C#客户端程序在Windows 11系统休眠之后再次唤醒,有一定的概率不能够正常的接受服务端的数据。这个程序有一个专门用于连接服务端的C# 线程,名字为"WatchServiceTransport",它的内部是一个while循环,不停的从服务端使用Socket的NetworkStream.Read读取数据。在正常的时候,程序是能够接收数据的。但是当Windows休眠之后,此时网络连接可能断开,此时即使Windows唤醒之后仍然不能连接收取数据。于是怀疑是否是因为Windows 11休眠后,连接TCP的线程被强制退出了。那如何验证是否是这个原因导致的呢?就需要判断在出现问题时,当前的名为“WatchServiceTransport”的线程还是否存在。 幸好,今天这个问题又复现了于是导出了DUMP文件,用Windbg分析了一下,顺便记录如何打印所有的C#线程 …

WinDbg dumpheap

使用treemap图来显示沪深300指数热点图

前几天看到一篇新闻里做的下面这张股票热点图,单纯的觉得这个图很好看,于是研究了一下如何自己绘制这个图,后来发现这种类型的图还有个专有的名字,叫treemap图。本文先介绍什么是treemap图,然后展示如何使用C#来生成沪深300指数的treemap。 …

treemap HS300 squarified

实现端口转发的几种方法

端口转发在有些时候还是比较有用的,它能够在数据传输的过程中增加一个“路由”,提供了某种程度的灵活。本文简单介绍了工作中遇到的一个可能使用端口转发能解决的例子,以及如何使用端口转发,包括介绍了在Windows上的内置的端口转发工具,以及一些开源的端口转发程序,最后再简单介绍了如何使用C#实现一个端口转发工具。 …

socket IP Helper port forwarding

Math.Round中MidpointRounding各种枚举值的区别

通常,在保留n位小数进行四舍五入的时候,会用到Math.Round方法,但默认的这个Round方法的实现可能与我们平常想象的不一样,在很早之前我就知道有这个差别,今天重新整理一下。简单来说,Math.Round方法除了提供了第二个保留小数位数的参数之外,还有一个名为MidpointRounding的枚举类型参数,这个参数在.NET Framework 4.8及.NET Core 3.0版本之前,只提供了两个Round nearest类型枚举值: ToEven和AwayFromZero。这两个值的区别只在于当遇到中值5时的舍入问题。在.NET Core 3.0及之后的版本中,又引入了三个枚举值:ToZero、ToNegativeInfinity和ToPositiveInfinity这三个值,这个三个值解决了是直接舍掉、整体向下还是整体向上舍入的问题。 …

MidpointRounding Round

DataGridView绑定到DataTable和BindingList的分析与比较

本文介绍了使用DataGridView绑定数据的两种方法,一种是直接将其DataSource属性绑定到DataTable的DefaultView,绑定后它默认支持排序,筛选等高级功能,另外当DataTable值发生变化时DataGridView也会自动刷新,它的缺点是DataTable结构过于重,而且对于单元格赋相同的值时,仍然会触发事件导致界面刷新,这在有些场景下会影响效率。另外一种方法是DataGridView绑定BindingList实体,它的有点是能够进行更多的精细控制,并且效率会更高,缺点是内置的BindingList对象并没有实现排序,筛选等功能。针对BindingList的缺点,本文介绍了BindingListView这个第三方的库,它完美解决了BindingList默认不支持排序和筛选,且要实现筛选筛选功能单一的问题。 …

DataTable DataGridView BindingList BindingListView DataBinding

将条件字符串解析为lambda表达式

将条件字符串动态解析并转换为lambda表达式在很多场景下非常有用,它一方面便于实现逻辑和配置的分离,另一方面也提供了更大的灵活性。在很多场景我们都能看到这种将条件表达式字符串保存起来,然后动态解析执行的列子,比如股票软件里面的公式编辑器、比如规则引擎RulesEngine。通常,要手动实现将条件表达式字符串解析为lambda表达式是困难的,因为这会用到一些编译器里面类似的诸如语法分词,词法分析的内容。 虽然在C#中,可以运用之前介绍的表达式树ExpressionTree来一定程序上简化这些操作,但要手动解析,仍然十分繁琐。本文站在巨人的肩膀上介绍两种,一种是System.Linq.Dynamic.Core,一种是使用Roslyn的Microsoft.CodeAnalysis.Scripting。 …

RulesEngine Roslyn lambda ExpressionTree CodeAnalysis Dynamic LINQ