Web Analytics
yangyang

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

All Posts in 2025.4


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

在大概一年多以前,我写了一个简单的通过程序判断和阻止来自特定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

C++中的shared_ptr、weak_ptr以及enable_shared_from_this

在《Linux多线程服务器编程:使用muduo C++网络库》这本书中,作者在第15页一针见血的指出C++可能出现的内存问题的几个方面: 缓冲区溢出(buffer overrun) 空悬指针(dangling pointer 指向已销毁的对象或已回收的地址)/野指针(wild pointer 指的是未经初始化的指针) 重复释放(double delete) 内存泄漏(memory leak) 不配对的new[]/delete 内存碎片(memory fragmentation) 正确的使用智能指针可以解决前5个问题: 缓冲区溢出:使用STL中的容器( std::vector 、 std::string )、使用安全的拷贝函数,或者自己编写buffer class来管理缓冲区,自动记住缓冲区的长度,并通过成员函数,而不是裸指针来修改缓冲区 空悬指针/野指针:用 std::share_ …

weak callback weak ptr shared ptr

解决OneNote闪退的问题

本人笔记一直使用的是OneNote,因为它既有Windows等桌面程序版本,也有iOS等移动端版本,使用起来很方便。 但今天OneNote打开时突然出现问题,表现就是点开OneNote之后,界面卡住,等待几秒之后,程序直接崩溃。在任务管理器里,有时候能进程还在,有时候没有。在网上找了一下解决方法,以安全模式启动OneNote,删除了缓存,成功解决,这里记录一下。 按下 “Win + R” 组合键,打开 “运行” 对话框,输入 “onenote /safeboot” 并回车:会弹出以下界面: …

onenote safeboot