#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment (lib,"ws2_32.lib")
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
struct IPHEAD
{
unsigned char h_len:4;//4位首部长度+4位IP版本号
unsigned char ver:4;
unsigned char tos;//8位服务类型TOS
unsigned short total_len;//16位总长度(字节)
unsigned short ident;//16位标识
unsigned short frag_and_flags;//3位标志位
unsigned char ttl;//8位生存时间 TTL
unsigned char proto;//8位协议 (TCP, UDP 或其他)
unsigned short checksum;//16位IP首部校验和
unsigned int sourceip;//32位源IP地址
unsigned int destip;//32位目的IP地址
};
struct TCPHEAD //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
};
char *phostlist[10];//列举主机网卡的数组
DWORD _stdcall listen(void *p)
{
SOCKET s;
struct sockaddr_in addr;
int itimeout=1000;
int ret;
char cbuf[1500];//接收数据缓冲区
struct IPHEAD *piphd;//定义IP头结构
struct TCPHEAD *ptcphd;//定义TCP头结构
s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW); //创建一个原始套接字
setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char*)&itimeout,sizeof(itimeout));
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=inet_addr((char *)p);
addr.sin_port=htons(6000);//设置本地端口号
bind(s,(struct sockaddr *)&addr,sizeof(addr));//绑定端口
//设置sock_raw为sio_rcvall,以便接收所有IP包
DWORD dwin=1;
DWORD dwout[10];
DWORD dwret;
WSAIoctl(s,SIO_RCVALL,&dwin,sizeof(dwin),&dwout,sizeof(dwout),&dwret,NULL,NULL);
for(;;)
{
ret=recv(s,cbuf,sizeof(cbuf),0);//接收数据
if(ret==SOCKET_ERROR)
{
if(WSAGetLastError()==WSAETIMEDOUT)continue;
closesocket(s);
return 0;
}
piphd=(struct IPHEAD *)cbuf;//取得IP头数据的地址
int iIphLen = sizeof(unsigned long) * (piphd->h_len & 0xf);
ptcphd=(struct TCPHEAD *)(cbuf+iIphLen);//取得TCP头数据的地址
printf("From : %s \t port %d\t",inet_ntoa(*(struct in_addr*)&piphd->sourceip),ntohs(ptcphd->th_sport) );
printf("To : %s \t port %d ",inet_ntoa(*(struct in_addr*)&piphd->destip),ntohs(ptcphd->th_dport));
switch(piphd->proto)//根据IP头的协议判断数据包协议类型
{
case 1:
printf("ICMP\n");
break;
case 2:
printf("IGMP\n");
break;
case 6:
printf("TCP\n");
break;
case 17:
printf("UDP\n");
break;
default:
printf("unknow:%d\n",piphd->proto);
}
}
return 1;
}
void main()
{
//初始化sock
WSADATA wsa;
int i=0;
DWORD dwtid;
char chname[128];
hostent *host;
WSAStartup(MAKEWORD(2,1),&wsa);
gethostname(chname,sizeof(chname));
host=gethostbyname(chname);
while(host->h_addr_list[i]!=NULL)//取所有网卡序号,为每个网卡开启一个监听线程
{
phostlist[i]=(char *)malloc(16);
sprintf(phostlist[i],"%s",inet_ntoa(*(struct in_addr *)host->h_addr_list[i]));
printf("Bind to %s\n",phostlist[i]);
CreateThread(NULL,0,listen,phostlist[i],0,&dwtid);
i++;
}
for(;;)//为每个网卡创建监听线程后要用一个循环防止主线程退出
{
Sleep(10);
}
}
分享到:
相关推荐
VC++实现网络嗅探器.pdf
VC++编程实现网络嗅探器 sniffer 的源代码
用vc++写的一个嗅探器.使用WinPcap开发包,嗅探流过网卡的数据并智能分析过滤,快速找到所需要的网络信息。
VC++网络嗅探器源码,VC++网络嗅探器源码
由VC++实现的简单的网络包捕抓并分析,供初学者学习
在调试状态下,在Output窗口中输出监测信息,监测局域网信息
根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就给出一个简单的示例,该示例可以捕获到所有经过本地网卡的数据包,并可从中分析出协议、IP源地址、IP目标地址、TCP源端口号、TCP目标端口号以及数据包...
本程序我花了一个月的时间做的,就是嗅探器,用处很大啊,让出来给大家
VC++编程实现网络嗅探器[总结].pdf
VC++网络嗅探器的设计与实现(源代码及全套资料)
vc6.0 做的网络嗅探器 有脚详细的注释,书菜鸟级别。 是可以运行的,不是网上的那种编译没为题但不能运行的那种
使用VC++开发的一个Sniff网络嗅探器,可查看网口通信数据,不过Win7系统运行会有权限问题,编译程序后,需要组件然后右键以管理员身份运行。
Socket实现网络嗅探器 代码 VC++2010
基于winpcap网络嗅探器 VC++源码+说明文档资料 实验内容 开发出一个 Windows 平台上的网络嗅探工具,能显示所捕获的数据包,并能 做相应的分析和统计。主要内容如下: 1、列出监测主机的所有网卡,选择一个网卡,...
首先分析网络嗅探器,研究数据包在网络上的传播形式,网络嗅探器的工作原理,对于目前普遍的网络嗅探器来说,大多数采用的是VC++技术开发,同时利用了Winsock的技术实现了网络入侵检测的功能,是一款基于编程技术的...
本文首先分析网络嗅探器,研究数据包在网络上的传播形式,网络嗅探器的工作原理,对于目前普遍的网络嗅探器来说,大多数采用的是VC++技术开发,同时利用了Winsock的技术实现了网络入侵检测的功能,是一款基于编程...
Socket实现网络嗅探器 代码 VC++2010
VC++编程实现网络嗅探器在调试状态下,在Output窗口中输出监测信息,监测局域网信息