网络监控原理!

网络监控原理!,第1张

网络监控采用的主要技术为网络监听和通信分析技术,网络监控系统的具体构成可以分为以下几个部分。

1硬件

尽管有一些产品需要特殊的硬件,但大多数的产品工作在标准的网络适配器上。如果用的是特殊的网络适配器,就能分析例如CRC错误,电压错误,电缆问题,协商错误等。

2捕包驱动

这是最重要的部分,它从线路上捕获网络通信,并根据需要进行过滤,接下来将它存储在缓冲区中。

3缓冲区

一旦从网络上捕获数据帧,它们被存在缓冲区中。存在几种的捕获方式:捕获通信,直到缓冲区被添满,或用循环的缓冲区,就是用新的数据替代老的数据。有一些产品(就像BlackIce的Sentry IDS)能以100兆比特秒的速度在硬盘上维持一个循环捕包的缓冲区。这将允许拥有数百个成G的缓冲区而不是基于内存的不足1G的缓冲区。

4实时分析

这个特性是网络监控所倡导的,就是在数据帧离线进行一定的分析。这能发现网络性能问题和在通信捕获中的错误。一些厂家正沿着这条路线在它们的产品中加入一些新的功能。网络入侵检测系统就是这样做的,但是它们是对于通信中黑客的行为标记进行详细的审核而不是对错误/性能问题进行处理。

5解码

就是显示网络通信的内容,这样一名分析者将会十分容易地获得相关信息并依据这些信息分析出网络上究竟发生了什么。

网管大师追踪者是一款网络监控工具,可以捕获网络数据包并进行分析。数据包捕获器是追踪者的一个功能,可以捕获网络数据包并展示出来。

使用数据包捕获器,需要先安装并打开网管大师追踪者软件。接下来,按照以下步骤 *** 作:

1 点击追踪者窗口上方的“数据包捕获器”按钮,进入数据包捕获器界面。

2 在界面中选择要捕获的网络接口,可以选择多个接口同时捕获。

3 点击“开始捕获”按钮,开始捕获网络数据包。

4 在捕获过程中,可以使用过滤器对数据包进行过滤,只捕获符合条件的数据包。

5 捕获到的数据包将会在列表中展示,可以查看每个数据包的详细信息,包括源地址、目标地址、协议类型、数据大小等。

6 可以保存捕获到的数据包,方便后续的分析和研究。

总之,使用网管大师追踪者的数据包捕获器,可以有效地监控网络流量,对网络故障进行分析和排查。但是需要注意的是,捕获网络数据包可能会涉及到隐私问题,需要遵守相关规定,不得非法获取他人的网络数据包。

private

void

listen设备forclients()

{

localdatabase

eventdb

=

new

localdatabase();

string

eventprestr

=

"设备监听线程("

+

threadcurrentthreadmanagedthreadidtostring()

+

')';

thislistener设备start();

eventdbsavestr(eventprestr

+

"启动");

while

(thisismainrun

==

true)

{

//blocks

until

a

client

has

connected

to

the

server

tcpclient

client

=

thislistener设备accepttcpclient();//有连接接入,

//create

a

thread

to

handle

communication

with

connected

client

thread

clientthread

=

new

thread(new

parameterizedthreadstart(handle设备comm));//应答,并启动一个线程处理

//取得来源ip

eventdbsavestr(eventprestr

+

"接收到来自"

+

((systemnetipendpoint)clientclientremoteendpoint)addresstostring()

+

"的连接,并启动线程id:"

+

clientthreadmanagedthreadidtostring());

clientthreadstart(client);

}

}

我的程序中也是这样写的,你应该注意到

tcpclient

client

=

thislistener设备accepttcpclient();//有连接接入,

这句话是有设备连接了,才执行,而不是被跳过去,也就是说,循环是在这里等待的。

你说的网络事件通知,其实可以自己做,只不过是意义不大,现在程序框架已经这么成熟了,自己写也没什么意义。

程序源代码如下:

程序1 利用WinPcap函数库函数解析捕获数据包的以太帧头

程序名:AnalyzeETH_WinPcapCPP

程序名:AnalyzeETH_WinPcapCPP

程序2 利用WinPcap函数库函数解析捕获的IPv4数据报包头

程序名:AnalyzeIPv4_WinPcapCPP

程序名:AnalyzeIPv4_WinPcapCPP

程序3 利用WinPcap函数库函数解析捕获的IPv6数据报包头

程序名:AnalyzeIPv6_WinPcapCPP

程序名:AnalyzeIPv4_WinPcapCPP

程序4 利用WinPcap函数库函数解析捕获的TCP数据报包头

程序名:AnalyzeTCP_WinPcapCPP

程序名:AnalyzeTCP_WinPcapCPP

程序5 利用WinPcap函数库函数解析捕获的UDP数据报包头

程序名:AnalyzeUDP_WinPcapCPP

程序名:AnalyzeUDP_WinPcapCPP

程序6 利用WinPcap函数库函数发送TCP SYN帧数据报,进行SYN洪水攻击

注意:本程序仅供学习参考,请不要在Internet网络上使用!

程序名:AnalyzeUDP_WinPcapCPP

程序名:AnalyzeUDP_WinPcapCPP

程序7 利用原始套接字捕获并解析IPv4数据包

程序名:AnalyzeIPv4_WINSOCKCPP

程序名:AnalyzeIPv4_WINSOCKCPP

程序8 利用原始套接字捕获并解析双协议栈下IPv6数据包

程序名:AnalyzeIPv6_WINSOCKCPP

程序名:AnalyzeIPv6_WINSOCKCPP

程序9 利用原始套接字捕获并解析TCP数据包

程序名:AnalyzeTCP_WINSOCKCPP

程序名:AnalyzeTCP_WINSOCKCPP

程序10 利用原始套接字捕获并解析UDP数据包

程序名:AnalyzeUDP_WINSOCKCPP

程序名:AnalyzeUDP_WINSOCKCPP

程序11 利用原始套接字发送TCP SYN帧,对目标主机进行SYN洪水攻击

程序名:SYNFlood_WINSOCKCPP

注意:本程序仅供学习参考,请不要在Internet网络上使用!

程序名:SYNFlood_WINSOCKCPP

程序12 采集局域网内若干台主机网络数据并分析网络流量的综合应用程序

可执行程序:LANSecrutinyexe

程序运行情况:

程序主要源代码:LANScrutinyDlgcpp

完整程序全部源代码:LANSecrutinyrar

编说明如下:

1.结构体说明

在程序中,我们将要进行分析的各数据包头格式用结构体进行定义。这样便于对数据

包的解析,使每个字段清楚易懂。

以太帧头格式结构体,共14个字节:

typedef struct ether_header {

unsigned char ether_dhost[6]; //目的MAC地址

unsigned char ether_shost[6]; //源MAC地址

unsigned short ether_type; //协议类型

}ETHHEADER,PETHHEADER;

IPv4报头格式结构体,共20个字节:

typedef struct ipv4_header {

unsigned char ver_ihl; //版本 (4 bits) + 首部长度 (4 bits)

unsigned char tos; //服务类型

unsigned short tlen; //数据报总长度

unsigned short identification; //标识

unsigned short flags_fo; //标志 (3 bits) + 片偏移 (13 bits)

unsigned char ttl; //生存时间

unsigned char proto; //协议

unsigned short crc; //首部校验和

u_char ip_src[4]; //源IP地址

u_char ip_dst[4]; //目的IP地址

}IPHEADER,PIPHEADER;

IPv6报头格式结构体,共40个字节:

typedef struct ipv6_header {

u_char ver_tf; //版本号(4 bit)

u_char traffic; //优先级(8 bit)

u_short label; //流标识(20 bit)

u_char length[2]; //报文长度(16 bit)

u_char next_header; //下一头部(8 bit)

u_char limits; //跳数限制(8 bit)

u_char Srcv6[16]; //源IPv6地址(128 bit)

u_char Destv6[16]; //目的IPv6地址(128 bit)

}IPv6_HEADER,PIPv6_HEADER;

TCP报头格式结构体,共20个字节:

typedef struct tcp_header {

WORD SourPort; //源端口号

WORD DestPort; //目的端口号

DWORD SeqNo; //序号

DWORD AckNo; //确认序号

BYTE HLen; //首部长度(保留位)

BYTE Flag; //标识(保留位)

WORD Window; //窗口大小

WORD ChkSum; //校验和

WORD UrgPtr; //紧急指针

}TCPHEADER,PTCPHEADER;

UDP报头格式结构体,共8个字节:

typedef struct udp_header {

u_short sport; //源端口号

u_short dport; //目的端口号

u_short len; //数据报长度

u_short crc; //校验和

}UDPHEADER,PUDPHEADER;

2.程序说明

程序1 利用WinPcap函数库函数解析捕获数据包的以太帧头

程序名:AnalyzeETH_WinPcaphtm

该程序通过利用WinPcap提供的捕获数据包函数,对网络中的数据包进行采集分析。

WinPcap中提供的函数pcap_open_live()可以获取网络适配器,通过函数pcap_loop(pcap_t

p,int cnt,pcap_handle dispatch_handle,u_char user)直接深入到数据链路层进行网络数据的捕

获,将捕获的数据传到函数dispatch_handle(u_char ,const pcap_pkthdr header,const u_char

pkt_data)中,该函数的参数pkt_data指向的即是捕获的数据包。这样,我们可以捕获局域

网内数据链路层的以太帧,并按照以太帧头格式对数据包进行解析,以获得以太帧头中的有

关信息。同时将捕获数据存入磁盘中。通过该程序,可以分析出局域网内传输的各类网络层

数据包的情况。程序完整代码详见程序1(AnalyzeETH_WinPcapCPP)。

程序2 利用WinPcap函数库函数解析捕获的IPv4数据报包头

程序名:AnalyzeIPv4_WinPcapCPP

该程序同样通过WinPcap提供的函数,获取网络适配器,利用函数pcap_loop(pcap_t

p,int cnt,pcap_handle dispatch_handle,u_char user)捕获数据包。并将捕获的数据传到函数

dispatch_handle(u_char ,const pcap_pkthdr header,const u_char pkt_data)中,在该函数中

对以太帧包进行过滤,将以太帧头中协议类型字段(ether_type)中值为0x0800的数据包进

行解析,即可得到整个IPv4分组的信息,其中从IPv4数据报头开始的前20个字节为IPv4

包头信息字段。同时将解析出的相关数据字段存入磁盘中。通过该程序,可以分析局域网内

各主机的网络使用情况。程序完整代码详见程序2(AnalyzeIPv4_WinPcapCPP)。

程序3 利用WinPcap函数库函数解析捕获的IPv6数据报包头

程序名:AnalyzeIPv6_WinPcapCPP

由于WinPcap提供的函数可以深入到数据链路层去捕获数据包,因此无论是IPv4数据

包还是IPv6数据包都是被封装在以太帧头中,因此都能够被捕获。本程序利用WinPcap提

供的函数,实现了过滤捕获并解析在纯IPv6环境或双协议栈环境下传输的IPv6数据包。捕

获的数据包以太帧头中协议类型(ether_type)字段值为0x86DD,则该数据包为纯IPv6环

境下传输的IPv6数据包,将随后的40个字节按照IPv6包头格式解析,即可得到IPv6包头

中携带的信息。对捕获的数据包进行过滤,在过滤出的IPv4数据包中分析IPv4包头,其中

proto字段值为0x29的数据包即为双协议栈下IPv6数据包,于是将IPv4包头后的40个字

节按照IPv6包头格式解析,即可得到IPv6包头中携带的信息。同样,解析过程都在函数

dispatch_handle(u_char ,const pcap_pkthdr header,const u_char pkt_data)中进行。

if(eth_header->Etype[0]==0x86 && eth_header->Etype[1]==0xDD) {

//纯IPv6环境下传输的IPv6数据包

}

else if(eth_header->Etype[0]==0x08 && eth_header->Etype[1]==0x00) {

if(ip_header->prote==0x29) {

//双协议栈环境下传输的IPv6数据包

}

}

该程序还进一步对IPv6中封装的TCP、ICMPv6、UDP包头进行了解析,其中TCP、

UDP包头格式与IPv4版本中的相同。

通过该程序,可以捕获不同网络环境下封装的IPv6数据包,并进行分析。完整代码详

见程序3(AnalyzeIPv6_WinPcapCPP)。

程序4 利用WinPcap函数库函数解析捕获的TCP数据报包头

程序名:AnalyzeTCP_WinPcapCPP

该程序通过利用WinPcap提供的函数pcap_loop(pcap_t p,int cnt,pcap_handle

dispatch_handle,u_char user)将数据包捕获。并在dispatch_handle(u_char ,const pcap_pkthdr

header,const u_char pkt_data)中通过编写代码实现解析。由于pkt_data中存放的是整个以

太帧,因此只要将指针跳到TCP包头开始处,然后按照TCP包头格式解析就可以读出其中

信息。程序中在解析数据包的同时,将解析结果存放到磁盘文件中。该程序通过对TCP包

头的解析,并进行分析,可以推断网络中是否存在某些网络攻击行为。完整代码详见程序4

(AnalyzeTCP_WinPcapCPP)。

程序5 利用WinPcap函数库函数解析捕获的UDP数据报包头

程序名:AnalyzeUDP_WinPcapCPP

该程序与AnalyzeTCPCPP程序基本一样,通过利用WinPcap提供的函数pcap_loop

(pcap_t p,int cnt,pcap_handle dispatch_handle,u_char user)将数据包捕获,并在

dispatch_handle(u_char ,const pcap_pkthdr header,const u_char pkt_data)中通过编写代码

实现解析。只要将指针改为跳到UDP包头开始处,然后按照UDP包头格式解析就可以读出

其中信息。程序中在解析数据包的同时,将解析结果存放到磁盘文件中。完整代码详见程序

5(AnalyzeUDP_WinPcapCPP)。

程序6 利用WinPcap函数库函数发送TCP SYN帧数据报,进行SYN洪水攻击

程序名:SYNFlood_WinPcapCPP

功能强大的WinPcap函数库不但能够捕获网络中的数据,还能利用它提供的函数,发

送自己构造数据链路层的数据报。因此,在本程序中,我们自己构造了一个SYN帧TCP数

据报,并将其封装到我们自己构造的IP报头和以太帧头中,其中IP报头中的源IP地址(程

序中设为1111)和以太帧头中的源MAC地址(程序中设为

0x00,0x00,0x00,0x00,0x00,0x00)都是伪造的不存在的地址。将大量请求联接的数据报源源

不断地发送到目标主机,而对方无法把回应数据报传回源主机,这样就实现了对主机进行

SYN洪水攻击了。程序中的关键在于,封装在数据报中的校验和必须正确,否则目标主机

不会做任何反映。因此,程序中实现了一个计算校验和的函数,用于计算IP报头和TCP报

头中的校验和字段。校验和函数代码如下:

inline USHORT checksum(USHORT buffer, int size) {

unsigned long cksum=0;

while(size >1) {

cksum+=buffer++;

size -=sizeof(USHORT);

}

if(size )

cksum += (UCHAR)buffer;

cksum = (cksum >> 16) + (cksum & 0xffff);

cksum += (cksum >>16);

return (USHORT)(~cksum);

}

在计算IP校验和时,buffer中存放的是IP报头数据,而在计算TCP校验和时,buffer

中存放的是TCP伪头部和TCP头部数据。

将构造好的数据报通过函数pcap_sendqueue_queue(pcap_send_queue squeue,struct

pcap_pkthdr pktheader,u_char pktdata)放到发送队列中,再利用函数

pcap_sendqueue_transmit(pcap_t outdesc, pcap_send_queue squeue,int sync)向目标主机发送。

即可实现SYN Flood攻击。完整代码详见程序6(SYNFlood_WinPcapCPP)。

程序7 利用原始套接字捕获并解析IPv4数据包

程序名:AnalyzeIPv4_WINSOCKCPP

该程序通过使用原始套接字过滤并捕获IPv4数据包,并对捕获数据包进行解析。程序

分为三部分,其中在函数InitWinsock2()内初始化Winsock2。在函数BindSocket()内,

利用winsock2提供的函数WSASocket()建立套接字,由于只有原始套接字可以深入到网

络层捕获数据包,因此WSASocket(int af,int type,int protocol,LPWSAPROTOCOL_INFO

lpPorotocolInfo,GROUP g,DWORD dwFlags)中参数type要设为SOCK_RAW。因为是捕获

IP数据包,参数protocol设为IPPROTO_IP。然后将套接字进行绑定。这样就可以对网络进

行监听,捕获网络中的IPv4数据包了。在函数RecieveIPv4()函数中,对捕获的数据进行

解析。完整代码详见程序AnalyzeIPv4_WINSOCKCPP。

程序8 利用原始套接字捕获并解析双协议栈下IPv6数据包

程序名:AnalyzeIPv6_WINSOCKCPP

该程序通过使用原始套接字过滤并捕获双协议栈下IPv6数据包,并对捕获数据包进行

解析。与程序AnalyzeIPv4_WINSOCKCPP一样,本程序分为四部分,分别完成初始化套接

字,建立并绑定套接字,捕获数据包并分析。因为IPv6数据包封装在IPv4包头中,因此套

接字按IPv4套接字的建立,即WSASocket(int af,int type,int

protocol,LPWSAPROTOCOL_INFO lpPorotocolInfo,GROUP g,DWORD dwFlags)中参数af

设为AF_INET,参数type要设为SOCK_RAW。因为是捕获IP数据包,参数protocol设为

IPPROTO_IP。完整代码详见程序AnalyzeIPv6_WINSOCKCPP。

程序9 利用原始套接字捕获并解析TCP数据包

程序名:AnalyzeTCP_WINSOCKCPP

该程序通过使用原始套接字过滤并捕获TCP数据包,并对捕获数据包进行解析。与程

序AnalyzeIPv4_WINSOCKCPP一样,对套接字进行初始化、建立并绑定后,在RecieveTCP

()函数中获取TCP数据包字段,按照TCP包头格式解析,可获取完整的TCP数据包数据。

完整代码详见程序AnalyzeTCP_WINSOCKCPP。

程序10 利用原始套接字捕获并解析UDP数据包

程序名:AnalyzeUDP_WINSOCKCPP

该程序通过使用原始套接字过滤并捕获UDP数据包,并对捕获数据包进行解析。与程

序AnalyzeTCP_WINSOCKCPP一样,对套接字进行初始化、建立并绑定后,在RecieveTCP

()函数中获取TCP数据包字段,按照TCP包头格式解析,可获取完整的TCP数据包数据。

完整代码详见程序AnalyzeUDP_WINSOCKCPP。

程序11 利用原始套接字发送TCP SYN帧,对目标主机进行SYN洪水攻击

程序名:SYNFlood_WINSOCKCPP

本程序利用原始套接字发送TCP数据包,对目标主机进行SYN Flood攻击。程序中函

数socket(AF_INET,SOCK_RAW,IPPROTO_IP);将套接字设为原始套接字。并通过函数

setsockopt(SOCKET s,int level,int optname,const charoptval,int optlen);设置头包含选项,其中

IP_HDRINCL是IPPROTO_IP选项级别,若将IP_HDRINCL选项设为TRUE,发送函数会

将IPv4头包含在自己发送的数据前面,因此,在调用一个Winsock发送函数时,必须在数

据前面包含完整的IPv4头。与WinPcap不同的是,原始套接字只能深入到网络层,故只需

构造IPv4包头和TCP包头。将构造好的、计算出正确校验和的数据包放入缓冲区,通过sendto

(SOCKET s,const char buf,int len,int flags,const struct sockaddr to,int tolen)向目标主机发

送,即达到攻击目的。

程序12 采集局域网内若干台主机网络数据并分析网络流量的综合应用程序

程序名:LANSecrutiny

本程序分为几个模块:探测局域网内运行主机;后台采用动态链表存放采集到所需的

网络数据;图示局域网及每台主机的网络流量随时间的折线变化;监听结束后多线程进行数

据存盘。

探测局域网内运行主机

要对局域网内主机进行监听,采集其网络数据,首先必须知道局域网内正在运行的主

机。为迅速获得主机是否处于运行状态的消息,只要向局域网内所有主机发送ARP数据包,

并根据回应的数据报分析,即可得到答案。因为一局域网的网关和子网掩码是已知的,因此,

我们可以计算出这一局域网的IP地址范围。在本程序中,我们利用WinPcap提供的发送数

据报函数pcap_sendpacket(pcap_t adhandle,unsigned charsendbuf,int size),向所有主机分别

发送自己构造的请求ARP数据报,捕获回应的ARP数据报并解析,即可获知网内运行主机

的MAC地址及IP地址。详细代码见程序13中LANSecrutinyDlgCPP文件内SendARPtoGetIP

()函数。

利用此方法,可使该程序在不同网段使用,增强了程序的灵活性。

采用动态链表存放采集到的网络数据

为使程序具有良好的伸缩性,能根据网络数据采集情况动态的分配内存,不致造成内

存浪费或内存空间过小的情况发生。在本程序中,我们将采集的所需数据存放到链表中。在

函数dispatch_handle(u_char ,const pcap_pkthdr header,const u_char pkt_data)中,我们按

照前述几个程序中对数据报解析的方法,将捕获数据报个报头中的所需数据提取出来,并存

入一个链表节点中。然后将该存放完数据的节点插入到链表的结尾处。

本程序设计为可以将IPv4数据报数据和IPv6数据报数据存放如同一链表中,而IPv4

地址为32位,IPv6地址为128位。因此我们将节点中存放IP地址的元素设置为一个有17

个元素的数组,将数组的第一个元素IPaddr[0]作为判断值。如果是IPv4数据报,则IPaddr[0]

的值为0,并将IPv4地址放入随后的4个元素中,如果是IPv6数据报,则IPaddr[0]的值为

1,并将IPv6地址放入随后的16个元素中。

由于ICANN为0~1023端口各命名了一个端口名。因此,我们在程序中,通过函数

getportname()为有端口名的端口查找其端口名,这样便进一步了解数据包的高层协议类型。

void getportname(int portn,char portch[],char protocol) {

if(getservbyport(htons(portn),protocol)!=NULL) {

strcpy(portch,getservbyport(htons(portn),protocol)->s_name);

}

else

sprintf(portch,"%d",portn);

}

在该函数中,我们将捕获的端口号值portn和协议类型protocol传入,通过Winsock2提供的

函数getservbyport()将找到的端口名传回给节点元素portch。

通过该程序将捕获的数据报中重要数据存放入链表中,我们可以清楚的了解被监听主

机与外界交流的时间、类型以及对放地址等情况。完整代码详见程序LANSecrutiny中

dispatcher_handler()函数。

采用多线程技术进行数据存盘

由于程序中我们设计成为每台被监听主机产生两根链表存放进、出数据,因此对n台

主机进行监听时,会产生2n条链表。为解决多条链表存盘问题,我们采用多线程技术,这

样能使各条链表的存盘工作不相互影响,避免了由于一条链表在存盘过程中出现错误而使其

后其它链表无法再进行存盘,从而造成采集数据的丢失。存盘时,我们将链表中一个节点拷

贝到临时节点中,再进行保存,这样避免了存盘时由于某些原因造成对链表的破坏而影响存

盘工作。详细代码见程序LANSecrutiny中SavePacket()函数。

图示网络流量

通过图示的方法,能使我们更快的了解网络流量状况。因此在程序中我们设计了对整

个局域网机每台主机的网络流量图示。

在程序中,为将流量用折线方式绘制出来,我们设计了一个数组,用于存放流量值,

其中,第一个元素存放当前时间流量值,第二个元素存放前一秒流量值,以此类推,第n

个元素存放n秒前流量。这样,在绘图时就能将不同时间的流量用折线连接起来。

在函数OnTimer()中加入以下代码:

if(postion[0]>=360) postion[0]=358;

for(i=125;i>0;i--) postion[i]=postion[i-1];

在函数OnPaint()中加入以下代码:

for(i=0;i<125;i++) {

MoveToEx(hdc,15+i5,385-postion[i],NULL);

LineTo(hdc,15+(i+1)5,385-postion[i+1]); }

完整代码详见程序LANSecrutiny中AnalyzeDlgCPP内各函数。

以上程序还有很多不足之处,恳请指正。谢谢!

以上就是关于网络监控原理!全部的内容,包括:网络监控原理!、网管大师追踪者的数据包捕获器怎么用、c#TCP 客户端怎么监听接收数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9611669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存