A!die Software Studio Welcome to A!Die Software Studio

利用 rawsocket 抓包

by adie
2015-08-27 17:03:59
  1. #include <stdio.h>  
  2. #include <winsock2.h>  
  3. #include <mstcpip.h>  
  4.   
  5. void  analyse_package(char* buff, int length)  
  6. {  
  7.     struct _iphdr  
  8.     {  
  9.         unsigned char  h_verlen;        //4位IP版本号+4位首部长度  
  10.         unsigned char  tos;             //8位服务类型TOS  
  11.         unsigned short total_len;       //16位总长度(字节)  
  12.         unsigned short ident;           //16位标识  
  13.         unsigned short frag_and_flags;  //3位标志位+13位分段偏移量  
  14.         unsigned char  ttl;             //8位生存时间 TTL  
  15.         unsigned char  proto;           //8位协议 (TCP, UDP 或其他)  
  16.         unsigned short checksum;        //16位IP首部校验和  
  17.         unsigned int   sourceIP;        //32位源IP地址  
  18.         unsigned int   destIP;          //32位目的IP地址  
  19.     };  
  20.   
  21.     _iphdr* pIPHeader = (_iphdr*)(buff);  
  22.   
  23.   
  24.     //if(pIPHeader->destIP != m_localaddr.sin_addr.s_addr)  
  25.     //  return;  
  26.   
  27.     //if(pIPHeader->sourceIP != m_hostaddr)  
  28.     //  return;  
  29.   
  30.     //if(pIPHeader->proto != IPPROTO_TCP)  
  31.     //  return;  
  32.   
  33.     printf("recv a packet len = %d\n", length);  
  34. }  
  35.   
  36. int main(int argc, char **argv)  
  37. {  
  38.     WSADATA wsaData = { 0 };  
  39.     int nRet = WSAStartup(MAKEWORD(2, 1), &wsaData);  
  40.   
  41.     SOCKET snifferSocket = socket(AF_INET , SOCK_RAW , IPPROTO_IP);  
  42.     if(snifferSocket == INVALID_SOCKET)  
  43.     {  
  44.         printf("Create Raw Sniffer Socket Error: %d\r\n", WSAGetLastError());  
  45.         return 0;  
  46.     }  
  47.   
  48.     sockaddr_in  localaddr;  
  49.     memset(&localaddr, 0, sizeof(localaddr));  
  50.   
  51.     localaddr.sin_family = AF_INET;  
  52.     localaddr.sin_port   = htons(0);  
  53.   
  54.     char hostname[255];  
  55.     if(gethostname(hostname, 255) != 0)  
  56.     {  
  57.         printf("Gethostname Error: %d\r\n", WSAGetLastError());  
  58.         return 0;  
  59.     }  
  60.   
  61.     hostent * pHostent = gethostbyname(hostname);  
  62.     memcpy(&localaddr.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],pHostent->h_length);  
  63.   
  64.     if(bind(snifferSocket, (SOCKADDR*)&localaddr, sizeof(localaddr)))  
  65.     {  
  66.         printf("Bind Error: %d\r\n", WSAGetLastError());  
  67.         return false;  
  68.     }  
  69.   
  70.     DWORD dwBufferLen[10] = { 0 } ;  
  71.     DWORD dwBufferInLen = 1 ;  
  72.     DWORD dwBytesReturned = 0 ;  
  73.     if(WSAIoctl(snifferSocket, SIO_RCVALL, &dwBufferInLen,  
  74.         sizeof(dwBufferInLen),   
  75.         &dwBufferLen,  
  76.         sizeof(dwBufferLen),  
  77.         &dwBytesReturned  
  78.         ,NULL, NULL) != 0)  
  79.     {  
  80.         printf("WSAIoctl Error: %d\r\n", WSAGetLastError());  
  81.         return 0;  
  82.     }  
  83.   
  84.     printf("Sniffer Socket inited.\r\n");  
  85.   
  86.     static const int MAX_PACK_LEN = 65535;  
  87.     static char recvBuffer[MAX_PACK_LEN] = { 0 };  
  88.   
  89.     while(1)  
  90.     {  
  91.         int packLen = recv(snifferSocket, recvBuffer, sizeof(recvBuffer), 0);  
  92.   
  93.         if(packLen == 0)  
  94.         {  
  95.             printf("sniffer socket has been closed\r\n");  
  96.         }  
  97.         else if(packLen == SOCKET_ERROR)  
  98.         {  
  99.             printf("Recv Error: %d\r\n", WSAGetLastError());  
  100.         }  
  101.         else  
  102.         {  
  103.             analyse_package(recvBuffer, packLen);  
  104.         }  
  105.     }  
  106.   
  107.     return 0;  
  108. }  

▲评论

X 正在回复:
姓 名: 留下更多信息
性 别:
邮 件:
主 页:
Q Q:
来 自:
职 业:
评 论:
验 证:


Valid HTML 4.01 Strict Valid CSS!
Copyleft.A!die Software Studio.ADSS
Power by webmaster@adintr.com