FW:简易的sniffer程序_拔剑-浆糊的传说_新浪博客

http://blog.csdn.net/lishuhuakai/article/details/28649331

分类: 计算机网络 2014-06-05 17:27  641人阅读  评论(0)  收藏  举报

       真的很简易,这个程序仅仅是抓一些发送到本机的数据包,然后显示出来它们的一些信息罢了!

     程序非常简单!

     

  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #pragma  comment(lib, "ws2_32.lib")   
  6. #define SIO_RCVALL _WSAIOW(IOC_VENDOR, 1)  
  7. const int MAX_ADDR_LEN = 16;          
  8. const int MAX_HOSTNAME_LEN = 255;     
  9.   
  10.   
  11.   
  12. struct IPHeader {  
  13.     BYTE HeaderLength : 4;       //首部长度  
  14.     BYTE Version : 4;            //版本  
  15.     BYTE DS;                     //区分服务  
  16.     WORD TotalLength;            //总长度  
  17.     WORD ID;                     //标识  
  18.     BYTE FragmentOffset0 : 5;    //片偏移  
  19.     BYTE MF : 1;                 //MF标识  
  20.     BYTE DF : 1;                 //DF标识  
  21.     BYTE Reserved : 1;           //保留标识  
  22.     BYTE FragmentOffset1;        //片偏移  
  23.     BYTE TTL;                    //生存时间  
  24.     BYTE Protocol;               //协议  
  25.     WORD Checksum;               //检验和  
  26.     DWORD SourceAddress;         //源地址  
  27.     DWORD DestinationAddress;    //目的地址  
  28. };  
  29.   
  30.   
  31. struct TCPHeader {  
  32.     WORD SourcePort;             //源端口  
  33.     WORD DestinationPort;        //目的端口  
  34.     DWORD SequenceNumber;        //序号  
  35.     DWORD AcknowledgmentNumber;  //确认号  
  36.     BYTE Reserved0 : 4;          //保留字段第一部分  
  37.     BYTE DataOffset : 4;         //数据偏移  
  38.     BYTE FIN : 1;                //FIN标识  
  39.     BYTE SYN : 1;                //SYN标识  
  40.     BYTE RST : 1;                //RST标识  
  41.     BYTE PSH : 1;                //PSH标识  
  42.     BYTE ACK : 1;                //ACK标识  
  43.     BYTE URG : 1;                //URG标识  
  44.     BYTE Reserved1 : 2;          //保留字段第二部分  
  45.     WORD Window;                 //窗口  
  46.     WORD Checksum;               //检验和  
  47.     WORD UrgentPointer;          //紧急指针  
  48. };  
  49.   
  50. struct UDPHeader {  
  51.     WORD SourcePort;             //源端口  
  52.     WORD DestinationPort;        //目的端口  
  53.     WORD Length;                 //长度  
  54.     WORD Checksum;               //检验和  
  55. };  
  56.   
  57. void main()  
  58. {  
  59.     SOCKET sock;  
  60.     WSADATA wsd;  
  61.     DWORD dwBytesRet;  
  62.     unsigned int optval = 1;  
  63.     int pCount = 0;  
  64.   
  65.     sockaddr_in source, dest;  
  66.   
  67.     char hostName[MAX_HOSTNAME_LEN];  
  68.   
  69.     char sourceIP[MAX_ADDR_LEN];   
  70.     char destIP[MAX_ADDR_LEN];    
  71.     char recvBuff[65535] = { 0 };  
  72.   
  73.     WSAStartup(MAKEWORD(2, 1), &wsd);   
  74.     hostent *pHostent;  
  75.     UDPHeader *pUdpheader;    
  76.     IPHeader *pIpheader;      
  77.     TCPHeader *pTcpheader;    
  78.   
  79.       
  80.     if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == SOCKET_ERROR)  
  81.     {  
  82.         exit(-1);  
  83.     }  
  84.   
  85.     gethostname(hostName, MAX_HOSTNAME_LEN);    //获取主机名称  
  86.     pHostent = gethostbyname(hostName);     //获取有关于本机信息的一个hostent结构体  
  87.   
  88.     sockaddr_in sa;  
  89.     sa.sin_family = AF_INET;  
  90.     sa.sin_port = htons(6000);  
  91.     memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);  
  92.   
  93.     bind(sock, (SOCKADDR *)&sa, sizeof(sa));   
  94.   
  95.     if (WSAGetLastError() == 10013)  
  96.     {  
  97.         exit(1);  
  98.     }  
  99.       
  100.       
  101.       
  102.       
  103.     WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);  
  104.   
  105.     pIpheader = (IPHeader *)recvBuff;  
  106.       
  107.     while (pCount < 1000)  
  108.     {  
  109.         memset(recvBuff, 0, sizeof(recvBuff));  
  110.         recv(sock, recvBuff, sizeof(recvBuff), 0);   
  111.   
  112.         source.sin_addr.S_un.S_addr = pIpheader->SourceAddress;   
  113.         strncpy_s(sourceIP, inet_ntoa(source.sin_addr), MAX_ADDR_LEN);  
  114.   
  115.         dest.sin_addr.S_un.S_addr = pIpheader->DestinationAddress;   
  116.         strncpy_s(destIP, inet_ntoa(dest.sin_addr), MAX_ADDR_LEN);  
  117.   
  118.         if (pIpheader->Protocol == IPPROTO_TCP)    
  119.         {  
  120.             int dataLen;  
  121.             pTcpheader = (TCPHeader *)(recvBuff + sizeof(IPHeader));  
  122.             dataLen = (pIpheader->TotalLength -   
  123.                 (pIpheader->HeaderLength * 4 + pTcpheader->DataOffset * 4));//tcp可能存在扩展  
  124.   
  125.             if (dataLen == 0) break;  
  126.             printf("---------------------TCP---------------------\n");  
  127.             printf("数据包序号 : %d\n", pCount);  
  128.             printf("数据包大小 : %d\n", dataLen);  
  129.             printf("源IP地址   :%s\n", sourceIP);  
  130.               
  131.               
  132.             printf("源端口     :%d\n", ntohs(pTcpheader->SourcePort));  
  133.             printf("目地ip地址 :%s\n", destIP);  
  134.             printf("目的端口   :%d\n", ntohs(pTcpheader->DestinationPort));  
  135.             printf(" IP头部大小:%d\n", pIpheader->HeaderLength * 4);  
  136.             printf("TCP头部大小:%d\n", (pTcpheader->DataOffset) * 4);  
  137.             Sleep(1000);  
  138.             pCount++;  
  139.         }  
  140.           
  141.           
  142.         if (pIpheader->Protocol == IPPROTO_UDP) //数据包使用UDP  
  143.         {  
  144.             pUdpheader = (UDPHeader *)(recvBuff + sizeof(IPHeader));  
  145.             int dataLen;  
  146.             dataLen = (pIpheader->TotalLength -   
  147.                 (pIpheader->HeaderLength * 4 + sizeof(UDPHeader)));//udp首部并没有扩展  
  148.             if (dataLen == 0) break;  
  149.             printf("---------------------UDP--------------------\n");  
  150.             printf("数据包序号 : %d\n", pCount);  
  151.             printf("数据包大小 : %d\n", dataLen);  
  152.               
  153.             printf("源IP地址   :%s\n", sourceIP);  
  154.             printf("源端口     :%d\n", ntohs(pUdpheader->SourcePort));  
  155.             printf("目的IP地址 :%s\n", destIP);  
  156.             printf("目的端口   :%d\n", ntohs(pUdpheader->DestinationPort));  
  157.             printf("IP头部大小 :%d\n", (pIpheader->HeaderLength)* 4);  
  158.             printf("UDP头部大小:%d\n"sizeof(UDPHeader));  
  159.             Sleep(1000);//如果不休眠一下的话,速度会非常的快!  
  160.             pCount++;  
  161.         }  
  162.           
  163.           
  164.     }  
  165.     system("pause");  
  166. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值