计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

免费数据包截获技术的研究与实现(一)毕(6)

2013-06-26 01:08
导读:位生存时间 TTL unsigned charproto;//8位协议 (TCP, UDP 或其他) unsigned shortchecksum;//16位IP首部校验和 unsigned intsourceIP; //32位源IP地址 unsigned intdestIP; //32位目的IP地址
位生存时间 TTL
 unsigned char proto;   //8位协议 (TCP, UDP 或其他)
 unsigned short checksum;  //16位IP首部校验和
 unsigned int sourceIP;     //32位源IP地址
 unsigned int destIP;      //32位目的IP地址
}IP_HEADER;
 4.5程序设计实现重点
 在此数据包截获程序设计中,重点在于设计一个截获、分析程序,用于研究是数据包的截获与分析技术的实现,这二点是此设计的重点。
 就此设计的数据包截获程序来说,在截获到数据包之后,一层一层对数据包进行解析,最后分析出数据包里面包含的数据信息。现我们详细阐述截获数据包与分析数据包的情况。
 4.5.1数据包的截获
 在截获数据包前,首先对原始套接字进行设置,代码如下:
 //初始化SOCKET
 WSADATA wsaData;
 iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData);
 CheckSockError(iErrorCode, "WSAStartup");
 SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);//创建套接字
 CheckSockError(SockRaw, "socket");
 //获取本机IP地址
 char FAR name[MAX_HOSTNAME_LAN];
 iErrorCode = gethostname(name, MAX_HOSTNAME_LAN);
 CheckSockError(iErrorCode, "gethostname");
 struct hostent FAR * pHostent;
 pHostent = (struct hostent * )malloc(sizeof(struct hostent));
 pHostent = gethostbyname(name);
 //填充SOCKADDR_IN结构的内容
 SOCKADDR_IN sa;
 sa.sin_family = AF_INET;// internet协议簇
 sa.sin_port = htons(6000);// socket端口号(端口号可以随便改,但与系统不能冲突)
 memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
 free(pHostent); 大学排名
 iErrorCode = bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa));// 把原始套接字SockRaw绑定到本地网卡地址上//
 CheckSockError(iErrorCode, "bind");
 //设置SOCK_RAW为SIO_RCVALL(即把网卡设置为混杂模式),以便接收所有的IP包
 DWORD dwBufferLen[10] ;
 DWORD dwBufferInLen = 1 ;
 DWORD dwBytesReturned = 0 ;
 iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );//
CheckSockError(iErrorCode, "Ioctl");
 前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以通过recv()函数从网卡接收数据包了,接收到的原始数据包存放在缓存区中,并将参数提交给DecodeIpPack函数进行解包,具体的实现代码如下:
{
  memset(RecvBuf, 0, sizeof(RecvBuf));
  iErrorCode = recv(SockRaw, RecvBuf, sizeof(RecvBuf), 0);
  CheckSockError(iErrorCode, "recv");
  iErrorCode = DecodeIpPack(RecvBuf, iErrorCode);
  CheckSockError(iErrorCode, "Decode");
 }

 4.5.2数据包的解析
 数据包被截获后然后就可以根据前面对IP数据段头、TCP数据段头的结构描述而对截获的数据包进行分析。这是数据包截获程序的一个重要的组成部分。
 如图8所示:
图8数据包解析流程
 图8所示为数据包的解析模块,该模块对截获的数据包进行拆包分析,根据不同的协议类型分析其IP地址,数据包大小,端口号等,具体代码实现如下:
int DecodeIpPack(char *buf, int iBufSize)
{
 IP_HEADER *pIpheader;
 SOCKADDR_IN saSource, saDest;
 pIpheader = (IP_HEADER *)buf;
//协议甄别
iProtocol = pIpheader->proto; 内容来自www.nseac.com
 strncpy(szProtocol, CheckProtocol(iProtocol), MAX_PROTO_TEXT_LEN);
 if((iProtocol==IPPROTO_TCP) && (!ParamTcp)) return true;
 if((iProtocol==IPPROTO_UDP) && (!ParamUdp)) return true;
 if((iProtocol==IPPROTO_ICMP) && (!ParamIcmp)) return true;
//源地址
 saSource.sin_addr.s_addr = pIpheader->sourceIP;
 strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN
上一篇:ASP窗帘网站平台(一)毕业论文网 下一篇:免费网上战友录的设计与实现(一)毕业论