使用网络嗅探器,可以把网卡置于混杂模式,实现对网络上传输的数据包进行截获和分析。很多防火墙也是通过截取数据包并进行分析来确定是否让数据包继续传输下去。本文使用Socket实现一个简单的网络嗅探器,对TCP/IP数据包进行截取,显示。
一、IP协议格式如下:
根据IP协议格式可以定义IP头的数据类型:
//IP协议结构
typedef struct _IP_HEADER{
BYTE bVerAndHLen; /*版本信息(前4位)和头长度(后4位)*/
BYTE bTypeOfService; //服务类型
USHORT nTotalLength; //数据包长度
USHORT nID; //数据包标识
USHORT nReserved; //保留字段
BYTE bTTL; //生成时间
BYTE bProtocol; //协议类型
USHORT nCheckSum; //校验和
UINT nSourIp; //源IP
UINT nDestIp; //目的IP
}IP_HEADER,*PIP_HEADER;
二、TCP和UDP协议格式
因此TCP和UDP数据结构如下:
//定义TCP协议结构
typedef struct _TCP_HEADER{
USHORT nSourPort;
USHORT nDestPort;
UINT nSequNum;
UINT nAcknowledgeNum;
USHORT nHLenAndFlag;
USHORT nWindowSize;
USHORT nCheckSum;
USHORT nrgentPointer;
}TCP_HEADER,*PTCP_HEADER;
//定义UDP协议结构
typedef struct _UDP_HEADER{
USHORT nSourPort;
USHORT nDestPort;
USHORT nLength;
USHORT nCheckSum;
}UDP_HEADER,*PUDP_HEADER;
设置网卡混杂模式
通常,网卡只接受和自己地址相关的信息包,即发送到本地的信息包,当设置网卡为混杂模式时,会接受所有的IP包。 基于这样的模式,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性(仅供学习研究)。
//#define SIO_RCVALL _WsaiOW(IOC_VENDOR,1)
// 设置为混杂模式,收所有IP包
DWORD dwValue = 1 ;
if ( ioctlsocket ( MonSock, SIO_RCVALL, &dwValue ) != 0 )
return 0 ;
调用Socket 的recv函数,接收所有的IP包,根据IP报头提供的信息,可以获取整个包的详细信息。
VC++下实现代码下载