|| Author: Psyco_Rabbit/EOF || Back to sources || View project folder ||
/*************************************************************************** * Copyright (C) 14/09/2006 by Psyco_Rabbit * * PsycoRabbit@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the Berkeley Software Distribution (BSD) * * license. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY. * * * ***************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <netinet/udp.h> #include <time.h> #define MAX_LEN 1024*8 //packet's lenght void print_tcp_ip(struct iphdr * ip_,struct tcphdr * tcp_,char *buffer_){ struct sockaddr_in addr; printf("-- IP HEADER --\n"); printf("Header lenght: %d bytes\n",ip_->ihl*4); printf("Version: %d\n",ip_->version); printf("Priorità : %d\n",ip_->tos); printf("Packet lenght: %d bytes\n",ntohs(ip_->tot_len)); printf("ID: %d\n",ntohs(ip_->id)); printf("Offset: %d\n",ip_->frag_off); printf("Time to live: %d\n",ip_->ttl); printf("Protocol: %d\n",ip_->protocol); printf("Checksum: %d\n",ip_->check); addr.sin_addr.s_addr=ip_->saddr; printf("Source address: %s\n",inet_ntoa(addr.sin_addr)); addr.sin_addr.s_addr=ip_->daddr; printf("Destination address: %s\n",inet_ntoa(addr.sin_addr)); printf("\n"); printf("-- TCP HEADER --\n"); printf("Source port: %d\n",ntohs(tcp_->source)); printf("Destination port: %d\n",ntohs(tcp_->dest)); printf("Sequence number: %u\n",ntohl(tcp_->seq)); printf("ACK sequence: %u\n",ntohl(tcp_->ack_seq)); printf("Header TCP lenght: %d bytes\n", tcp_->doff*4); printf("Flag FIN: %d\n",tcp_->fin); printf("Flag SYN: %d\n",tcp_->syn); printf("Flag RST: %d\n",tcp_->rst); printf("Flag PSH: %d\n",tcp_->psh); printf("Flag ACK: %d\n",tcp_->ack); printf("Flag URG: %d\n",tcp_->urg); printf("Window TCP: %d\n",ntohs(tcp_->window)); printf("Checksum: %d\n",tcp_->check); printf("Urgent pointer: %d\n",tcp_->urg_ptr); printf("**********************************************\n"); memset(buffer_,0,MAX_LEN); } void print_udp(struct udphdr * udp_,char *buffer_){ printf("-- UDP HEADER --\n"); printf("Source port: %d\n",ntohs(udp_->source)); printf("Destination port: %d\n",ntohs(udp_->dest)); printf("Header UDP lenght: %d bytes\n", udp_->len); printf("Checksum: %d\n",udp_->check); printf("**********************************************\n"); memset(buffer_,0,MAX_LEN); } void help(){ printf("COMMAND LIST\n"); printf("tcp : print tcp traffic\n"); printf("udp : print udp traffic\n"); printf("-A : print tcp or udp traffic on ALL ports\n"); printf("'port' : print tcp or udp traffic on 'port'\n\n"); printf("To run program type 'program name' 'protocol' 'port'\n"); } void title(){ printf("SNIFFER v1.2 by Psyco_Rabbit\n"); printf("E-mail: PsycoRabbit@gmail.com\n\n"); } int main(int argc,char *argv[]){ struct iphdr *ip; struct tcphdr *tcp; struct udphdr *udp; int sock; char *buffer; //packets buffer title(); if(argc<2){ printf("Type --help for basic commands!\n"); exit(-1); } if ((buffer=malloc(MAX_LEN))==NULL){ perror("Memory exhausted!"); } memset(buffer,0,MAX_LEN); if ((strcmp(argv[1],"--help"))==0){ help(); } if ((strcmp(argv[1],"tcp"))!=0 && (strcmp(argv[1],"udp"))!=0){ printf("Type tcp or udp to specify protocol!\n"); printf("TYpe --help for basic commands!\n"); exit(-1); } if ((strcmp(argv[1],"tcp"))==0){ if ((sock=socket(AF_INET,SOCK_RAW,IPPROTO_TCP))==-1) //RAW socket perror("Socket_TCP() Error!"); if(strcmp(argv[2],"-A")==0){ while(read(sock,buffer,MAX_LEN)!=-1){ ip=(struct iphdr *)buffer; //header IP=begin buffer tcp=(struct tcphdr *)(buffer+ip->ihl*4); //header TCP=buffer+size header IP print_tcp_ip(ip,tcp,buffer); sleep(3); } } else while(read(sock,buffer,MAX_LEN)!=-1){ ip=(struct iphdr *)buffer; tcp=(struct tcphdr *)(buffer+ip->ihl*4); if(tcp->source==htons(atoi(argv[2]))) print_tcp_ip(ip,tcp,buffer); sleep(3); } } if ((strcmp(argv[1],"udp"))==0){ if ((sock=socket(AF_INET,SOCK_RAW,IPPROTO_UDP))==-1) //RAW socket perror("Socket_UDP() Error!"); if(strcmp(argv[2],"-A")==0){ while(read(sock,buffer,MAX_LEN)!=-1){ udp=(struct udphdr *)buffer; //header UDP=begin buffer print_udp(udp,buffer); sleep(3); } } else while(read(sock,buffer,MAX_LEN)!=-1){ udp=(struct udphdr *)buffer; if(udp->source==htons(atoi(argv[2]))) print_udp(udp,buffer); sleep(3); } } close(sock); return 0; }