论文部分内容阅读
摘要:阐述了在共享式以太网中用Visual c++6.0实现的基于原始套接字技术的改进网络嗅探器实现。在设计上,除了捕获数据包以外,还进一步解析出应用层协议,运用模式匹配的KMP算法截获相关的数据信息,并保存到本机文件中。
关键词:共享式以太网;Visual C++6.0;原始套接字;网络嗅探器;KMP算法
0 引言
随着计算机和网络的普及,单独工作、不需要与其他用户交互的应用程序越来越少了。展望未来的IT产业,网络将成为核心。而数据安全作为网络中非常重要的一部分将越来越受到网络设计人员的重视。本文就数据信息的监控方面作一些探讨。
1 Sniffer的设计原理
1.1原始套接字(Raw Socket)
套接字是一种很常用的网络编程接口,应用程序可以用它进行网络通信而不需要知道底层的细节。Raw Socket是允许访问底层传输协议的一种套接字类型。原始套接字有两种类型,第一种是在IP头中使用预定义的协议,如ICMP;第二种是在IP头中使用自定义的协议。Raw Socket提供管理下层传输的能力,所以它既可以用来进行网络安全维护,也可能成为黑客窃取信息的有效手段。
1.2网络嗅探器(Sniffer)
网络嗅探器是一种常用的收集有用数据的工具,它在网络安全方面扮演了很重要的角色。使用这种工具,可以监视网络的状态、数据流动情况以及网络上传输的信息。因特网安全系统公司ISS给Sniffer下的定义为:Sniffer是利用计算机的网络接口截获目的地为其他计算机的数据报文的一种工具。Sniffer只能抓取同一个物理网段内的包,就是说,Sniffer和被监听的目标中间不能有路由或其他屏蔽广播包的设备。这一点很重要。
1.3设计原理分析
运行Sniffer的主机要实现网络监听必须满足两个条件:
其一,该主机的网卡必须工作在混杂模式下。通常的套接字程序只能响应与自己MAC地址相匹配的,或是以广播形式发出的数据帧,对于其他形式的数据帧网络接口采取的动作就是直接丢弃。为了使网卡接收所有经过它的数据包,要将其设置为混杂模式。在用户模式下,对网卡混杂模式的设置是通过原始套接字来实现的。创建原始套接字之后,将它绑定到一个明确的本地地址,然后向套接字发送SIO_RCVALL控制命令,让它接收所有的IP包,这样网卡便进入混杂模式了。
其二,传输的数据包能够到达该主机。将以太网内主机连在一起的设备主要有Hub和Switch。Hub是物理层设备,它仅是简单地将收到的数据广播到各个物理网线的接口,而不管这个数据包的目的MAC地址是什么。这样的以太网称之为共享式以太网。在共享式以太网中,只要将网卡设置为混杂模式就可以捕获到经过本地网络地所有数据包了。Switch是数据链路层设备,它收到数据包后会检查数据包的目的MAC地址,然后将该数据包发送到此MAC地址对应的网卡上,其他主机是不会收到的。这样的以太网称之为交互式以太网。这时,如果想收到其他机器数据包的话,就要用到ARP欺骗技术。而这项技术涉及面很广,不属于本文所要讨论的范围。本文所要做的是在共享式以太网中实现网络监听。
2 实现技术的程序设计
2.1程序的总体设计
程序的设计思想:—般的sniffer设计主要是捕获经过本机的IP包,并进行解包,取出封包中的协议头,源地址和目的地址等信息,并未捕获所传输的真正数据信息。而本程序设计的目的就是能根据用户所感兴趣的某些关键字对某个应用层的协议(如:HTTP、FTP、SMTP等)进行解析,取出用户所感兴趣的信息,并保存到本地机器上。因此本程序所要进行的处理主要有三个:
(1)首先创建原始套接字,将它绑定到一个明确的本地地址,然后设置SIO_RcvALL控制代码,最后进入无限循环,不断调用recv函数接收经过本地网卡的IP数据包;
(2)根据接收到的IP包,过滤出用户感兴趣的应用层协议,取出其中的数据信息;
(3)判断是否有用户感兴趣的信息,如果有,则存储在某个文件中。
2.2监听程序的分析
在visual c++6.O中用winsock API函数实现网络监听功能的步骤是比较固定的。图1所示的流程图是实现上述功能1的主要步骤。该流程图基本上描述了监听程序的实现过程,所以本文就省略了具体的实现代码。
图1 网络嗅探器通信流程
2.3协议解析函数的分析
void DecodePacket(char*pData)函数的主要功能就是根据用户所关心的协议类型解析出相应的数据包,其中pData参数表示所接收到的IP数据包。
以下是关键代码描述:
//IPHeader是一个结构体,描述了lP的头结构,下面的
TCPHeader类似
IPHeader*plPHdr=(IPHeader*)pData:
//获得IP的头部长度,以便可以从JP数据包中取出TCP封包
jnt nHeaderLen=(plPHdr->iphVerLen & Oxf)*sizeof(ULONG):
//根据IP报头的协议部分判断出上层是什么协议
switch(plPHdr->ipProtoc01)
{ case IPPROTO TCP://这里只以TCP为例,其他协议的实现
类似
//取出TCP封包,以做进一步解析
{TCPHeader*pTCPHdr=(TCPHeader)(pData+nHeaderLen):
//根据端口号判断应用层协议类型
switch(::ntohs(pTCPHdr->destinationPort))
{ case 80://这里只以HTTP协议为例,其他协议的实现类似
//Checklnf0函数是用于搜索关键字的,主要用了模式匹配
的KMP算法
CheckInfo((char*)pTCPHdr+sizeof(TCPHeader),
szSourcelP,szDestlP):
……∥其他端口号的操作
}
}
}
2.4搜索关键字函数的分析
该函数的形参分别为应用层数据的封包,源IP地址,目标IP地址,当封包中有和关键字相匹配的信息时,就将上述三个参数的信息写入指定的文件中。而对封包信息进行检查主要是运用了模式匹配的KMP算法,下面是一些主要的实现代码。
void CheckInfo(char*pData,char*szSourceIP,charszDestlP)
{//szDest为需要监视的关键字,pData为在网络上传输的信息
int nDestLen=strlen(szDest,):int nSourceLen=strlen(pData);
//初始化源串和关键字比较的位置
int nSourcePos=0:Int nDestPos=0:
while(nSourcePos {if(nDestPos==0llpData[nSourcePos]==szDest[nDestPos])
{++nSourcePos;++nDestPos;)
Else
//当匹配失败时,源串下次比较的位置不变,而关键字下次要
比较的位置则由next
//数组中对应的数值来决定。next值表达的就是T关键字自
身部分匹配的性质。
//这里省略了next数组的实现,其实现类似与本函数的实现。
{nDestPos=next[nDestPos.1:}
}
if(nDestPos>=nDestLen)
{……}//匹配成功,将所获得的数据信息写入到本地文件中
return 0:
}
3 结束语
互联网上大量使用的许多协议(如:HTTP、FTP、SMTP等)都是不加密的,本文正是基于这样的一个事实,利用一些相关的技术实现对网络信息的监视。在网络安全非常重要的今天,网络监听软件所扮演的角色越来越不容忽视。
sniffcr既可以作为网络故障的诊断工具,也可以被黑客作为嗅探和监听网络的工具。所以,sniffer技术是一把双刃剑,在了解了它的特性的基础上,利用好它,可以给我们带来方便。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:共享式以太网;Visual C++6.0;原始套接字;网络嗅探器;KMP算法
0 引言
随着计算机和网络的普及,单独工作、不需要与其他用户交互的应用程序越来越少了。展望未来的IT产业,网络将成为核心。而数据安全作为网络中非常重要的一部分将越来越受到网络设计人员的重视。本文就数据信息的监控方面作一些探讨。
1 Sniffer的设计原理
1.1原始套接字(Raw Socket)
套接字是一种很常用的网络编程接口,应用程序可以用它进行网络通信而不需要知道底层的细节。Raw Socket是允许访问底层传输协议的一种套接字类型。原始套接字有两种类型,第一种是在IP头中使用预定义的协议,如ICMP;第二种是在IP头中使用自定义的协议。Raw Socket提供管理下层传输的能力,所以它既可以用来进行网络安全维护,也可能成为黑客窃取信息的有效手段。
1.2网络嗅探器(Sniffer)
网络嗅探器是一种常用的收集有用数据的工具,它在网络安全方面扮演了很重要的角色。使用这种工具,可以监视网络的状态、数据流动情况以及网络上传输的信息。因特网安全系统公司ISS给Sniffer下的定义为:Sniffer是利用计算机的网络接口截获目的地为其他计算机的数据报文的一种工具。Sniffer只能抓取同一个物理网段内的包,就是说,Sniffer和被监听的目标中间不能有路由或其他屏蔽广播包的设备。这一点很重要。
1.3设计原理分析
运行Sniffer的主机要实现网络监听必须满足两个条件:
其一,该主机的网卡必须工作在混杂模式下。通常的套接字程序只能响应与自己MAC地址相匹配的,或是以广播形式发出的数据帧,对于其他形式的数据帧网络接口采取的动作就是直接丢弃。为了使网卡接收所有经过它的数据包,要将其设置为混杂模式。在用户模式下,对网卡混杂模式的设置是通过原始套接字来实现的。创建原始套接字之后,将它绑定到一个明确的本地地址,然后向套接字发送SIO_RCVALL控制命令,让它接收所有的IP包,这样网卡便进入混杂模式了。
其二,传输的数据包能够到达该主机。将以太网内主机连在一起的设备主要有Hub和Switch。Hub是物理层设备,它仅是简单地将收到的数据广播到各个物理网线的接口,而不管这个数据包的目的MAC地址是什么。这样的以太网称之为共享式以太网。在共享式以太网中,只要将网卡设置为混杂模式就可以捕获到经过本地网络地所有数据包了。Switch是数据链路层设备,它收到数据包后会检查数据包的目的MAC地址,然后将该数据包发送到此MAC地址对应的网卡上,其他主机是不会收到的。这样的以太网称之为交互式以太网。这时,如果想收到其他机器数据包的话,就要用到ARP欺骗技术。而这项技术涉及面很广,不属于本文所要讨论的范围。本文所要做的是在共享式以太网中实现网络监听。
2 实现技术的程序设计
2.1程序的总体设计
程序的设计思想:—般的sniffer设计主要是捕获经过本机的IP包,并进行解包,取出封包中的协议头,源地址和目的地址等信息,并未捕获所传输的真正数据信息。而本程序设计的目的就是能根据用户所感兴趣的某些关键字对某个应用层的协议(如:HTTP、FTP、SMTP等)进行解析,取出用户所感兴趣的信息,并保存到本地机器上。因此本程序所要进行的处理主要有三个:
(1)首先创建原始套接字,将它绑定到一个明确的本地地址,然后设置SIO_RcvALL控制代码,最后进入无限循环,不断调用recv函数接收经过本地网卡的IP数据包;
(2)根据接收到的IP包,过滤出用户感兴趣的应用层协议,取出其中的数据信息;
(3)判断是否有用户感兴趣的信息,如果有,则存储在某个文件中。
2.2监听程序的分析
在visual c++6.O中用winsock API函数实现网络监听功能的步骤是比较固定的。图1所示的流程图是实现上述功能1的主要步骤。该流程图基本上描述了监听程序的实现过程,所以本文就省略了具体的实现代码。
图1 网络嗅探器通信流程
2.3协议解析函数的分析
void DecodePacket(char*pData)函数的主要功能就是根据用户所关心的协议类型解析出相应的数据包,其中pData参数表示所接收到的IP数据包。
以下是关键代码描述:
//IPHeader是一个结构体,描述了lP的头结构,下面的
TCPHeader类似
IPHeader*plPHdr=(IPHeader*)pData:
//获得IP的头部长度,以便可以从JP数据包中取出TCP封包
jnt nHeaderLen=(plPHdr->iphVerLen & Oxf)*sizeof(ULONG):
//根据IP报头的协议部分判断出上层是什么协议
switch(plPHdr->ipProtoc01)
{ case IPPROTO TCP://这里只以TCP为例,其他协议的实现
类似
//取出TCP封包,以做进一步解析
{TCPHeader*pTCPHdr=(TCPHeader)(pData+nHeaderLen):
//根据端口号判断应用层协议类型
switch(::ntohs(pTCPHdr->destinationPort))
{ case 80://这里只以HTTP协议为例,其他协议的实现类似
//Checklnf0函数是用于搜索关键字的,主要用了模式匹配
的KMP算法
CheckInfo((char*)pTCPHdr+sizeof(TCPHeader),
szSourcelP,szDestlP):
……∥其他端口号的操作
}
}
}
2.4搜索关键字函数的分析
该函数的形参分别为应用层数据的封包,源IP地址,目标IP地址,当封包中有和关键字相匹配的信息时,就将上述三个参数的信息写入指定的文件中。而对封包信息进行检查主要是运用了模式匹配的KMP算法,下面是一些主要的实现代码。
void CheckInfo(char*pData,char*szSourceIP,charszDestlP)
{//szDest为需要监视的关键字,pData为在网络上传输的信息
int nDestLen=strlen(szDest,):int nSourceLen=strlen(pData);
//初始化源串和关键字比较的位置
int nSourcePos=0:Int nDestPos=0:
while(nSourcePos
{++nSourcePos;++nDestPos;)
Else
//当匹配失败时,源串下次比较的位置不变,而关键字下次要
比较的位置则由next
//数组中对应的数值来决定。next值表达的就是T关键字自
身部分匹配的性质。
//这里省略了next数组的实现,其实现类似与本函数的实现。
{nDestPos=next[nDestPos.1:}
}
if(nDestPos>=nDestLen)
{……}//匹配成功,将所获得的数据信息写入到本地文件中
return 0:
}
3 结束语
互联网上大量使用的许多协议(如:HTTP、FTP、SMTP等)都是不加密的,本文正是基于这样的一个事实,利用一些相关的技术实现对网络信息的监视。在网络安全非常重要的今天,网络监听软件所扮演的角色越来越不容忽视。
sniffcr既可以作为网络故障的诊断工具,也可以被黑客作为嗅探和监听网络的工具。所以,sniffer技术是一把双刃剑,在了解了它的特性的基础上,利用好它,可以给我们带来方便。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。