int main(int argc, char **argv) { if(argc<2) { printf("MSN Sniffer v1 Coded by Amir Canto\n"); printf("usage: %s <ethernet interface>",argv[0]); } else { SOCKET sock; SOCKADDR_IN sain; DWORD dwBytes; char cBuffer[65535] = {0}; char *packet=NULL; int io = 1; int len=0; LPTSTR szMsntalk; #ifdef WIN32 WSAData ws; WSAStartup(MAKEWORD(2,1),&ws); #endif sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); #ifdef WIN32 if(sock==SOCKET_ERROR) ExitProcess(0); #else if(sock==0)exit(-1); #endif sain.sin_family = AF_INET; sain.sin_port = htons(6000); sain.sin_addr.S_un.S_addr = inet_addr(argv[1]); // interfaces[argv[1]]; printf("Binding on interface... \n"); bind(sock,(SOCKADDR*)&sain,sizeof(sain)); WSAIoctl(sock,SIO_RCVALL,&io,sizeof(io),NULL,0,&dwBytes,NULL,NULL); printf("Using WSAIoctl\n"); struct tcpheader *pTCPHeader; struct ipheader *pIPHeader; pIPHeader = (struct ipheader *)cBuffer; pTCPHeader = (struct tcpheader *)(cBuffer + sizeof(struct ipheader)); printf("\nSniffing TCP packet's...\n"); while(1) { memset(cBuffer,0,sizeof(cBuffer)); recv(sock,cBuffer,sizeof(cBuffer),0); len =(ntohs(pIPHeader->ip_len)-(sizeof(struct ipheader)+sizeof(struct tcpheader))); if((pIPHeader->ip_p==IPPROTO_TCP)&&(len!=0)){ packet = (char *)&cBuffer[sizeof(struct ipheader)+sizeof(struct tcpheader)]; char *pointer,*pointer1,*pointer3; if((pointer=strstr(packet,"MSG")) && (pointer1=strstr(packet,"text/plain"))) { ExtractPacket(pointer1); printf("\nSniffing Messenger Messages\n"); } } } } return 0; }
int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buf[256]; if (argc < 4) { fprintf(stderr,"usage %s hostname port\n", argv[0]); exit(0); } portno = atoi(argv[3]); sockfd = socket(AF_INET, SOCK_STREAM, 0); char *name=NULL; int namelen = strlen(argv[1]); name=(char*)malloc(namelen+1); memset(name,0,namelen+1); memcpy(name,argv[1],namelen); name[namelen] = '\0'; //printf("name here is %s\n",name); if (sockfd < 0) { error("ERROR opening socket\n"); exit(0); } server = gethostbyname(argv[2]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(0); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr,(char *)&serv_addr.sin_addr.s_addr,server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) { error("ERROR connecting\n"); exit(0); } //int i,nbytes,j; printf("\n********* Connected to the Server *********** \n"); //if connect successful send JOIN msg to server short int typejoin =2; //set msg type as JOIN char *buffer=NULL; short int attype = 2; //attribute type=2 for username n = MakePacket(typejoin,attype,&buffer,name); //change the length of the data to be sent //printf("Packet Done \n"); if (send(sockfd, buffer,n, 0) == -1) perror("error in sending JOIN MSG\n"); fd_set readSet,master_list_read; FD_ZERO(&master_list_read); FD_SET(STDIN, &master_list_read);//stdin manually trigger reading FD_SET(sockfd, &master_list_read);//tcp socket struct timeval tv; int retval; tv.tv_sec = 10; tv.tv_usec = 0; while(1) { char *buffer=NULL; int n; tv.tv_sec = 10; readSet=master_list_read; retval = select(sockfd+1, &readSet, NULL, NULL,&tv); if (retval == -1) { perror("Error in select\n"); exit(4); } else if(retval==0) { if(!idlesend) { buffer=NULL; short int typeidle =9; //set msg type as SEND short int attuname = 2; //attribute type=2 for username sprintf(buf,"%s",name); n =MakePacket(typeidle,attuname,&buffer,name); printf("!! Going Idle !!\n"); idlesend=true; if (send(sockfd, buffer,n, 0) == -1) perror("error in sending MSG to server\n"); //printf("*********SEND SUCCESSFUL******\n"); //free(buffer); } } else { if(FD_ISSET(0, &readSet)) { idlesend=false; bzero(buf,256); fgets(buf,256,stdin); //buf[512]='\0'; /*for(i=0;i<5;i++) printf("byte[%d]: %c \n",i,buf[i]);*/ short int typesend =4; //set msg type as SEND short int attmsg = 4; //attribute type=4 for message int n =MakePacket(typesend,attmsg,&buffer,buf); if (send(sockfd, buffer,n, 0) == -1) perror("error in sending MSG to server\n"); //printf("*********SEND SUCCESSFUL******\n"); //free(buffer); } else if (FD_ISSET(sockfd, &readSet)) // receives data from server,print it on StdOutput { bzero(buf,256); int nbytes = recv(sockfd, buf, 256,0); if(nbytes<=0) { perror("recv error from server \n"); exit(0); } ExtractPacket(buf); } } //END OF ELSE } //end of while close(sockfd); return 0; }