Board logo

±êÌâ: Ò»¸öLinuxÏÂ×¥°üÈí¼þ(Ô´Âë) [´òÓ¡±¾Ò³]

×÷Õß: Nothing    ʱ¼ä: 2008-1-8 09:53     ±êÌâ: Ò»¸öLinuxÏÂ×¥°üÈí¼þ(Ô´Âë)

//ÓмǼ¼¸ÖÖ¹¥»÷µÄ¹¦ÄÜ£¬¾ßÌåʲô¹¥»÷¿´Á˳ÌÐò¾ÍÖªµÀÁË¡££º£©

//myxray.c V0.2

#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <signal.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <netinet/ip_icmp.h>
#include <time.h>
#include <netinet/igmp.h>
#define __FAVOR_BSD
#include <netinet/tcp.h>
#include <netdb.h>
#include <netinet/udp.h>
#define PACKET_SIZE 4096
#define ETH_HW_ADDR_LEN 6
#define IP_ADDR_LEN 4
#define LOWCOUNTER 10
#define MAX(a,b) ((a)>(b)?(a):(b))
struct arp_packet
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡u_char targ_hw_addr[ETH_HW_ADDR_LEN];
¡¡¡¡¡¡¡¡u_char src_hw_addr[ETH_HW_ADDR_LEN];
¡¡¡¡¡¡¡¡u_short frame_type;
¡¡¡¡¡¡¡¡u_short hw_type;
¡¡¡¡¡¡¡¡u_short prot_type;
¡¡¡¡¡¡¡¡u_char hw_addr_size;
¡¡¡¡¡¡¡¡u_char prot_addr_size;
¡¡¡¡¡¡¡¡u_short op;
¡¡¡¡¡¡¡¡u_char sndr_hw_addr[ETH_HW_ADDR_LEN];
¡¡¡¡¡¡¡¡u_char sndr_ip_addr[IP_ADDR_LEN];
¡¡¡¡¡¡¡¡u_char rcpt_hw_addr[ETH_HW_ADDR_LEN];
¡¡¡¡¡¡¡¡u_char rcpt_ip_addr[IP_ADDR_LEN];
¡¡¡¡¡¡¡¡u_char padding[18];
¡¡¡¡¡¡¡¡} ;
void leave();
char * hwaddr (unsigned char¡¡*,char *);
void writearpbuf(FILE *,char *,int);//дһ¸öarpbufµ½fdÖÐ

void writetcpbuf(FILE *,char *,int);
void writeudpbuf(FILE *,char *,int);
void writeigmpbuf(FILE *,char *,int);
void writeicmpbuf(FILE *,char *,int);

int fd_recv = -1 ;
time_t one,two,temptime;
char arpbufone[PACKET_SIZE];
char tcpbufone[PACKET_SIZE];
char udpbufone[PACKET_SIZE];
char igmpbufone[PACKET_SIZE];
char icmpbufone[PACKET_SIZE];
int arpcounter=0,tcpcounter=0,igmpcounter=0,icmpcounter=0,udpcounter=0;
char writebuf[PACKET_SIZE];
FILE * waringfd;
unsigned int total=0,totalarp=0,disarp=0,totaltcp=0,distcp=0,
totaludp=0,disudp=0,totalicmp=0,disicmp=0,totaligmp=0,disigmp=0;
struct ifreq ifr,ifr_old;

main(int argc, char *argv[])
{
char device[] = "eth0"; // ethernet device name

char protocol[16];
u_char buf_recv[PACKET_SIZE]; // buffer for receive

int ihl;
int ethprotol;
int ipfragoff,df,mf;
int protol;
char buf1[20],buf2[20],buf3[20],buf4[20];
char strptr[255];
char *srcaddr,*dstaddr;
struct ethhdr *eth ;
struct arp_packet *arphead;
struct udphdr *udp;
struct icmp *icmphdr;
struct iphdr * ip;
struct tcphdr * tcp1;
char *flagsmes;
int flags;
struct igmp * igmp1;
struct in_addr in1;
struct in_addr in2;
int from_len, datalen;
struct sockaddr from;
int arpenable=0;
int tcpenable=0;
int icmpenable=0;
int igmpenable=0;
int loenable=0;
int udpenable=0;
char *tcpflag=NULL;
int c;
char *dstip=NULL;
char *srcip=NULL;
extern char *optarg;
extern int optind;
const char
message[]=
"-a
display arp packet
-t
display tcp packet
-f¡¡¡¡¡¡one of RST FIN SYN PUSH ACK URG
display only tcpflag tcp packet
-u
display udp packet
-i
display icmp packet
-g
display igmp packet
-A
display all packet
-l
also display lo layer packet
-s srcip
display srcip packet
-d dstip
display dstip packet
Welcome to use myxray which writed by sztcww Good Luck"
;

if (argc==1) {
printf("%s\n",message);
exit(-1);
}

while ((c = getopt(argc, argv, "Aatugil?s:d:f:")) != EOF)
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ switch (c) {
¡¡¡¡¡¡¡¡case 'A':
¡¡ tcpenable=1;
¡¡ udpenable=1;
¡¡ icmpenable=1;
¡¡ igmpenable=1;
¡¡ arpenable=1;
¡¡ break;
case 'd':
¡¡ dstip=optarg;
break;
¡¡¡¡¡¡¡¡case 's':
srcip=optarg;
break;
¡¡¡¡¡¡¡¡case 'f':
tcpflag=optarg;
break;
case 'a':
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ arpenable=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ break;
¡¡¡¡¡¡¡¡case 't':
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ tcpenable=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ break;
¡¡¡¡¡¡ case 'i':
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ icmpenable=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ break;
¡¡¡¡¡¡ case 'g':
igmpenable=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ break;
¡¡¡¡¡¡ case 'u':
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ udpenable=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ break;
¡¡¡¡¡¡ case 'l':
loenable=1;
break;
¡¡¡¡¡¡ case '?':
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ printf("%s\n",message);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ exit(-1);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ }

if ( (waringfd=fopen("myxray.waring","a+"))==NULL)
{
perror("fopen");
exit(-1);
}
fd_recv = socket(AF_INET, SOCK_PACKET, htons(0x0003));
if (fd_recv < 0) { perror( "packet socket error"); exit(-1); }
strcpy(ifr.ifr_name, device);
if (ioctl(fd_recv, SIOCGIFFLAGS, &ifr) < 0 )
{
¡¡ perror("ioctl SIOCGIFFLAGS error");
¡¡ if (fd_recv >= 0) close(fd_recv);
¡¡ exit(-1);
}
ifr_old = ifr;
ifr.ifr_flags |= IFF_PROMISC;
if (ioctl(fd_recv, SIOCSIFFLAGS, &ifr) < 0 )
{
¡¡ perror("ioctl SIOCSIFFLAGS error");
¡¡ if (fd_recv >= 0) close(fd_recv);
¡¡ exit(-1);
}

signal(SIGINT, leave);
signal(SIGTERM, leave);

one=time(NULL);
AGAIN:
bzero(&from, sizeof(from));
from_len = sizeof(from);
bzero(buf_recv, PACKET_SIZE);
datalen = recvfrom(fd_recv, (char *)buf_recv, 4096, 0,&from, &from_len);
if (datalen < 0)
{
perror("recvfrom error");
¡¡ exit(-1);
}
total++;
buf_recv[datalen] = '\0';
if (loenable==0)
if (strcmp(device, from.sa_data) != 0) goto AGAIN;
eth=(struct ethhdr *)buf_recv;
ethprotol=ntohs(eth->h_proto);
if (ethprotol==0x0806)
{
arphead=(struct arp_packet *)buf_recv;
¡¡¡¡¡¡¡¡memcpy(&in1,arphead->sndr_ip_addr, IP_ADDR_LEN);
¡¡¡¡¡¡¡¡memcpy(&in2,arphead->rcpt_ip_addr, IP_ADDR_LEN);
¡¡¡¡¡¡¡¡srcaddr=inet_ntoa(in1);
¡¡¡¡¡¡¡¡dstaddr=(char*)inet_ntop(AF_INET,&in2,strptr,sizeof(strptr));

totalarp++;

¡¡¡¡¡¡ if ( (!memcmp(srcaddr,dstaddr,MAX(strlen(srcaddr),strlen(dstaddr))))&&
(memcmp(hwaddr(arphead->rcpt_hw_addr,buf1),"00:00:00:00:00:00",17)) )
¡¡writearpbuf(waringfd,buf_recv,1);
/*¼Í¼arp°üÖÐsrcaddr,dstaddrÏàͬµÄÊý¾Ý°ü*/
else
{
if ( memcmp(buf_recv,arpbufone,datalen)==0 ) arpcounter++;
else
{
if¡¡(arpcounter>LOWCOUNTER)
/*¼Í¼Á¬Ðø×¥µ½µÄ,arpcounter>LOWCOUNTERµÄarp°ü */
¡¡ {
writearpbuf(waringfd,arpbufone,arpcounter+1);
}
memcpy(arpbufone,buf_recv,datalen);
arpcounter=0;
}//end else

}//end else

}
if ((ethprotol==0x0806)&&(arpenable))
{//arp

if ( ( (dstip==NULL)||(strcmp(dstaddr,dstip)==0) )&&
((srcip==NULL)||(strcmp(srcaddr,srcip)==0) ) )
¡¡¡¡¡¡ {
temptime=time(NULL);
¡¡ printf("Recorded %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH\n",
¡¡ ctime(&temptime),hwaddr(eth->h_source,buf1),hwaddr(eth->h_dest,buf2),ethprotol);
¡¡ printf("arphdr\nhwtype:%d protol:%xH hw_size:%d pro_size:%d op:%d\ns_ha:% s s_ip:%s\nd_ha:%s d_ip:%s\n",
ntohs(arphead->hw_type),ntohs(arphead->prot_type),
arphead->hw_addr_size, arphead->prot_addr_size,
ntohs(arphead->op), hwaddr(arphead->sndr_hw_addr,buf1),
srcaddr, hwaddr(arphead->rcpt_hw_addr,buf2),dstaddr);
¡¡ printf("-----------------------------------------------------------\n");
disarp++;
¡¡ }
¡¡ goto AGAIN;
}//end arp


if (ethprotol==0x0800)
{//ip

ip = (struct iphdr *)&buf_recv[14];
¡¡ ihl = (int)ip->ihl << 2;
in1.s_addr = ip->saddr;
¡¡ in2.s_addr = ip->daddr;
¡¡ srcaddr=inet_ntoa(in1);
dstaddr=(char *)inet_ntop(AF_INET,&in2,strptr,sizeof(strptr));
¡¡ //iphdr

¡¡ protol=ip->protocol;
¡¡ ipfragoff=ntohs(ip->frag_off);
¡¡ df=ipfragoff&IP_DF;
¡¡ mf=ipfragoff&IP_MF;
¡¡¡¡ if (df!=0) df=1;
¡¡ if (mf!=0) mf=1;

¡¡ protol=ip->protocol;

switch (protol)
{
case 6 :totaltcp++;
¡¡ tcp1 = (struct tcphdr *)&buf_recv[14 + ihl];
¡¡ flags= tcp1->th_flags;
¡¡ if (flags&TH_PUSH) flagsmes="PUSH";
¡¡ if (flags&TH_ACK) flagsmes="ACK";
¡¡ if (flags&TH_URG) flagsmes="URG";
¡¡ if (flags&TH_FIN) flagsmes="FIN";
¡¡ if (flags&TH_SYN) flagsmes="SYN";
¡¡ if (flags&TH_RST) flagsmes="RST";

if ( !memcmp(buf_recv,tcpbufone,datalen))
tcpcounter++;
else
{
if (tcpcounter>LOWCOUNTER)
{
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ writetcpbuf(waringfd,tcpbufone,tcpcounter);
}
tcpcounter=0;
memcpy(tcpbufone,buf_recv,datalen);
¡¡¡¡¡¡¡¡ }
break;
case 1 : totalicmp++;
¡¡¡¡ icmphdr=(struct icmp *)&buf_recv[14 + ihl];
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ if (!memcmp(buf_recv,icmpbufone,datalen))
icmpcounter++;
else
{
if (icmpcounter>LOWCOUNTER)
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡¡¡¡¡¡¡{
writeicmpbuf(waringfd,icmpbufone,icmpcounter);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ }
icmpcounter=0;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ memcpy(icmpbufone,buf_recv,datalen);
}
break;
case 17:totaludp++;
¡¡ udp= (struct udphdr *)&buf_recv[14 + ihl];
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if ( !memcmp(buf_recv,udpbufone,datalen))
udpcounter++;
else
{
¡¡¡¡ if (udpcounter>LOWCOUNTER)
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ {
¡¡¡¡¡¡¡¡¡¡writeudpbuf(waringfd,udpbufone,udpcounter);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡ udpcounter=0;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ memcpy(udpbufone,buf_recv,datalen);
}
break;
case 2 :totaligmp++;
¡¡ ¡¡¡¡¡¡ igmp1=(struct igmp *)&buf_recv[14+ihl];
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ if (!memcmp(inet_ntoa(igmp1->igmp_group),"0.0.0.0",7))
writeigmpbuf(waringfd,buf_recv,1);
else
{
¡¡ if (!memcmp(buf_recv,igmpbufone,datalen))
igmpcounter++;
¡¡ else
¡¡ {
¡¡¡¡ if (igmpcounter>LOWCOUNTER)
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ {
writeigmpbuf(waringfd,igmpbufone,igmpcounter); }
¡¡¡¡¡¡igmpcounter=0;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡memcpy(igmpbufone,buf_recv,datalen);
¡¡ }
}
break;
}

if (((dstip==NULL)||(strcmp(dstaddr,dstip)==0))&&
((srcip==NULL)||(strcmp(srcaddr,srcip)==0)))
{
if ((protol==6)&&(tcpenable))
{//tcp

¡¡¡¡ if (tcpflag!=NULL)
if (strcmp(tcpflag,flagsmes)) goto AGAIN;
¡¡ //do with ethhdr data

temptime=time(NULL);
¡¡ printf("Recorded %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH\n",
ctime(&temptime),hwaddr(eth->h_source,buf1), hwaddr(eth->h_dest,buf2),
ethprotol);
¡¡ //iphdr

printf("iphdr\nver:%d ihl:%d tos:%d tot_len:%d id:%d df:%d mf:%d fragoff:%d TTL:%d proto:%d\nsrcaddr:%s dstaddr:%s\n",
ip->version,ip->ihl, ip->tos,ntohs(ip->tot_len),
ntohs(ip->id),df,mf,ipfragoff&IP_OFFMASK,ip->ttl,
protol,srcaddr,dstaddr);
¡¡ //tcphdr

¡¡ printf("tcphdr\nsrcport:%d dstport:%d seq:%u ack:%u off:%d flag:%s win:%d\n",
ntohs(tcp1->th_sport),ntohs(tcp1->th_dport),
ntohl(tcp1->th_seq),ntohl(tcp1->th_ack),tcp1->th_off,
flagsmes,ntohs(tcp1->th_win));
printf("-----------------------------------------------------------\n");
distcp++;
¡¡ }//end tcp


if ((protol==1)&&(icmpenable))
{//icmp

temptime=time(NULL);
¡¡ printf("Recorded %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH\n",
ctime(&temptime),hwaddr(eth->h_source,buf1), hwaddr(eth->h_dest,buf2),
ethprotol);
printf("iphdr\nver:%d ihl:%d tos:%d tot_len:%d id:%d df:%d mf:%d fragoff:%d TTL:%d proto:%d\nsrcaddr:%s dstaddr:%s\n",
ip->version,ip->ihl, ip->tos,ntohs(ip->tot_len),
ntohs(ip->id),df,mf,ipfragoff&IP_OFFMASK,ip->ttl,
protol,srcaddr,dstaddr);
¡¡¡¡ printf("icmp\ntype:%d code:%d\n",icmphdr->icmp_type,
icmphdr->icmp_code);
printf("-----------------------------------------------------------\n");
disicmp++;
¡¡ }//end icmp


if ((protol==17)&&(udpenable))
{//udphdr

temptime=time(NULL);
¡¡ printf("Recored %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH\n",
ctime(&temptime),hwaddr(eth->h_source,buf1), hwaddr(eth->h_dest,buf2),
ethprotol);

printf("iphdr\nver:%d ihl:%d tos:%d tot_len:%d id:%d df:%d mf:%d fragoff:%d TTL:%d proto:%d\nsrcaddr:%s dstaddr:%s\n",
ip->version,ip->ihl, ip->tos,ntohs(ip->tot_len),
ntohs(ip->id),df,mf,ipfragoff&IP_OFFMASK,ip->ttl,
protol,srcaddr,dstaddr);

¡¡ printf("udphdr\nsport:%d dsport:%d len:%d\n",
ntohs(udp->uh_sport), ntohs(udp->uh_dport),
ntohs(udp->uh_ulen));
printf("-----------------------------------------------------------\n");
disudp++;
¡¡ }//end udp


if ((protol==2)&&(igmpenable))
{//igmp

temptime=time(NULL);
¡¡ printf("Recored %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH\n",
ctime(&temptime),hwaddr(eth->h_source,buf1), hwaddr(eth->h_dest,buf2),
ethprotol);

printf("iphdr\nver:%d ihl:%d tos:%d tot_len:%d id:%d df:%d mf:%d fragoff:%d TTL:%d proto:%d\nsrcaddr:%s dstaddr:%s\n",
ip->version,ip->ihl, ip->tos,ntohs(ip->tot_len),
ntohs(ip->id),df,mf,ipfragoff&IP_OFFMASK,ip->ttl,
protol,srcaddr,dstaddr);

¡¡ printf("igmphdr\ntype:%d code:%d group_addr:%s\n",
igmp1->igmp_type,igmp1->igmp_code,
inet_ntoa(igmp1->igmp_group));

printf("-----------------------------------------------------------\n");
disigmp++;
}//end igmp

¡¡
fflush(stdout);
} //endif strcmp

}//endif ip


¡¡goto AGAIN;

}//end main


char *
hwaddr (unsigned char * s,char *d)
{
sprintf (d, "%02X:%02X:%02X:%02X:%02X:%02X", s[0], s[1], s[2], s[3],
s[4], s[5]);
return d;
}

void leave()
{
if (ioctl(fd_recv, SIOCSIFFLAGS, &ifr_old) < 0) {
perror("ioctl SIOCSIFFLAGS error");
}
if (fd_recv > 0) close(fd_recv);
two=time(NULL);
fclose(waringfd);
printf("total received %u packets\n",total);
printf("tcp¡¡packets %u, display %u, speed is %u /second\n",totaltcp,distcp,totaltcp/(two-one));
printf("udp¡¡packets %u, display %u, speed is %u /second\n",totaludp,disudp,totaludp/(two-one));
printf("arp¡¡packets %u, display %u, speed is %u /second\n",totalarp,disarp,totalarp/(two-one));
printf("icmp packets %u, display %u, speed is %u /second\n",totalicmp,disicmp,totalicmp/(two-one));
printf("igmp packets %u, display %u, speed is %u /second\n",totaligmp,disigmp,totaligmp/(two-one));

printf("process terminamted.\n");
exit(0);
}

void writearpbuf(FILE * fd,char *p,int counter)
{
struct arp_packet *arphead;
struct in_addr in2,in1;
char *srcaddr,*dstaddr;
time_t temptime;
char strptr[255];
char buf1[20],buf2[20],buf3[20],buf4[20];
int ethprotol;
temptime=time(NULL);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡arphead=(struct arp_packet *)p;
ethprotol=ntohs(arphead->frame_type);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡memcpy(&in1,arphead->sndr_ip_addr, IP_ADDR_LEN);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡memcpy(&in2,arphead->rcpt_ip_addr, IP_ADDR_LEN);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡srcaddr=inet_ntoa(in1);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡dstaddr=(char*)inet_ntop(AF_INET,&in2,strptr,sizeof(strptr));

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡snprintf(writebuf,PACKET_SIZE,"This arp packet catch %d times continuous\nrecorded %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH
arphdr\nhwtype:%d protol:%xH hw_size:%d pro_size:%d op:%d\ns_ha:% s s_ip:%s\nd_ha:%s d_ip:%s
-----------------------------------------------------------\n"
,counter,ctime(&temptime), hwaddr(arphead->src_hw_addr,buf1),hwaddr(arphead->targ_hw_addr,buf2),ethprotol,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ntohs(arphead->hw_type),ntohs(arphead->prot_type),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡arphead->hw_addr_size, arphead->prot_addr_size,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ntohs(arphead->op), hwaddr(arphead->sndr_hw_addr,buf3),¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡srcaddr, hwaddr(arphead->rcpt_hw_addr,buf4),dstaddr);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡fwrite(writebuf,strlen(writebuf),1,fd);

}


void writetcpbuf(FILE * fd,char *p,int counter)
{
struct ethhdr *eth ;
struct iphdr * ip;
struct tcphdr * tcp1;
char *flagsmes;
int flags;
struct in_addr in1,in2;
int ethprotol;
int ihl,df,mf,ipfragoff;
char * srcaddr,*dstaddr;
int protol;
char strptr[255];
char buf1[20],buf2[20];
eth=(struct ethhdr *)p;
ethprotol=ntohs(eth->h_proto);
ip = (struct iphdr *)(p+14);
¡¡¡¡¡¡¡¡ ihl = (int)ip->ihl << 2;
¡¡¡¡¡¡¡¡ in1.s_addr = ip->saddr;
¡¡¡¡¡¡¡¡ in2.s_addr = ip->daddr;
¡¡¡¡¡¡¡¡ srcaddr=inet_ntoa(in1);
¡¡¡¡¡¡ dstaddr=(char *)inet_ntop(AF_INET,&in2,strptr,sizeof(strptr));
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡//iphdr

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡protol=ip->protocol;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ipfragoff=ntohs(ip->frag_off);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡df=ipfragoff&IP_DF;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡mf=ipfragoff&IP_MF;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (df!=0) df=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (mf!=0) mf=1;
¡¡¡¡¡¡¡¡ protol=ip->protocol;
tcp1 = (struct tcphdr *)(p+14 + ihl);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡flags= tcp1->th_flags;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (flags&TH_PUSH)¡¡¡¡¡¡flagsmes="PUSH";
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (flags&TH_ACK)¡¡¡¡¡¡ flagsmes="ACK";
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (flags&TH_URG)¡¡¡¡¡¡ flagsmes="URG";
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (flags&TH_FIN)¡¡¡¡¡¡ flagsmes="FIN";
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (flags&TH_SYN)¡¡¡¡¡¡ flagsmes="SYN";
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (flags&TH_RST)¡¡¡¡¡¡ flagsmes="RST";


temptime=time(NULL);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡snprintf(writebuf,PACKET_SIZE,"This tcp packet catch %d times continuous\nrecorded %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH
iphdr\nver:%d ihl:%d tos:%d tot_len:%d id:%d df:%d mf:%d fragoff:%d TTL:%d proto:%d\nsrcaddr:%s dstaddr:%s
tcphdr\nsrcport:%d dstport:%d seq:%u ack:%u off:%d flag:%s win:%d
-----------------------------------------------------------\n"
,counter+1,ctime(&temptime),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ hwaddr(eth->h_source,buf1), hwaddr(eth->h_dest,buf2),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ethprotol,ip->version,ip->ihl,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ip->tos,ntohs(ip->tot_len), ntohs(ip->id),df,mf,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ipfragoff&IP_OFFMASK,ip->ttl,protol,srcaddr,dstaddr,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ntohs(tcp1->th_sport),ntohs(tcp1->th_dport),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ntohl(tcp1->th_seq),ntohl(tcp1->th_ack),tcp1->th_off,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ flagsmes,ntohs(tcp1->th_win));
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
fwrite(writebuf,strlen(writebuf),1,fd);


}
void writeigmpbuf(FILE *fd,char *p,int counter)
{
struct ethhdr *eth ;
struct iphdr * ip;
struct in_addr in1,in2;
int ethprotol;
int ihl,df,mf,ipfragoff;
char * srcaddr,*dstaddr;
int protol;
char strptr[255];
char buf1[20],buf2[20];
struct igmp * igmp1;

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡eth=(struct ethhdr *)p;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ethprotol=ntohs(eth->h_proto);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ip = (struct iphdr *)(p+14);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ihl = (int)ip->ihl << 2;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡in1.s_addr = ip->saddr;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡in2.s_addr = ip->daddr;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡srcaddr=inet_ntoa(in1);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡dstaddr=(char *)inet_ntop(AF_INET,&in2,strptr,sizeof(strptr));
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡//iphdr

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡protol=ip->protocol;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ipfragoff=ntohs(ip->frag_off);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡df=ipfragoff&IP_DF;
mf=ipfragoff&IP_MF;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (df!=0) df=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (mf!=0) mf=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡protol=ip->protocol;
igmp1=(struct igmp *)(p+14+ihl);

temptime=time(NULL);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡snprintf(writebuf,PACKET_SIZE,"This packet catch %d times continuous\nrecorded %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH
iphdr\nver:%d ihl:%d tos:%d tot_len:%d id:%d df:%d mf:%d fragoff:%d TTL:%d proto:%d\nsrcaddr:%s dstaddr:%s
igmphdr\ntype:%d code:%d group_addr:%s
-----------------------------------------------------------\n"
,counter+1,ctime(&temptime),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ hwaddr(eth->h_source,buf1), hwaddr(eth->h_dest,buf2),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ethprotol,ip->version,ip->ihl,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ip->tos,ntohs(ip->tot_len), ntohs(ip->id),df,mf,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ipfragoff&IP_OFFMASK,ip->ttl,protol,srcaddr,dstaddr,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡igmp1->igmp_type,igmp1->igmp_code,inet_ntoa(igmp1->igmp_group));
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ fwrite(writebuf,strlen(writebuf),1,fd);


}
void writeudpbuf(FILE * fd,char *p,int counter)
{
struct ethhdr *eth ;
struct iphdr * ip;
struct in_addr in1,in2;
int ethprotol;
int ihl,df,mf,ipfragoff;
char * srcaddr,*dstaddr;
int protol;
char strptr[255];
char buf1[20],buf2[20];
struct udphdr *udp;

eth=(struct ethhdr *)p;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ethprotol=ntohs(eth->h_proto);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ip = (struct iphdr *)(p+14);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ihl = (int)ip->ihl << 2;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡in1.s_addr = ip->saddr;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡in2.s_addr = ip->daddr;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡srcaddr=inet_ntoa(in1);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡dstaddr=(char *)inet_ntop(AF_INET,&in2,strptr,sizeof(strptr));
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡//iphdr

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡protol=ip->protocol;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ipfragoff=ntohs(ip->frag_off);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡df=ipfragoff&IP_DF;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡mf=ipfragoff&IP_MF;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (df!=0) df=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (mf!=0) mf=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡protol=ip->protocol;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡udp= (struct udphdr *)(p+14 + ihl);

temptime=time(NULL);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡snprintf(writebuf,PACKET_SIZE,"This udp packet catch %d times continuous\nrecorded %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH
iphdr\nver:%d ihl:%d tos:%d tot_len:%d id:%d df:%d mf:%d fragoff:%d TTL:%d proto:%d\nsrcaddr:%s dstaddr:%s
udphdr\nsport:%d dsport:%d len:%d
-----------------------------------------------------------\n"
,counter+1,ctime(&temptime),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡hwaddr(eth->h_source,buf1), hwaddr(eth->h_dest,buf2),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ethprotol,ip->version,ip->ihl,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ip->tos,ntohs(ip->tot_len), ntohs(ip->id),df,mf,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ipfragoff&IP_OFFMASK,ip->ttl,protol,srcaddr,dstaddr,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ntohs(udp->uh_sport), ntohs(udp->uh_dport),ntohs(udp->uh_ulen));
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
fwrite(writebuf,strlen(writebuf),1,fd);

}

void writeicmpbuf(FILE * fd,char *p,int counter)
{
struct ethhdr *eth ;
struct iphdr * ip;
struct in_addr in1,in2;
int ethprotol;
int ihl,df,mf,ipfragoff;
char * srcaddr,*dstaddr;
int protol;
char strptr[255];
char buf1[20],buf2[20];
struct icmp *icmphdr;
¡¡¡¡¡¡¡¡¡¡eth=(struct ethhdr *)p;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ethprotol=ntohs(eth->h_proto);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ip = (struct iphdr *)(p+14);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ihl = (int)ip->ihl << 2;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡in1.s_addr = ip->saddr;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡in2.s_addr = ip->daddr;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡srcaddr=inet_ntoa(in1);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡dstaddr=(char *)inet_ntop(AF_INET,&in2,strptr,sizeof(strptr));
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡//iphdr

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡protol=ip->protocol;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ipfragoff=ntohs(ip->frag_off);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡df=ipfragoff&IP_DF;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡mf=ipfragoff&IP_MF;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (df!=0) df=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (mf!=0) mf=1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡protol=ip->protocol;
icmphdr=(struct icmp *)(p+14 + ihl);

temptime=time(NULL);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡snprintf(writebuf,PACKET_SIZE,"This icmp packet catch %d times continuous\nrecorded %sethhdr\nsrchw:%s--->dsthw:%s proto:%xH
iphdr\nver:%d ihl:%d tos:%d tot_len:%d id:%d df:%d mf:%d fragoff:%d TTL:%d proto:%d\nsrcaddr:%s dstaddr:%s
icmp\ntype:%d code:%d
-----------------------------------------------------------\n"
,counter+1,ctime(&temptime),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡hwaddr(eth->h_source,buf1), hwaddr(eth->h_dest,buf2),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ethprotol,ip->version,ip->ihl,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ip->tos,ntohs(ip->tot_len), ntohs(ip->id),df,mf,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ipfragoff&IP_OFFMASK,ip->ttl,protol,srcaddr,dstaddr,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡icmphdr->icmp_type,icmphdr->icmp_code);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡fwrite(writebuf,strlen(writebuf),1,fd);






»¶Ó­¹âÁÙ ±à³Ì¿ª·¢ÂÛ̳ (http://bbs.lihuasoft.net/) Powered by Discuz! 6.0.0