//sniffer.h
- #ifndef _H_SINIFERR_H_
- #define _H_SINIFERR_H_
-
- #include <winsock2.h>
-
- typedef struct IP_HEADER
- {
- u_char hl:4,
- version:4;
- u_char tos;
- u_short length;
- u_short id;
- u_short fragment;
- u_char TTL;
- u_char protocol;
- u_short chksum;
- IN_ADDR source;
- IN_ADDR dest;
-
- }IP_HEADER;
-
- char* IPv4_Protocal[103]={
- "Reserved",
- "ICMP",
- "IGMP",
- "GGP",
- "IP",
- "ST",
- "TCP",
- "UCL",
- "EGP",
- "IGP",
- "BBN-RCC-MON",
- "NVP-II",
- "PUP",
- "ARGUS",
- "EMCON",
- "XNET",
- "CHAOS",
- "UDP",
- "MUX",
- "DCN-MEAS",
- "HMP",
- "PRM",
- "XNS-IDP",
- "TRUNK-1",
- "TRUNK-2",
- "LEAF-1",
- "LEAF-2",
- "RDP",
- "IRTP",
- "ISO-TP4",
- "NETBLT",
- "MFE-NSP",
- "MERIT-INP",
- "SEP",
- "3PC",
- "IDPR",
- "XTP",
- "DDP",
- "IDPR-CMTP",
- "TP++",
- "IL",
- "SIP",
- "SDRP",
- "SIP-SR",
- "SIP-FRAG",
- "IDRP",
- "RSVP",
- "GRE",
- "MHRP",
- "BNA",
- "SIPP-ESP",
- "SIPP-AH",
- "I-NLSP",
- "SWIPE",
- "NHRP",
- "Unassigned",
- "Unassigned",
- "Unassigned",
- "ICMPv6",
- "Unassigned",
- "Unassigned",
- "61",
- "CFTP",
- "63",
- "SAT-EXPAK",
- "KRYPTOLAN",
- "RVD",
- "IPPC",
- "68",
- "SAT-MON",
- "VISA",
- "IPCV",
- "CPNX",
- "CPHB",
- "WSN",
- "PVP",
- "BR-SAT-MON",
- "SUN-ND",
- "WB-MON",
- "WB-EXPAK",
- "ISO-IP",
- "VMTP",
- "SECURE-VMTP",
- "VINES",
- "TTP",
- "NSFNET-IGP",
- "DGP",
- "TCF",
- "IGRP",
- "OSPFIGP",
- "Sprite-RPC",
- "LARP",
- "MTP",
- "AX.25",
- "IPIP",
- "MICP",
- "SCC-SP",
- "ETHERIP",
- "ENCAP",
- "99",
- "GMTP",
- "Unassigned",
- "Reserved"};
-
- #endif
////main.c
- #include "sniffer.h"
- #include <stdio.h>
- #include <string.h>
- #include <Mstcpip.h>//#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
-
- int main()
- {
- char hostname[100];
- HOSTENT *local;
-
-
- WSADATA WsaData;
- WORD wVersionRequested;
- SOCKET Sock;
- SOCKADDR_IN SockAddr;
-
-
- DWORD dwInBuffer=1;
- DWORD dwBytesReturned=0;
-
- char Buffer[65536];
- IP_HEADER *IpHdr;
- int Ret;
- int Cnt=0;
-
-
- u_short off;
- u_char Version;
- u_char IHL;
- u_char TypeOfSev;
- u_short TotalLen;
- u_short Identification;
- u_short Flag;
- u_short FragmentOffset;
- u_char TimeToLive;
- u_char Protocal;
- u_short HeaderChk;
- char SrcAddr[16];
- char DesAddr[16];
- FILE *File=NULL;
-
-
- wVersionRequested=MAKEWORD(2,2);
- Ret=WSAStartup(wVersionRequested,&WsaData);
- if(Ret!=0)
- {
- printf("初始化socket库失败:%d\n",WSAGetLastError());
- goto over;
- }
- else
- printf("初始化socket库成功!\n");
-
- printf("\n====================================\n");
-
- if (gethostname(hostname, sizeof(hostname)) == SOCKET_ERROR)
- {
- printf("获取主机名出错 : %d",WSAGetLastError());
- return -1;
- }
- else
- printf("主机名:%s \n",hostname);
-
-
- local=gethostbyname(hostname);
- if(local==NULL)
- {
- printf("获取主机IP出错 : %d\n",WSAGetLastError());
- return -1;
- }
- else
- {
- printf("获取主机IP有: \n");
- for(Ret=0;local->h_addr_list[Ret]!=0;Ret++)
- printf("IP%d:%s\n",Ret,inet_ntoa( *(IN_ADDR*)local->h_addr_list[Ret]));
- }
- printf("====================================\n\n");
-
- Sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
- if(Sock==INVALID_SOCKET)
- {
- printf("创建RAW socket失败:%d\n",WSAGetLastError());
- goto over;
- }
- else
- printf("创建RAW socket成功!\n");
-
-
-
-
- memcpy(&SockAddr.sin_addr.S_un.S_addr,local->h_addr_list[0],
- sizeof(SockAddr.sin_addr.S_un.S_addr));
- SockAddr.sin_family=AF_INET;
- SockAddr.sin_port=htons(10000);
-
- Ret=bind(Sock,(PSOCKADDR_IN)&SockAddr,sizeof(SockAddr));
- if(Ret!=0)
- {
- printf("绑定socket失败:%d\n",WSAGetLastError());
- goto over;
- }
- else
- printf("绑定socket成功!\n");
-
- Ret=WSAIoctl(Sock,SIO_RCVALL,&dwInBuffer,sizeof(dwInBuffer)
- ,NULL,0,&dwBytesReturned,NULL,NULL);
- if(Ret!=0)
- {
- printf("设置socket失败!:%d\n",WSAGetLastError());
- goto over;
- }
- else
- printf("设置socket成功!\n");
-
-
- File=fopen("Output.txt","a+");
- if(File==NULL)
- goto over;
-
- while(1)
- {
- Ret=recv(Sock,Buffer,65535,0);
- if(Ret>0)
- {
- Cnt++;
- IpHdr=(IP_HEADER*)Buffer;
-
- Version=IpHdr->version;
-
- IHL=IpHdr->hl;
-
- TypeOfSev=IpHdr->tos;
-
- TotalLen=ntohs(IpHdr->length);
-
- Identification=ntohs(IpHdr->id);
-
- off=ntohs(IpHdr->fragment);
- off&=0XE000;
- Flag=off>>13;
-
- off=ntohs(IpHdr->fragment);
- off&=0X1FFF;
- FragmentOffset=off;
-
- TimeToLive=IpHdr->TTL;
-
- Protocal=IpHdr->protocol;
- if(Protocal>102)
- Protocal=102;
-
- HeaderChk=ntohs(IpHdr->chksum);
-
- memset(SrcAddr,0,16);
- memset(DesAddr,0,16);
- strcpy(SrcAddr,inet_ntoa(IpHdr->source));
- strcpy(DesAddr,inet_ntoa(IpHdr->dest));
-
- printf("\n=================%d================\n",Cnt);
- printf(" 版本:IPv%d\n",Version);
- printf(" 头部长度:%d\n",IHL);
- printf(" 服务类型:%d\n",TypeOfSev);
- printf(" 包长:%d\n",TotalLen);
- printf(" 标识:%d\n",Identification);
- printf(" 标志:%d\n",Flag);
- printf(" 分段:%d\n",FragmentOffset);
- printf(" 生存期:%d\n",TimeToLive);
- printf("下一个头的协议:%s\n",IPv4_Protocal[Protocal]);
- printf(" 检验和:%d\n",HeaderChk);
- printf(" 源地址:%s\n",SrcAddr);
- printf(" 目的地址:%s\n",DesAddr);
- printf("====================================\n");
- if(Protocal==6||Protocal==17)
- {
- fprintf(File,"\n=================%d================\n",Cnt);
- fprintf(File," 版本:IPv%d\n",Version);
- fprintf(File," 头部长度:%d\n",IHL);
- fprintf(File," 服务类型:%d\n",TypeOfSev);
- fprintf(File," 包长:%d\n",TotalLen);
- fprintf(File," 标识:%d\n",Identification);
- fprintf(File," 标志:%d\n",Flag);
- fprintf(File," 分段:%d\n",FragmentOffset);
- fprintf(File," 生存期:%d\n",TimeToLive);
- fprintf(File,"下一个头的协议:%s\n",IPv4_Protocal[Protocal]);
- fprintf(File," 检验和:%d\n",HeaderChk);
- fprintf(File," 源地址:%s\n",SrcAddr);
- fprintf(File," 目的地址:%s\n",DesAddr);
- fprintf(File,"====================================\n");
- }
- }
- }
-
- over:
- if(Sock)
- closesocket(Sock);
- if(File)
- fclose(File);
- WSACleanup();
-
- return 0;
- }
(chenjily) |