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);
}
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
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";