Windows软件防火墙实现技术简述

【windows】如何通过防火墙配置实现ICMP协议通信(允许ping) 本文详细解析了Windows系统下因防火墙默认拦截导致无法Ping通的原因,并提供了两种解决方案:通过控制面板图形界面创建ICMP入站规则,以及使用Netsh命令或PowerShell进行高效配置与管理。文章旨在帮助用户快速掌握允许ICMP协议通信(即允许Ping)的实用技能,确保网络诊断与设备互访的顺畅进行。 阅读详情
Windows软件防火墙实现技术简述
                        author : baiyuanfan mail : baiyuanfan@163.com  
                        July 1st 2006


关键字:
    封包过滤技术,NDIS钩子,应用程序访问网络控制,TDI钩子,智能行为监控,反流氓软件,自我保护技术。

本文简要介绍了目前流行的Windows软件防火墙的各个功能组件,及其实现方法。

内容目录:
•    Windows软件防火墙的发展概况
•    封包过滤技术
•    应用程序访问网络控制
•    智能行为监控
•    反流氓软件技术
•    自我保护技术
•    附录




Windows软件防火墙的发展概况

    从Windows软件防火墙的诞生开始,这种安全防护产品就在跟随着不断深入的黑客病毒与反黑反毒之争,不断的进化与升级。从最早期的只能分析来源地址,端口号以及未经处理的报文原文的封包过滤防火墙,后来出现了能对不同的应用程序设置不同的访问网络权限的技术;近年来由ZoneAlarm等国外知名品牌牵头,还开始流行了具有未知攻击拦截能力的智能行为监控防火墙;最后,由于近来垃圾插件和流氓软件的盛行,很多防火墙都在考虑给自己加上拦截流氓软件的功能。综上,Windows软件防火墙从开始的时候单纯的一个截包丢包,堵截IP和端口的工具,发展到了今天功能强大的整体性的安全套件。
    接下来本文就对一个Windows软件防火墙应当拥有的这些组件进行一个简要的技术介绍。



封包过滤技术

    封包过滤技术是最原始的防火墙所拥有的第一种功能。但是该功能简单强大,直到现在都是任何一个防火墙必不可少的功能。
    想要在网络数据包到达应用程序之前拦截之,就要在系统的网络协议栈上面安装过滤钩子。对Windows NT系列内核来说,可能安装过滤钩子的地方大致是这么几个,从高层到底层排序:SPI层(早期的天网防火墙 ),AFD层(资料缺乏,尚无例子),TDI层(不少国内墙),NDIS层(ZoneAlarm,Outpost等)。越位于高层,则产品开发难度越低,但是功能越弱,越容易被攻击者所穿越。由于NDIS层的防火墙具有功能强大,不易被穿透等优点,近来各大防火墙厂商的趋势是选择NDIS层来做包过滤。
    目前比较流行的NDIS钩子技术有两种。一种是挂接ndis.sys模块的导出函数,从而能够在每个ndis protocol注册的时候截获其注册过程,从而替换其send(packets)handler和receive(packet)handler。这个方法的缺点是在第一次安全之后无法立刻生效,必须要重起一次,而且要禁用的话,也必须重起。
    2004年12月的时候, www.rootkit.com上面的一名黑客发表了一篇著名的文章:“Hooking into NDIS and TDI, part 1”( http://www.rootkit.com/newsread.php?newsid=219)。这篇文章本意是为rootkit作者们提供一种挂接底层驱动实现端口重用的方法,但是这篇文章揭示了一个全新的技术:通过动态的注册ndis假协议,可以获得ndis protocol的链表地址。得到这个地址之后就能不通过重起,就能替换并监控每个ndis protocol的send(packets)handler和receive(packet)handler,并且可以动态的卸载监控模块不需要重起。在这篇文章出现之后,很多防火墙厂商都悄悄地对自己的产品进行了升级。目前的ZoneAlarm等产品就是使用这种技术,可以在安装后即时发挥作用。这个例子更充分的体现了,黑客和反黑技术本来就是相辅相成的,本源同一的。

    这里给出一个寻找该链表头的代码例子:
该函数返回的NDIS_HANDLE就是链表头地址。

NDIS_HANDLE RegisterBogusNDISProtocol(void)
{
    NTSTATUS Status = STATUS_SUCCESS;
    NDIS_HANDLE hBogusProtocol = NULL;
    NDIS_PROTOCOL_CHARACTERISTICS BogusProtocol;
    NDIS_STRING ProtocolName;

    NdisZeroMemory(&BogusProtocol,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
    BogusProtocol.MajorNdisVersion = 0x04;
    BogusProtocol.MinorNdisVersion = 0x0;

    NdisInitUnicodeString(&ProtocolName,L"BogusProtocol");
    BogusProtocol.Name = ProtocolName;
    BogusProtocol.ReceiveHandler = DummyNDISProtocolReceive;
    BogusProtocol.BindAdapterHandler = dummyptbindadapt;
    BogusProtocol.UnbindAdapterHandler = dummyptunbindadapt;

    NdisRegisterProtocol(&Status,&hBogusProtocol,&BogusProtocol,
        sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

    if(Status == STATUS_SUCCESS){ return hBogusProtocol;}
    else {
#ifdef bydbg
        DbgPrint("ndishook:cannot register bogus protocol:%x/n",Status);
        DbgBreakPoint();
#endif
        return NULL;
    }
}

得到这个ndis protocol的链表后,遍历表中的每一个ndis protocol,对于每一个ndis protocol,又各有一个链表,用来描述和该ndis protocol有联系的所有ndis miniport和该ndis protocol绑定的状态。每个这种状态块,叫做一个ndis open block。每个绑定的send(packets)handler和receive(packet)handler都在这个ndis open block里面。

struct _NDIS_OPEN_BLOCK
{
#ifdef __cplusplus
    NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
#else
    NDIS_COMMON_OPEN_BLOCK;
#endif

#if defined(NDIS_WRAPPER)
    
    //
    // The stuff below is for CO drivers/protocols. This part is not allocated for CL drivers.
    //
    struct _NDIS_OPEN_CO
    {
    ....
    };
#endif
};

typedef struct _NDIS_COMMON_OPEN_BLOCK
{
    PVOID                       MacHandle;          // needed for backward compatibility
    NDIS_HANDLE                 BindingHandle;      // Miniport's open context
    PNDIS_MINIPORT_BLOCK        MiniportHandle;     // pointer to the miniport
    PNDIS_PROTOCOL_BLOCK        ProtocolHandle;     // pointer to our protocol
    NDIS_HANDLE                 ProtocolBindingContext;// context when calling ProtXX funcs
    PNDIS_OPEN_BLOCK            MiniportNextOpen;   // used by adapter's OpenQueue
    PNDIS_OPEN_BLOCK            ProtocolNextOpen;   // used by protocol's OpenQueue
    NDIS_HANDLE                 MiniportAdapterContext; // context for miniport
    BOOLEAN                     Reserved1;
    BOOLEAN                     Reserved2;
    BOOLEAN                     Reserved3;
    BOOLEAN                     Reserved4;
    PNDIS_STRING                BindDeviceName;
    KSPIN_LOCK                  Reserved5;
    PNDIS_STRING                RootDeviceName;

    //
    // These are referenced by the macros used by protocols to call.
    // All of the ones referenced by the macros are internal NDIS handlers for the miniports
    //
    union
    {
        SEND_HANDLER            SendHandler;
        WAN_SEND_HANDLER        WanSendHandler;
    };
    TRANSFER_DATA_HANDLER       TransferDataHandler;

    //
    // These are referenced internally by NDIS
    //
    SEND_COMPLETE_HANDLER       SendCompleteHandler;
    TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
    RECEIVE_HANDLER             ReceiveHandler;
    RECEIVE_COMPLETE_HANDLER    ReceiveCompleteHandler;
    WAN_RECEIVE_HANDLER         WanReceiveHandler;
    REQUEST_COMPLETE_HANDLER    RequestCompleteHandler;

    //
    // NDIS 4.0 extensions
    //
    RECEIVE_PACKET_HANDLER      ReceivePacketHandler;
    SEND_PACKETS_HANDLER        SendPacketsHandler;

    //
    // More Cached Handlers
    //
    RESET_HANDLER               ResetHandler;
    REQUEST_HANDLER             RequestHandler;
    RESET_COMPLETE_HANDLER      ResetCompleteHandler;
    STATUS_HANDLER              StatusHandler;
    STATUS_COMPLETE_HANDLER     StatusCompleteHandler;
    
#if defined(NDIS_WRAPPER)
    ....
#endif

} NDIS_COMMON_OPEN_BLOCK;

需要处理的,是ndis open block里面的SendHandler,ReceiveHandler,WanReceiveHandler,ReceivePacketHandler和SendPacketsHandler。

一定要注意的是,不同于很多文章中的描述,主要处理SendHandler和ReceiveHandler,正确的应该是主要处理ReceivePacketHandler和SendPacketsHandler,现在的主流网卡和系统驱动,都是使用后面两者。



应用程序访问网络控制

    以往的防火墙只能古板的允许或者禁止整个系统去访问网络上的目标,比如允许了系统可以访问外网的http端口,就允许了所有进程,不能只控制IE等几个进程有权这样做。该技术的出现解决了这个问题,对每个陌生的进程都会询问客户是否允许访问网络,因此还有一定的查杀未知木马病毒的能力。
    由于NDIS里面的那些send/receive handler全都是由tdi缓冲之后再调用的,运行的上下文全都是kernel,并且不保存原先进行tdi操作的进程号,因此在封包过滤的NDIS钩子层次无法取得进行操作的进程ID。想要解决应用程序访问网络控制的问题,就需要在tdi或者更高的层次上使用钩子。一般来说,主流是使用tdi钩子,在进程的网络调用栈进行到tdi的TDI_CONNECT,TDI_LISTEN,TDI_RECEIVE,TDI_SET_EVENT_HANDLER等调用时,进行进程判断和提示。
    对于winsock的应用程序来说,最重要的是主动连接请求,TDI_CONNECT;接受连接请求,TDI_SET_EVENT_HANDLER中的TDI_EVENT_CONNECT。对于udp收发,还要处理TDI_SEND_DATAGRAM,TDI_RECEIVE_DATAGRAM和TDI_SET_EVENT_HANDLER中的TDI_EVENT_RECEIVE_DATAGRAM请求。这个时候,直接PsGetCurrentProcessId就可以得到进程号。
    tdi钩子有一个问题,就是对于TDI_SET_EVENT_HANDLER的hook,很可能不能及时发挥作用,必须要重起以后。由于不像ndis钩子需要hook系统函数或者修改系统数据结构,tdi钩子可以直接使用微软提供的过滤器驱动程序接口,在安装编写上要比ndis钩子简单的多,IoAttachDeviceToDeviceStack就可以了。
    给出一段detour的tdi的dispatch routine的代码:


NTSTATUS hook_disp(IN PDEVICE_OBJECT parampdrvob, IN PIRP irp)
{
    ....

    case IRP_MJ_INTERNAL_DEVICE_CONTROL:
        switch(irpsp->MinorFunction)
    {
            ///原来想得要监控的几个似乎afd并不使用,而是用set event handler
        case TDI_LISTEN:
#ifdef bydbg
            DbgPrint("bytdiflt:TDI_LISTEN traped.should caused by kmd other than AFD./n");

#endif
            stat=gettcpportbyfile(irpsp->FileObject);
#ifdef bydbg
            DbgPrint("bytdiflt:**********TDI_EVENT_CONNECT port:%d.***********/n",stat);
#endif
            if(stat==0 || stat==-1){break;}//non-tcp or internal error
            if(denyport[(unsigned short)stat]==1)//直接失败请求
            {
#ifdef bydbg
                DbgPrint("bytdiflt:*********port %d blocked!!*********/n",stat);
                //DbgBreakPoint();
#endif
                stat=STATUS_ACCESS_VIOLATION;
                irp->IoStatus.Status=stat;
                irp->IoStatus.Information=0;
                IoCompleteRequest(irp, IO_NO_INCREMENT);

                return stat;
            }
            break;

        case TDI_RECEIVE:
#ifdef bydbg
            DbgPrint("bytdiflt:TDI_RECEIVE traped.should caused by kmd other than AFD./n");
            //DbgBreakPoint();
#endif
            break;
        case TDI_SET_EVENT_HANDLER:
#ifdef bydbg
            DbgPrint("bytdiflt:TDI_SET_EVENT_HANDLER traped.req local_node:%x/n",irpsp->FileObject);
            DbgPrint("TDI_SET_EVENT_HANDLER EventType:%d EventHandler:%x EventContext:%x/n",
                ((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType,
                ((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventHandler,
                ((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventContext
                );
#endif
            switch(((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType){
            case TDI_EVENT_CONNECT:
                tmpstrptr="TDI_EVENT_CONNECT";
                stat=gettcpportbyfile(irpsp->FileObject);
#ifdef bydbg
                DbgPrint("bytdiflt:**********TDI_EVENT_CONNECT port:%d.***********/n",stat);
#endif
                if(stat==0 || stat==-1){break;}//non-tcp or internal error
                if(denyport[(unsigned short)stat]==1)//完成请求但不做事情
                {
#ifdef bydbg
                    DbgPrint("bytdiflt:*********port %d blocked!!*********/n",stat);
                    //DbgBreakPoint();
#endif
                    stat=STATUS_SUCCESS;
                    irp->IoStatus.Status=stat;
                    irp->IoStatus.Information=0;
                    IoCompleteRequest(irp, IO_NO_INCREMENT);
                    return stat;
                }
                break;

            case TDI_EVENT_RECEIVE:
                tmpstrptr="TDI_EVENT_RECEIVE";
                break;
            case TDI_EVENT_CHAINED_RECEIVE:
                tmpstrptr="TDI_EVENT_CHAINED_RECEIVE";
                break;
            case TDI_EVENT_RECEIVE_EXPEDITED:
                tmpstrptr="TDI_EVENT_RECEIVE_EXPEDITED";
                break;
            case TDI_EVENT_CHAINED_RECEIVE_EXPEDITED:
                tmpstrptr="TDI_EVENT_CHAINED_RECEIVE_EXPEDITED";
                break;
            case TDI_EVENT_RECEIVE_DATAGRAM:
                tmpstrptr="TDI_EVENT_RECEIVE_DATAGRAM";
                break;

            default:
                tmpstrptr="Other TDI_EVENT";
                break;
            }
#ifdef bydbg
            DbgPrint("EventType is:%s/n",tmpstrptr);
#endif
            break;
        case TDI_CONNECT://处理主动外出连接
            stat=gettcpportbyfile(irpsp->FileObject);
#ifdef bydbg
            if(stat==0 || stat==-1)//non-tcp or internal error
            {DbgPrint("bytdiflt:**********TDI_CONNECT local port UNKNOWN.***********/n");}
            else
            {DbgPrint("bytdiflt:**********TDI_CONNECT local port:%d.************/n",stat);}
            //DbgBreakPoint();
#endif
            break;

    ....


    PsGetCurrentProcessId....//判断进程号

    ....
}



智能行为监控

    随着防火墙的发展,现在的ZoneAlarm,Kaspersky等都发展成了所谓的“安全套件”,能够多方位的保护用户的系统。查杀未知的病毒和木马是所有防火墙厂商都非常注视的一环。在目前来说,查杀未知病毒木马,最行之有效的方法,就是类似于ZoneAlarm,Karpasky Internet Security,Mcafee,System Safety Monitor等安全工具的智能行为监控手段。实践证明,这种智能行为监控针对未知的恶意软件有着强大的杀伤力。例如,灰鸽子无论如何加壳变形,能够躲过杀毒软件的查杀,也不能逃避ZoneAlarm的智能行为监控;很多地下流传的没有公开的木马,放上去安装,在安装过程中也一样会报警;甚至很多0day overflow exploit在执行过程中就会报警。可以说,这个可能是目前最有前景的防火墙新技术。

    例如,一个智能行为监控模块,可以监控以下进程行为,并且判定为恶意软件或者提示用户,让用户选择是否允许:

    把自己注册成每次开机自动启动;

    装载可疑的内核驱动程序;

    注册未知的新服务;

    修改或者替换系统重要文件;

    使用raw_socket接口;

    可疑的word宏或者脚本;

    可疑的邮件附件例如可执行程序;

    安装windows消息钩子;

    创建远程线程到其他程序;

    创建受控制的傀儡进程;

    对系统API的请求来源代码和数据区在同一区域;


    监控上述的这些行为,全部都可以使用系统钩子,消息钩子和API钩子等技术来实现,洗劫这里就不详细谈了,熟悉hook的技术人员都应该知道怎么做了。



反流氓软件技术

    目前的信息安全领域,由于病毒的不可控性和黑客的技术门槛提高,黑客攻击和病毒攻击均有大幅度减少的趋势。但是一种新型的安全威胁却在日益的发展壮大,这种很不同于传统病毒的安全威胁,就是从开始就彻底的有明确商业目的的流氓软件。这种软件为了自己的商业利益,不惜牺牲客户的权益,强行在客户的浏览器上安装,驻留系统,强制制止用户卸载或者删除自己。这类软件也带来了非常大的麻烦,经常性地弹出广告页面,篡改用户浏览器主页,篡改用户浏览器搜索引擎,降低用户系统性能,更严重的是很多设计低劣的流氓软件会让用户的系统变得很不稳定,经常性的死机和重起。大量的防火墙客户对流氓软件深恶痛绝,希望防火墙能够在流氓软件安装的时候能够提示客户,给客户一个选择的机会。因此这也成了新一代防火墙应该拥有的功能模块。
    由于流氓软件不同于一般病毒木马,有着强大的商业支持,升级换代非常快,并且碍于各方面的影响,防火墙和杀毒软件不好将其作为病毒木马来查杀,否则可能会引起法律和商业等背景关系上面的很多问题,所以比较好的一个选择,就是防火墙厂商使用行为监控方法来提示用户流氓软件的安装。

    流氓软件除了拥有普通木马或病毒的以下几个特征,

    把自己注册成每次开机自动启动;

    装载可疑的内核驱动程序;

    注册未知的新服务;

之外,还有一个很重要的特征就是劫持浏览器。以下的为了避免麻烦,均不举软件实例。    

    HKLM/Software/Microsoft/Windows/CurrentVersion/Explorer/Browser Helper Objects,这个被叫做BHO插件的东西,是最多流氓软件和ie插件的栖身之所,监控这个健值是最重要的;

    HKCU/Software/Microsoft/Internet Explorer/UrlSearchHooks,这个健值可用来劫持搜索引擎;

    HKLM/Software/Microsoft/Internet Explorer/Toolbar,很多浏览器插件也会注册在这里;

    HKCU/Software/Microsoft/Internet Explorer/Explorer Bars            HKLM/Software/Microsoft/Internet Explorer/Explorer Bars            HKCU/Software/Microsoft/Internet Explorer/Extensions                HKLM/Software/Microsoft/Internet Explorer/Extensions                这四个键值也有流氓插件钻入的可能。


    HKLM/SOFTWARE/Microsoft/Internet Explorer/Main和    HKCU/SOFTWARE/Microsoft/Internet Explorer/Main这两个子目录下面有大量的IE首页,搜索页面等敏感信息需要保护或者提示用户,这里就不仔细说了。                            



附录

感谢:
    谢谢xfocus( www.xfocus.net),CVC( www.retcvc.com)和0x557的所有朋友,尤其是xyzreg(张翼)和vxk(张凌峰)。祝所有朋友心想事成。
 
基于Ndis Hook钩子技术开发的网络防火墙源代码 基于Ndis Hook技术开发的网络防火墙源代码 立即下载

相关推荐

Windows中最需要监听的五项安全设置

对Active Directory进行基本管理至关重要。如果用户的帐户密码太简单,能够轻易被破解,不经常更换或者根本没有设置密码,那么网络和服务器就很容易被攻击。务必正确设置这些密码值以及帐户拒绝登陆策略。那些最实用的值能够帮助你阻挡针对密码的种种攻击。同样的,以上Active Directory服务器三个组的用户权限应当妥善管理并经常监听。如果普通用户拥有服务器,计划或者域管理组的此类权限,那将很可能引发重大损失或严重问题。

windows文件保护_四种方法关闭Windows防火墙,有效防止病毒入侵

如果Windows防火墙干扰了网络连接,请按照以下步骤完全关闭或禁用Windows防火墙。为了保护系统免受未经授权的传入和传出连接的侵害,Windows拥有内置的防火墙管理系统。使用Windows防火墙,用户可以设置特殊规则来控制哪些可以和不能连接到网络。如果Windows防火墙无法正常工作,或者安装了第三方防火墙软件,则可以轻松禁用Windows防火墙。注意:以下的操作步骤可在Windows 1...

weixin_39748183的博客 2529

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 276

TCP常用网络和木马使用端口对照表,常用和不常用端口一览表

【开始-运行- CMD , 输入 netstat -an 然后回车就可以查看端口】      端口:0   服务:Reserved   说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址为0.0.0.0,设置ACK位并在以太网层广播。      端口:1   服务:tcp...

weixin_34161032的博客 2万+

USB2.0物理层实战:手把手教你用示波器抓取D+/D-信号(附波形分析)

本文是一份针对硬件工程师的USB2.0物理层信号调试实战指南。文章详细讲解了如何使用示波器捕获和分析D+/D-差分信号,从基础设置、核心信号状态解读,到信号完整性分析与常见问题排查,手把手教你定位USB通信故障。内容涵盖USB2.0协议物理层关键概念,并附有基础解码思路,旨在提升工程师的底层调试能力。

s8t9u0v1w的博客 455

TC397 EB配置ADC软件触发:从零实现周期采样与中断处理

本文详细介绍了如何在Infineon AURIX TC397芯片上使用EB Tresos工具配置ADC软件触发,实现周期采样与中断处理。通过硬件连接、EB模块配置、代码初始化及数据处理的全流程解析,帮助开发者快速掌握ADC软件触发技术,提升嵌入式系统开发效率。

root9的博客 234

利用Win32 API绕过360驱动防火墙

 一开始,RK和ARK之间的“军备竞赛”比拼的是哪一方对Windows内核了解的更加深入——越底层就越能抢占到制高点。然而后来,ARK很不厚道的用“驱动防火墙”将RK进入内核的愿望击的粉碎。进不了内核,RK Coder们的种种奇技淫巧的施展自然大受限制。      前两天翻看《黑客防线》时,看到鹿剑 的文章《绕过360驱动防火墙加载驱动结束360》中提出了一种绕过360驱动防火墙的思路——拦截系统的关闭消息,在系统关闭时写注册表。他在原文中说 “在这个段站的时间里,用户可能看不到那个服务安装的

andoring的专栏 4961

ENVI5.6 批量处理GF-2/GF-6/GF-7:从安装到融合的完整自动化流程

本文详细介绍了ENVI5.6环境下批量处理GF-2/GF-6/GF-7卫星数据的完整自动化流程,包括环境配置、工具安装、正射校正、图像融合等关键步骤。通过实战案例和优化技巧,帮助用户高效完成高分卫星影像处理,提升工作效率。特别针对GF-6和GF-7的特殊处理要点进行了深入解析。

weixin_42546392的博客 179

微软Windows软件防火墙实现技术简述

 微软Windows软件防火墙实现技术简述  

cnrandy 的专栏 812

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1183

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 756

Windows防火墙的原理及其作用

Windows Defender

dianqicyuyan的博客 1351

YOLOv11改进 - C3k2融合 | C3k2融合融合WDBB宽度多样分支模块(Width Diverse Branch Block)通过多尺度分支增强特征表征能力

本文着眼于灰度图像目标检测所面临的挑战,提出了增强型目标检测网络 YOLO - MIF,该网络整合了多种多信息融合策略以对 YOLOv8 网络进行改进。文章开篇介绍了一种可创建伪多通道灰度图像的技术,此技术能增加网络的通道信息,同时缓解潜在的图像噪声与虚焦模糊问题。随后运用网络结构重新参数化技术,在不增加推断时间的情况下提升网络的检测性能。此外,引入了一种新颖的解耦式检测头,增强了模型处理灰度图像时的表现能力。

魔改工程师的博客 771

SQL Server 2005在防火墙需要开启的端口

开放TCP 1433端口即可注意:Windows内置防火墙与专用防火墙软件都要开启 

kunguo的专栏 1175

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

终极指南:如何禁用Windows Defender和防火墙的完整教程

你是否厌倦了Windows Defender频繁的弹窗警告?或者想要使用第三方安全软件但Windows Defender总是干扰?今天我将为你介绍一个简单而有效的方法——使用no-defender工具来禁用Windows Defender和防火墙。这个开源工具通过Windows安全中心API提供了一种巧妙的方式来管理Windows安全功能,让你可以自由选择适合自己的安全解决方案。 ## 什么是n

gitblog_00750的博客 1035

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

终极指南:如何巧妙禁用Windows Defender与防火墙

你是否曾为Windows Defender的频繁扫描而烦恼?或者因为防火墙限制导致某些软件无法正常运行?今天,我们将深入探讨一个名为`no-defender`的开源项目,它提供了一种巧妙的方法来管理Windows系统的安全防护功能。这个工具通过Windows安全中心API实现,为需要完全控制安全设置的用户提供了新的选择。 ## 为什么需要禁用Windows安全防护? Windows Defen

gitblog_00067的博客 132

实践四 防火墙的双机热备技术

掌握 VRRP 协议、VGMP 协议以及 HRP 协议的相关概念以及工作过程;掌握基 于 USG 系列防火墙的双机热备配置方法; 基于模拟网络环境,实现防火墙的双机热备。某企业的业务需持续提供服务,为避免网络设备及外部不可控因素导致线路中断,希望在网络出口增加冗余以增加网络的可靠性。本实验通过在网络出口位置部署两台防火墙作为网关,保证了在单机故障的情况下内部网络与外部网络之间的通信畅通。

weixin_55935823的博客 497

如何使用Scoop管理Windows安全工具:防火墙与杀毒软件的终极指南

Scoop是一款强大的Windows命令行安装工具,它不仅能帮助用户轻松管理各类应用程序,还能有效整合安全工具,实现防火墙配置与杀毒软件管理的自动化。本文将详细介绍如何利用Scoop提升系统安全防护能力,让普通用户也能轻松掌握专业级安全管理技巧。 ## 为什么选择Scoop管理安全工具? Scoop通过命令行方式简化了软件的安装、更新和卸载流程,特别适合安全工具这类需要频繁更新的应用。其核心优

gitblog_01145的博客 392

防火墙知识

防火墙知识

SonMessi的博客 921

3步彻底禁用Windows Defender防火墙:WSC API的终极解决方案

在Windows系统管理领域,禁用Windows Defender和防火墙一直是技术爱好者关注的话题。no-defender项目提供了一个专业而有趣的解决方案,通过Windows安全中心(WSC)API实现这一功能。本文将深入剖析其工作原理,并提供完整的实施指南,帮助你在需要时快速禁用系统安全防护。 ## 🎯 核心功能与适用场景 no-defender的核心功能是通过WSC API禁用Win

gitblog_00471的博客 281

Windows系统下LabVIEW NIPM安装报错终极解决清单:从防火墙到磁盘权限

本文详细解析了Windows系统下LabVIEW NIPM安装报错的全面解决方案,涵盖防火墙设置、磁盘权限调整等关键步骤。通过系统环境预检、安全软件冲突处理、资源权限配置等多维度排查,帮助用户高效解决NIPM安装难题,确保LabVIEW开发环境的顺利部署。

weixin_30413765的博客 378
上一篇: 桌面美化转BBlean+DO 让Explorer彻底走开
下一篇: 一个计算机高手的成长——推荐一读
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值