Windows下网络数据报的监听和拦截技术

网络排错必备:深入解析IPv4数据报首部20字节核心字段 在计算机网络通信中,IP协议作为网络层核心,负责数据包的路由与转发。其数据报首部承载了决定数据包传输路径、生命周期和处理方式的关键控制信息。理解IP首部格式与各字段原理,是进行网络性能优化、安全分析和故障排查的底层基础。例如,生存时间(TTL)字段通过跳数限制防止数据包在网络中无限循环,同时为traceroute等诊断工具提供支持;而标识、标志与片偏移字段共同管理IP分片与重组,直接影响大数据传输的效率和安全性。掌握这些字段的工程含义,能帮助开发者与运维人员精准定位如连接超时、分片丢包等典型网络问题,是构建 阅读详情

Windows下网络数据报的监听和拦截技术1

        Windows下网络数据报的监听和拦截技术是一个比较古老的话题,应用也很广泛,例如

防火墙等等。这篇小文只是对该技术的一个总结,没有新技术,高手免看:)

        要监听和拦截Windows下的数据报,基本可以在两个层次进行,一个是用户态(user-mo

de),一个是核心态(kernel-mode)。

        在用户态下,从高到低大概有四种方法。

        1、原是套结字(Raw Socket)。Winsock2以后提供了原始套结字功能,可以在用户态用

Winsock函数接收所有流经Winsock的IP包。这种方法在MSDN里面有叙述,是MS官方支持

的方法,在网上也有很多资料。但是这种方法只能监听但是不能拦截数据报,所以可以

作为网络监视器的选择技术,但是不能实现防火墙等更高要求的功能。另外最致命的缺

点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包例如TDI无法

进行处理。对于一些木马和病毒来说很容易避开这个层次的监听。

        2、替换系统自带的WINSOCK动态连接库。这种方法可以在很多文章里面找到详细的实现

细节。 通过替换系统Winsock库的部分导出函数,实现数据报的监听和拦截。缺点同1。

 

        3、Winsock服务提供者(SPI)。SPI是Winsock的另一面,是Winsock2的一个新特性。

起初的Winsock是围绕着TCP/IP协议运行的,但是在Winsock 2中却增加了对更多传输协

议的支持。Winsock2不仅提供了一个供应用程序访问网络服务的Windows socket应用程

序编程接口(API),还包含了由传输服务提供者和名字解析服务提供者实现的Winsock

服务提供者接口(SPI)和ws2_32.dll。 Winsock 2的传输服务提供者是以动态链接库的

形式(DLL)存在的。以下是winsock 2在传输服务提供者上的WOSA(Windows开放服务结

构):

----------------------------

|Windows socket 2 应用程序|

----------------------------Windows socket 2 API

|       WS2_32.DLL        |

----------------------------Windows socket 2 传输SPI

|   传输服务提供者(DLL)  |

----------------------------

Windows socket SPI提供三种协议:分层协议,基础协议和协议链。分层协议是在基础

协议的上层,依靠底层基础协议实现更高级的通信服务。基础协议是能够独立,安全地

和远程端点实现数据通信的协议,它是相对与分层协议而言的。协议链是将一系列的基

础协议和分层协议按特点的顺序连接在一起的链状结构,可以通过Platform SDK附带的

工具Sporder.exe察看系统已经安装的SPI,请参见下图:

API------------------------

   |      WS2_32.DLL     |

SPI------------------------

   | 分层协议 |

SPI-------------

   | 分层协议 |

SPI------------------------

   |       基础协议       |

   ------------------------

        每个应用程序通过Ws2_32.dll和相应的服务提供者进行严格的数据交换。Ws2_32.dl

l根

据应用程序在创建套接字时所提供的参数来选择特定的服务提供者,然后把应用程序的

实现过程转发由所选创建套接字的服务提供者来管理。也就是说,Ws2_32.dll只是一个

中间过程,而应用程序只是一个接口,数据通信的实现却是由服务提供者来完成的。所

以我们通过适当的增加自己的分层协议服务提供者,使其位于SPI的顶端,那么就能将W

s2_32.dll传给服务提供者的数据报拦截下来。由于是MS的官方方法,具体的使用方法在

其Platform SDK里面有详细的例子(LSP),在MSDN里面也有详细的解释。这种方法的优点

是能够获得调用Winsock的进程的详细信息,并能实现Qos和数据加密。所以SPI是用户态

数据拦截的较好地点。缺点同1。

        4、Windows2000包过滤接口。由于过滤规则限制太多不灵活而应用不多。

        5、网络监视器SDK。MS官方的实时监视分析网络数据的方法。但是由于封装的太复?

樱?

使用起来不灵活。

 

        在核心态下,数据报的监视和拦截方法比较复杂,由于大多个人防火墙都是在核心?

?

实现的,所以在这里比较详细的叙述一下。具体的请参见nt/2kDDK文档。大概有下面几

个方法。

1、     TDI过滤驱动程序(TDI Filter Driver)。

2、     NDIS中间层驱动程序(NDIS Intermediate Driver)。编写IM DRIVER在NDIS中间层

 

 

对MINIPORT(网卡驱动程序)和协议驱动程序之间的数据包进行拦截。这是微软提供的

一种技术。在DDK中MS提供了Passthru例子,很多中间层过滤驱动都可以由之改编。但编

写该过滤程序拦截程序非常的复杂,安装也很麻烦。

3、     Win2k Filter-Hook Driver。

4、     NDIS Hook Driver。这种方法又有两种实现方式。

(1)向NDIS注册假协议(fake protocol)。这是在协议层上的处理。在Windows内核中

,所有已注册的协议是通过一个单向的协议链表来维护的。这个单向链表保存了所有已

注册协议的NDIS_PROTOCOL_BLOCK结构的地址,在这个结构中保存了协议驱动所指定的相

应的派发函数的地址如RECEIVE_HANDLER等。

struct _NDIS_PROTOCOL_BLOCK

{

PNDIS_OPEN_BLOCK OpenQueue; // queue of opens for this protocol

REFERENCE Ref; // contains spinlock for OpenQueue

UINT Length; // of this NDIS_PROTOCOL_BLOCK struct

NDIS50_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics;// handler addresses

 

struct _NDIS_PROTOCOL_BLOCK * NextProtocol; // Link to next

ULONG MaxPatternSize;

#if defined(NDIS_WRAPPER)

//

// Protocol filters

//

struct _NDIS_PROTOCOL_FILTER * ProtocolFilter[NdisMediumMax+1];

WORK_QUEUE_ITEM WorkItem; // Used during NdisRegisterProtocol to

// notify protocols of existing drivers.

KMUTEX Mutex; // For serialization of Bind/Unbind requests

PKEVENT DeregEvent; // Used by NdisDeregisterProtocol

#endif

};

typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLO

CK;并且,每个协议驱动还对应一个NDIS_OPEN_BLOCK的单向链表来维护其所绑定的网卡

信息。当协议驱动调用NdisRegisterProtocol之后,

EXPORT

VOID

NdisRegisterProtocol(

OUT PNDIS_STATUS Status,

OUT PNDIS_PROTOCOL_BLOCK NdisProtocolHandle, /*注意NDIS_HANDLE所指向的就是PN

DIS_PROTOCOL_BLOCK的结构,不要有什么怀疑。*/

IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,

IN UINT CharacteristicsLength

);

NDIS总是会把新注册的协议放在协议链表的表头并返回这张表,所以只要我们注册一个

新的协议通过新协议注册返回的链表头就可以轻而易举的遍历系统中所有协议表。但是

,如果要成功地挂接派发函数,还需要对协议所对应的NDIS_OPEN_BLOCK结构里的派发函

数进行挂接,因为NDIS并不是直接调用协议驱动在NDIS_PROTOCOL_CHARACTERISTICS所注

册的派发函数地址,而是调用NDIS_OPEN_BLOCK里的派发函数。

struct _NDIS_OPEN_BLOCK

{

PNDIS_MAC_BLOCK MacHandle; // pointer to our MAC

NDIS_HANDLE MacBindingHandle; // context when calling MacXX funcs

PNDIS_ADAPTER_BLOCK AdapterHandle; // pointer to our adapter

PNDIS_PROTOCOL_BLOCK ProtocolHandle; // pointer to our protocol

NDIS_HANDLE ProtocolBindingContext;// context when calling ProtXX funcs

PNDIS_OPEN_BLOCK AdapterNextOpen; // used by adapter's OpenQueue

PNDIS_OPEN_BLOCK ProtocolNextOpen; // used by protocol's OpenQueue

PFILE_OBJECT FileObject; // created by operating system

BOOLEAN Closing; // TRUE when removing this struct

BOOLEAN Unloading; // TRUE when processing unload

BOOLEAN NoProtRsvdOnRcvPkt; // Reflect the protocol_options

NDIS_HANDLE CloseRequestHandle; // 0 indicates an internal close

KSPIN_LOCK SpinLock; // guards Closing

PNDIS_OPEN_BLOCK NextGlobalOpen;

//

// These are optimizations for getting to MAC routines. They are not

// necessary, but are here to save a dereference through the MAC block.

//

SEND_HANDLER SendHandler;

TRANSFER_DATA_HANDLER TransferDataHandler;

//

// These are optimizations for getting to PROTOCOL routines. They are not

// necessary, but are here to save a dereference through the PROTOCOL block.

 

//

SEND_COMPLETE_HANDLER SendCompleteHandler;

TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;

RECEIVE_HANDLER ReceiveHandler;

RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;

//

// Extentions to the OPEN_BLOCK since Product 1.

//

RECEIVE_HANDLER PostNt31ReceiveHandler;

RECEIVE_COMPLETE_HANDLER PostNt31ReceiveCompleteHandler;

//

// NDIS 4.0 extensions

//

RECEIVE_PACKET_HANDLER ReceivePacketHandler;

SEND_PACKETS_HANDLER SendPacketsHandler;

//

// More NDIS 3.0 Cached Handlers

//

RESET_HANDLER ResetHandler;

REQUEST_HANDLER RequestHandler;

//

// Needed for PnP

//

UNICODE_STRING AdapterName; // Upcased name of the adapter we are bound to

};

这张表是一个单向链接表,并且存放了和PNDIS_OPEN_BLOCK->ProtocolCharacteristic

s

一样的数据收发派发函数,当第N块网卡发送数据包到第N个协议时,就会调用第N个协议

与第N个网卡之间建立的

NDIS_OPEN_BLOCK表里的SendHandler或SendPacketHandler。所以我们还需要对这张表里

的派发函数进行处理(勾挂)。

值得注意的是,在Windows9x/Me/NT的DDK中,NDIS_PROTOCOL_BLOCK的定义是很明确的,

而在Windows 2000/xp的DDK中,并没有该结构的详细定义,也就是说该结构在Windows2

000/xp下是非公开的,因此开发人员需要利用各种调试工具来发掘该结构的详细定义。

也正是因为如此,这种方法对平台的依赖性比较大,需要在程序中判断不同的操作系统

版本而使用不同的结构定义。可以用NdisOpenProtocolConfiguration打开协议配置,用

NdisReadConfiguration查询NDIS版本。

下面的函数注册fake protocol并将PNDIS_PROTOCOL_BLOCK结构存在ProtHandle中NDIS_

HANDLE GetProtocolBlock()

{

        NDIS_PROTOCOL_CHARACTERISTICS   PChars;

        NDIS_STRING                                             Name;

        NDIS_HANDLE                                             ProtHandle;

        NDIS_STATUS                                             Status;

        NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

        PChars.MajorNdisVersion = 5;

        PChars.MinorNdisVersion = 0;

        NdisInitUnicodeString(&Name, L"WssFW"); // Protocol name

        PChars.Name = Name;

        PChars.OpenAdapterCompleteHandler = NULL;

        PChars.CloseAdapterCompleteHandler = NULL;

        PChars.SendCompleteHandler = NULL;

        PChars.TransferDataCompleteHandler = NULL;

 

        PChars.ResetCompleteHandler = NULL;

        PChars.RequestCompleteHandler = NULL;

        PChars.ReceiveHandler = NULL;

        PChars.ReceiveCompleteHandler = NULL;

        PChars.StatusHandler = NULL;

        PChars.StatusCompleteHandler = NULL;

        PChars.BindAdapterHandler = NULL;

        PChars.UnbindAdapterHandler = NULL;

        PChars.UnloadHandler = NULL;

        PChars.ReceivePacketHandler = NULL;

        PChars.PnPEventHandler= NULL;

        NdisRegisterProtocol(&Status,

                                                 &ProtHandle,

                                                 &PChars,

                                                 sizeof(NDIS_PROTOCOL_CHARACTERIS

TICS));

        ASSERT(Status == NDIS_STATUS_SUCCESS);

        if(Status == NDIS_STATUS_SUCCESS)

                return ProtHandle;

        else

                return NULL;

}

        下面的函数挂接PNDIS_PROTOCOL_BLOCK中PNDIS_PROTOCOL_CHARACTERISTICS结构的R

ec

eiveHandler和ReceivePacketHandler

PVOID

HookProtoFunc(

                          PNDIS_PROTOCOL_CHARACTERISTICS pCharacteristics,

                          DWORD dwFunctionCode,

                          PVOID pfuncNew,

                          DWORD dwNdisVersion)

{

        PVOID pOldFunc = NULL;

        //Check parameters

        if( (!pCharacteristics ) || (!pfuncNew) )

                return NULL;

        switch(dwFunctionCode)

        {

        case PROTO_RECEIVE_HANDLER:

                //Just hook once!

                if(pCharacteristics->ReceiveHandler != pfuncNew )

                {

                        pOldFunc = pCharacteristics->ReceiveHandler;

                        if( pOldFunc )

                                pCharacteristics->ReceiveHandler = pfuncNew;

                }

                break;

        case PROTO_RECEIVE_PACKET_HANDLER:

                if(pCharacteristics->ReceivePacketHandler != pfuncNew)

                {

                        //if pOpenBlock is NULL or pOpenBlock->ReceivePacketHandl

er is NULL,

                        //just hook Characteristics;

                        pOldFunc = pCharacteristics->ReceivePacketHandler;

                        if(pOldFunc)

                                pCharacteristics->ReceivePacketHandler = pfuncNew

;

                }

                break;

        default:

                break;

        }

        return pOldFunc;

}

下面的函数挂接PNDIS_OPEN_BLOCK结构里的ReceiveHandler和ReceivePacketHandler

PVOID

HookBlockFunc(

                          PNDIS_OPEN_BLOCK pFirstOpenBlock,

                          DWORD dwFunctionCode,

                          PVOID pfuncNew,

                          DWORD dwNdisVersion)

{

        RECEIVE_HANDLER * pReceiveHandler = NULL;

        RECEIVE_PACKET_HANDLER * pReceivePacketHandler = NULL;

//      PVOID pFuncHandler = NULL;

        PVOID pOldFunc = NULL;

        PNDIS_OPEN_BLOCK pOpenBlock = pFirstOpenBlock;

        if(!pFirstOpenBlock)

                return NULL;

        if(!pfuncNew )

                return NULL;

        switch(dwFunctionCode)

        {

        case PROTO_RECEIVE_HANDLER:

                //travel all NDIS_OPEN_BLOCK

                for(;pOpenBlock;pOpenBlock = GetNextBlock( pOpenBlock,dwNdisVersi

on ))

                {

                        pReceiveHandler = GetReceiveHandler(pOpenBlock,dwNdisVers

ion);

                        //Just hook once!

                        if( *pReceiveHandler != pfuncNew )

                        {

                                pOldFunc = *pReceiveHandler;

                                *pReceiveHandler = pfuncNew;

                        }

                        if(dwNdisVersion == 0x00040001)//win2k ????

                        {

                                pReceiveHandler = GetPostNt31ReceiveHandler(pOpen

Block,dwNdisVersion);

                                if( *pReceiveHandler != pfuncNew )

                                {

                                        pOldFunc = *pReceiveHandler;

                                        *pReceiveHandler = pfuncNew;

                                }

                        }

                }

                break;

        case PROTO_RECEIVE_PACKET_HANDLER:

                //travel all NDIS_OPEN_BLOCK

                for(;pOpenBlock;pOpenBlock = GetNextBlock( pOpenBlock,dwNdisVersi

on ))

                        pReceivePacketHandler = GetReceivePacketHandler( pOpenBlo

ck,dwNdisVersion

 );

                        //Just hook once !

                        if(*pReceivePacketHandler != pfuncNew)

                        {

                                pOldFunc = *pReceivePacketHandler;

                                *pReceivePacketHandler = pfuncNew;

                        }

                }

                break;

 

        default:

                break;

        }

        return pOldFunc;

}

用 Electron 打造 UDP 数据报调试工具:主进程与 dgram 模块实战解析 在物联网设备联调、网络协议对接等场景中,UDP 调试往往比 TCP 更令人头疼:无连接、数据报边界、十六进制报文、端口占用、防火墙拦截……这些技术细节让通用网络调试助手显得笨重且低效。理解 UDP 与 TCP 的本质差异,掌握 Node.js 原生 dgram 模块的 socket 创建、bind、send 与 message 事件机制,是构建高效调试工具的基础。将网络收发逻辑放在 Electron 主进程,利用 preload 上下文隔离与 IPC 通信保障安全,渲染进程负责交互展示,这种三层架构非常适合 阅读详情

相关推荐

拦截网络socket的数据

拦截网络socket的数据的工具,我试过,很好用,通过HOOK捕获和修改send函数

js写一个路由监听

需要注意的是,在这个示例中我们只监听了 URL 的路径部分,如果需要监听整个 URL,包括查询参数和 hash 值,可以使用。要实现一个简单的路由监听,可以使用浏览器自带的。

TANKING,开源开发者! 2630

Mininet 2.2.1 图形可视化界面使用注意事项

前言 关于mininet的安装,网上教程不少,大致可以参考以下这篇文章: https://blog.youkuaiyun.com/linyixiao88/article/details/65651390 安装的时候,也可以不必根据上面这篇文章这么麻烦,直接sudo apt-get install mininet,即可。 Mininet可视化 Mininet 2.2.0以上版本内置了...

裕东方的博客 4192

windows下对端口的基本监听操作

开始---->运行---->cmd,或者是window+R组合键,调出命令窗口 输入命令:netstat -ano,列出所有端口的情况。在列表中我们观察被占用的端口,比如是49157,首先找到它。 查看被占用端口对应的PID,输入命令:netstat -aon|findstr "49157",回车,记下最后一位数字,即PID,这里是2720。 继续输入tasklist|findstr "2720",回车,查看是哪个进程或者程序占用了272..

qq_36777191的博客 1万+

利用GBD数据库做未来疾病负担预测

最近看到一篇文献,利用GBD数据库中的数据对疾病负担的发展趋势进行预测。觉得很有趣,就抽空用R语言复盘了一下里面关键的方法。 参考文献: Changing trends in the disease burden of esophageal cancer in China from 1990 to 2017 and its predicted level in 25 years DOI: 10.1002/cam4.3775 1. 相关R包的安装 主要用到的R包有3个,一个一个讲: 1.1 Nordpred

NickyCat的博客 5万+

ros2 humble中使用realsense t265与d435

前提,安装realsense SDK 2.51.1版本并且能成功启动realsense-viewer V2.51.1想要在ros2中使用realsense t265,必须配合realsense SDK v2.51.1使用realsense-ros 4.51.1版本,因为新版本realsense ros2不再对t265支持下面记录源码编译安装 realsense-ros 4.51.1版本。

m0_72797388的博客 956

【计算机网络与通信实验1】网络常用命令的使用及DNS层次查询、SMTP协议分析;利用分组嗅探器(ethereal)进行应用层协议分析

一、网络常用命令的使用:1、掌握网络常用命令的使用;2、利用网络常用命令对网络中常见现象进行分析判断。二、DNS层次查询、SMTP协议分析:1、了解和掌握DNS层次结构,利用NSLOOKUP命令对DNS层次结构进行访问;2、了解电子邮件系统发送及接收处理过程,对SMTP协议进行分析。三、利用分组嗅探器(ethereal)进行应用层协议分析:1、掌握捕包软件ethereal的使用,了解网络协议实体间进行交互以及报文交换情况;

qq_44394952的博客 2417

保姆级教程:在Windows/Mac上从零部署清华Kronos股票预测模型(含Qlib数据更新避坑指南)

本文提供了一份详细的指南,帮助用户在Windows和Mac系统上从零部署清华Kronos股票预测模型,包括环境配置、模型权重获取、Qlib数据更新避坑等关键步骤。特别针对国内用户遇到的网络问题和数据更新不及时提供了解决方案,适合量化投资和金融科技爱好者快速上手。

weixin_29053577的博客 623

winpcap-Windows抓包工具

winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它用于windows系统下的直接的网络编程。 特点 Winpcap提供了一个强大的编程接口,它很容易地在各个操作系统之间进行移植,也很方便程序员进行开发。 什么样的程序需要使用Winpcap 很多不...

顺其自然~专栏 7533

pytest-bdd封装

简介 pytestbdd主要是用于代码封装 代码封装的好处: 1、提升代码复用率 2、提示测试效率 手工测试–使用框架0代码 流程+数据驱动 产品经理这样的不懂测试的人员–流程驱动 自动化测试–数据驱动 pytest-bdd:流程驱动封装 行为驱动–敏捷开发模式,消除开发/测试对需要了解的歧义 使用方式: 描述需求/用户场景 Feature(需求) Scenario(场景) Given(假设) When(操作步骤) Then(验证,清除) #新建feature 文件之前 需要提取安装支持featrue文.

liao_11的博客 2733

CXL3.0 CDAT(Coherent Device Attributes Table)

在说明CDAT之前,先讲一下CXL中的DOE类型:CXL协议里定义了两种DOE的类型,一种是Compliance就是合规性测试的内容,还有一种就是CDAT(一致性属性表)Memory_Info_Valid是CXL设备的内存配置完成标志,位于DVSEC(Designated Vendor-Specific Extended Capability)的CXL Range X Size Low寄存器中(X为1或2)。

Summer的博客 1438

计算机网络实验:用 WinPCAP 监听并解析 FTP 命令和捕获TCP握手包和挥手包

实际上这样也会出问题,因为这个数据包传输确实是按字节传输,从第一个字节依次向后传输,但是在字节内部,是先传高位再传低位,因此如果按位读,结果是反的。至此,需要注意的地方就没有了,下附完整代码,我的tcp头部结构体定义有问题,没改,上面讲的那位同学的定义是正确无误的。弄清楚标志位后,就需要一个完整的tcp头的结构体定义,下面借用一位同学的结构体定义(逐一顺序,要从fin开始读取)握手包和挥手包都是tcp包,不能用简单的判断ftp部分的前导是否为user,pass,230等等这种。首先,tcp是三握手四挥手。

as660058的博客 1973

Android PMS——概述(一)

PMS(Package Manager Service)是 Android 操作系统的一个重要组件,它负责管理应用程序的包信息以及与应用程序的安装、卸载、权限控制等相关功能,确保应用程序的安全性和稳定性。 Android PMS 负责维护一个应用程序包的清单信息,该清单是一个 XML 文件,包含应用程序的各种元数据,例如应用程序的包名、版本号、权限要求、组件信息等。PMS通过访问该清单文件来获取应用程序的信息。 此外,Android PMS 还负责应用程序的安装和卸载。在安装应用

小旭的专栏 1669

【网络编程】捕获网卡IP数据报

1 参数protocol用来指明所要接收的协议包,如果是象IPPROTO_TCP(6)这种非0、非255的协议,当操作系统内核碰到ip头中protocol域和创建socket所使用参数protocol相同的IP包,就会交给这个raw socket来处理,因此,一般来说,要想接收什么样的数据包,就应该在参数protocol里来指定相应的协议。这时候你可以调用bind来指定,指定之后,你的程序就用声明的这一块资源来做事,声明的本机IP和端口就被占用了。发送的数据需要自己填充IP包头,并且自己计算校验和。

优快云下载吧 1063

基于Mask-RCNN网络的书架图书书脊分割和检测(含代码)

图书馆的书架上的图书书脊分割/检测对于图书书名等信息的识别具有重要意义,因此,该博客基于Mask-RCNN网络实现了图书书脊的分割和检测,有利于进一步利用ocr文字识别技术实现图书书名等信息的入库。如下图所示,为书架原始数据和分割/检测后的结果。(本文已训练模型,无需训练)

qq_44619530的博客 2026

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

防火墙的数据包拦截方式

  最近看了许多关于防火墙的包拦截方式,有比较全的,但依然不是很清楚,现将各个网络上的资源整理下。   网络防火墙都是基于数据包的拦截技术之上的。在 Windows 下,数据包的拦截方式有很多种,其原理和实现方式也千差万别。总的来说,可分为“用户级”和“内核级”数据包拦截两大类。 用户级下的数据包拦截方式有: Winsock Layered Service Provider (LSP)Win2K 包...

qq_44850340的博客 2401

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

开拓者:正义之怒主角Build完整指南:38种职业BD按道途归档,开卡到毕业直接抄

第一次开《开拓者:正义之怒》的档,最怕的不是打不过,而是抄了个旧版本的Build:论坛帖子新旧混杂,术语BAB、环数、AB看不懂,抄完加点才发现这套玩法早被更新修掉了。Wotr-BD-LR 就是为此建的正义之怒主角Build攻略仓库:38种职业BD按环数和道途归档,每条标注版本状态,从开卡教学到毕业装备截图一份全有,照抄即可上手。 ## 开卡前10分钟:读透进阶手册的四个教学界面 抄BD之前先

gitblog_00111的博客 278

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++实现高效网络探测:从ICMP协议到Windows Raw Socket编程实战

网络连通性测试是网络编程与运维监控中的基础需求,传统方法依赖系统ping命令,但存在性能瓶颈和平台依赖性。ICMP(Internet Control Message Protocol)作为TCP/IP协议族的核心子协议,通过Echo Request/Reply机制实现主机可达性探测。理解ICMP报文结构、校验和计算与原始套接字(Raw Socket)编程原理,能够帮助开发者构建高性能、可定制的网络探测工具。在Windows环境下,Raw Socket编程需要管理员权限,并涉及字节序转换、超时设置等关键技术细

weixin_34032792的博客 367

3 条命令跑通 socat-windows:Windows 上做端口转发和加密隧道

Windows 上经常有这种需求:本地起了个服务想让别人连,或者想给明文 TCP 连接套一层加密,却找不到趁手的工具。socat-windows 就是为此准备的——它是 socat 的 Windows 构建,下载即用,一条命令就能跑通端口转发。 ## 它是什么,适合谁 socat-windows 本质是 socat 1.7.2.1 的非官方 Windows 构建,基于 Cygwin 编译,保留

gitblog_00314的博客 149

网络空间安全概论 学习笔记(二)

第五章:网络攻防技术 网络入侵的前提:了解目标系统可能存在的安全缺陷和漏洞 侵入过程和信息收集相辅相成,在侵入过程中进一步掌握其他更多信息,改变侵入方式。 5.1:网络信息收集技术——网络踩点 网络踩点:了解目标隐私信息、网络环境、安全状况;寻找目标的薄弱环节。 常用手段: Google Hacking:利用搜索引擎找出漏洞,关键:提取关键字,搜索技巧; Whios服务: DNS Whi...

weixin_30457881的博客 791

Windows C++ UDP编程实战:从Winsock基础到高性能网络应用开发

在网络编程中,传输层协议的选择直接影响应用性能。TCP以其可靠连接和有序传输著称,适用于需要数据完整性的场景,如文件传输和网页浏览。然而,其握手、重传和拥塞控制机制会引入额外延迟。相比之下,UDP(用户数据报协议)采用无连接、尽最大努力交付的设计理念,牺牲了可靠性以换取极低的延迟和更小的协议开销。这一技术价值使其在对实时性要求极高的领域成为首选,例如音视频传输、在线游戏同步和物联网数据采集。在Windows平台上,通过Winsock API进行C++ UDP编程,开发者能够直接控制数据包的发送与接收,实现高

weixin_34326429的博客 502
上一篇: 根据PE文件格式获取LoadLibraryA()
下一篇: Windows远程内核漏洞注入
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值