4月7日

来源:互联网 发布:多文件编程vs 编辑:程序博客网 时间:2024/04/29 18:01

l         Sniffer程序的重构(基于Win32 控制台程序)

Sniffer的原理是利用网卡的混杂状态下对全部经过网卡的数据包的IP头进行分析,可以查看到端口、协议、IP地址。

      

TCPIP头的数据结构

       typedef struct _IPHeader       //20字节的IP

{

       UCHAR   iphVerlen;       //版本号和头长度(各占4位)

       UCHAR   ipTOS;           //服务类型

       USHORT ipLength; //封包总长度,即整个IP报的长度

       USHORT ipID;              //封包标识,惟一标识发送的每一个数据报

       USHORT ipFlags;   //标志

       UCHAR   ipTTL;           //生存时间,就是TTL

       UCHAR   ipProtocol;      //协议,可能是TCPUDPICMP

       USHORT ipChecksum;   //校验和

       ULONG  ipSource; //IP

       ULONG  ipDestination;  //目标IP地址

}IPHeader,*PIPHeader;

 

typedef struct _TCPHeader          //20字节的TCP

{

       USHORT sourcePort;                  //16位源端口号

       USHORT destinationPort;      //16位目的端口号

       ULONG  sequenceNumber;          //32位序列号

       ULONG  acknowledgeNumber;    //32确认号

       UCHAR   dataoffset;                    //4位表示数据偏移

       UCHAR   flags;                           //6位标志位

                                                 //     TCP_FIN       0x01

                                                 //     TCP_SYN      0x02

                                                 //     TCP_RST      0x04

                                                 //     TCP_PSH       0x08

                                                 //     TCP_ACK      0x10

                                                 //     TCP_URG      0x20

                                                 //     TCP_ACE 0x40

                                                 //     TCP_CWR     0x80

                                                

       USHORT windows;                     //16位窗口的大小

       USHORT checksum;                    //16位校验和

       USHORT urgentPointer;        //16位紧急数据偏移量

}TCPHeader,*PTCPHeader;

 

初始化socket(建立一个独立的类)

       包含winsock2.h ,链接WS2_32.lib #pragma comment(lib,WS2_32)

       WSADATA     WSAStartup()  WSAClearup()

 

解构TCP头:

       根据TCP头中的数据记录的SourceportDestinationport进行分析。

例:端口21 80所代表的服务

Ntohs() 将一个ushort类型的数据从网络字节序转为主机的字节序

Htons() 将一个ushort类型的数据从主机的字节序转为网络字节序

 

              解构IP头:

根据IP头中的数据记录的ipsource地址、ipdestinationipprotocolIPPROTO_IP  IPPROTO_TCP IPPROTO_UDP)地址进行分析,根据IP头中记录的不同协议进行下一步的解构,计算IP头的长度,确定偏移量,确定其他头的位置进行下一步的解构。

                     in_addr数据用于储存IP地址的数据(网络字节序)

                     inet_addr() 将本地的字节序转为网络字节序

                     inet_ntoa() 将网络字节序转为本地的字节序

                    

              接收经过网卡的数据报

                            SOCKET socket()  SOCK_RAW          创建socket

                            SOCKADDR_IN    记录socket所要用的信息,用于绑定

Gethostname()              获取主机名

                            Gethostbyname()    获取主机的hostent

                     if(bind(sRaw,(PSOCKADDR)&addr_in,sizeof(addr_in) == SOCKET_ERROR)

                            return;

                            //绑定socket

                     DWORD dwValue =1;

                     if(ioctlsocket(sRaw,SIO_RCVALL,&dwValue) != 0)

                            return;

                            //控制socket的输入与输出的方式

                     char buff[1024];

                     int nRet;

                     while(TRUE)

                     {

                     nRet = recv(sRaw,buff,1024,0);   //接收经过网卡的数据包

                     if(nRet>0)

                            DecodeIPPacket(buff);

                     }

                     closesocket(sRaw);       //关闭socket

原创粉丝点击