項目需求,需要從鏈路層抓包,分析實現(xiàn)網絡登錄認證功能,現(xiàn)在網上找到兩個不錯的抓包程序,參考此文章,順利完成任務,現(xiàn)將此文章收藏與此,便參考,同時感謝文章版主,謝謝!
一:抓包分析:http://blog.csdn.net/aaa6695798/archive/2009/03/20/4008322.aspx
二:原始套接字抓包分析
原始套接字的創(chuàng)建
#include <stdio.h>
#include <net/ethernet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <string.h>
#include <net/if.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
int analyData(char *data);
int rawSocket();
int setPromisc(char *,int *);
int count=0;
int main(int argc,char **argv)
{
if(argc!=2)
{
perror("please enter the ecterface");
exit(1);
}
int sock;
int msgsock;
struct sockaddr_in rcvaddr;
char buf[9216];
struct ifreq ifr;
int len;
int rval;
sock=rawSocket();
setPromisc(argv[1],&sock);
len=sizeof(struct sockaddr);
memset(buf,0,sizeof(buf));
while(1)
{
rval=recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr*)&rcvaddr,&len);
if(rval>0)
{
printf("Get %d bytes/n",rval);
analyData(buf);
}
}
return 0;
}
int analyData(char *data)
{
struct iphdr *ip;
struct tcphdr *tcp;
struct ether_header *ether;
// ether=(struct ether_header*)data;//若數(shù)據(jù)是從數(shù)據(jù)鏈路曾抓取的,那么就有這個以太網幀頭
// printf("shu ju bao lei xing xie yi:%d/n",ether->ether_type);
// ip=(struct iphdr*)(data+sizeof(struct ether_header));
ip=(struct iphdr*)data;
count++;
printf("Protocol::%d/n",ip->protocol);
printf("Source IP::%s/n",inet_ntoa(*((struct in_addr*)&ip->saddr)));
printf("Dest IP::%s/n",inet_ntoa(*((struct in_addr*)&ip->daddr)));
tcp=(struct tcphdr*)(data+sizeof(*ip));
printf("Source Port::%d/n",ntohs(tcp->source));
printf("Dest Port::%d/n",ntohs(tcp->dest));
printf("Already get %d package/n",count);
printf("/n");
return 1;
}
int rawSocket()//創(chuàng)建原始套接字
{
int sock;
sock=socket(PF_INET,SOCK_RAW,IPPROTO_TCP);//IP層抓取
//soket=socket(PF_PACKET,SOCK_RAW,ETH_P_IP)//數(shù)據(jù)鏈路層抓取
if(sock<0)
{
printf("create raw socket failed::%s/n",strerror(errno));
exit(1);
}
printf("raw socket ::%d created successful/n",sock);
return sock;
}
int setPromisc(char *enterface,int *sock)//設置eth0的混亂模式
{
struct ifreq ifr;
strcpy(ifr.ifr_name,"eth0");
ifr.ifr_flags=IFF_UP|IFF_PROMISC|IFF_BROADCAST|IFF_RUNNING;
if(ioctl(*sock,SIOCSIFFLAGS,&ifr)==-1)//設置混亂模式
{
perror("set 'eth0' to promisc model failed/n");
exit(1);
}
printf("set '%s' to promisc successed/n",enterface);
return 1;
}