Raw socket e Ipv6

di il
43 risposte

43 Risposte - Pagina 2

  • Re: Raw socket e Ipv6

    Grazie mille non mancherò intanto risolvo i problemini e creo il pacchetto con l'header ipv6 e poi vedo se ho problemi grazie mille!
  • Re: Raw socket e Ipv6

    Yum yum

    Comunque spero tu allegherai in tuo lavoro quì ...
  • Re: Raw socket e Ipv6

    Un altro errore...
    
    ...
    while (j<=10)
    {
       ..
       if (( buffer1 = (void*)malloc(ETH_FRAME_LEN))==NULL)
          {perror ("malloc");}  
      ...
    }
    
  • Re: Raw socket e Ipv6

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <errno.h>
    #include <netpacket/packet.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <net/if.h>
    #include <net/ethernet.h>
    #include <netinet/ip6.h>
    
    #define PACKET_LENGTH 1480
    
    int main(int argc, const char * argv[]) {
    	
    	struct ip6_hdr *ip6hdr;
    	const char myaddr[]="fe80::226:c7ff:fe85:6758";
    	int socket_write,socket_read,slength=0,rlength=0,j=0,h,m;
    	struct ifreq dev,dev2;
    	struct sockaddr_ll address,address2;
    	void *buffer1=NULL;	
    	void *ip6head;
    	struct ip6_hdr *ipr_hdr;
    	char *test;
    	//creaiamo il pacchetto da inviare 
    	
    	
    	if(h!=1 || m!=1) {perror("inet_pton");}	
    	
    	char packet[PACKET_LENGTH],*data;
    	
    	
    	ip6hdr=(struct ip6_hdr*)packet;
    	memset(ip6hdr,0,sizeof(struct ip6_hdr));
    	
    
    		
    	h=inet_pton(AF_INET6,myaddr,&ip6hdr->ip6_src);
    	m=inet_pton(AF_INET6,myaddr,&ip6hdr->ip6_src);
    
    	if(h!=1 || m!=1) {perror("inet_pton");}
    	//Apriamo il primo socket in scrittura
    	
    	
    
    	socket_write=socket(AF_PACKET,SOCK_RAW,ETH_P_ALL);
    	
    	if(socket_write==-1) { perror("socket"); }
    	
    	memset(&dev, 0, sizeof(struct ifreq));
    
    	strncpy(dev.ifr_name, "wlan0", IFNAMSIZ);
    
    	if(ioctl(socket_write, SIOCGIFINDEX, &dev) == -1) {perror("ioctl");}
    
    	
    	address.sll_family=AF_PACKET;
    	address.sll_protocol=htons(ETH_P_ALL);
    	address.sll_ifindex=dev.ifr_ifindex;
    
    
    	if(bind(socket_write,(const struct sockaddr *)&address, sizeof(struct sockaddr_ll))==-1) {
    		perror("bind");
    	}
    
    	//Apriamo il socket in lettura:
    
    	socket_read=socket(AF_PACKET,SOCK_RAW,ETH_P_ALL);
    	
    	if(socket_read==-1) {
    		perror("socket");
    		exit(1);
    	}
    
    	memset(&dev2,0,sizeof(struct ifreq));
    	
    	strncpy(dev2.ifr_name,"wlan0", IFNAMSIZ);
    
    	
    	if((ioctl(socket_read, SIOCGIFINDEX, &dev2))==-1) {
    		perror("ioctl");
    		close(socket_read);
    		exit(1); 		
    	}
    
    	address2.sll_family=AF_PACKET;
    	address2.sll_protocol=htons(ETH_P_ALL);
    	address2.sll_ifindex=dev2.ifr_ifindex;
    
    	//bind my socket to address
    
    	if(bind(socket_read,(const struct sockaddr*)&address2, sizeof(struct sockaddr_ll))==-1) {
    		perror("bind");
    	}
    	
    	//Inviamo e riceviamo i dati	
    	
    	data=(char*)(packet+sizeof(struct ip6_hdr));
    	
    	strcpy(data,"Questo che leggete qui e' il payload del pacchetto ipv6 :)");
    
    	if (( buffer1 = (void*)malloc(PACKET_LENGTH))==NULL) {perror ("malloc");}
    	
    	while(j<=6) {
    			
    			slength=send(socket_write, packet,PACKET_LENGTH,MSG_DONTROUTE);
    			if(slength==-1) {perror("send\n");}
    			else {
    				printf("%d", (int)slength);
    	      			printf("\ninviato\n");
    			}
    
    				rlength=recv(socket_read,buffer1, PACKET_LENGTH,0);
    				if(rlength==-1) {perror("recv");}
    				else { 
    		       			printf("%d", rlength);
    		       			printf("\nricevuto\n"); 
    
                                           //Queste due righe creano segmentation fault
    					ip6head=&buffer1;
    					ipr_hdr=(struct ip6_hdr*)ip6head;
    	
    					if(ipr_hdr!=NULL) {
    						
    						char *buffer2=(char *)(buffer1+sizeof(struct ip6_hdr));
    						printf("%s", buffer2);
    				
    					}
    					else { printf("c'è qualcosa che non va"); }	
    				}
    				
    	j++;
    	}
    	
    return 0;
    
    }
    Ho modificato il codice ma ora mi da segmentation fault quando cerco di leggere l'header...invece se non include le righe relative all'header ipv6 riesco tranquillamente a leggere il payload!
  • Re: Raw socket e Ipv6

    Sono su ipad...
    qui cosa cerchi di fare?
    
       ip6hdr=(struct ip6_hdr*)packet;
    
  • Re: Raw socket e Ipv6

    Un'altra cosa che non capisco...
    dove scrivi l'header eth?
  • Re: Raw socket e Ipv6

    Perdonami... ma non leggo bene su sto coso
  • Re: Raw socket e Ipv6

    Allora voglio intendere che attacco l'header al pacchetto, se vedi sotto troverai poi che scrivo il payload. Mentre per l'eth lo devo mettere sempre io? Pensavo che essendo sopra l'interfaccia non servisse! Purtroppo sugl'header specialmente quello sull'ipv6 ho trovato solo l'rfc ma ci sono poche fonti da programmatori che l'hanno usato!
  • Re: Raw socket e Ipv6

    Immagino proprio di si, non farmi venire dei dubbi! se stai lavorando su pacchetti devi incapsulare il tutto. la conferma la dovresti notare in lettura dove il payload racchiude gli altri livelli.
    prova a non eseguire la scrittura e vedere se mi sbaglio...
  • Re: Raw socket e Ipv6

    Quindi devo include ip, eth e scrivo il payload esatto? successivamente devo rifare la stessa procedura quando cerco di sniffarli?
  • Re: Raw socket e Ipv6

    Si, frame eth+ipv6+payload. stessa cosa in lettura (ma puoi verificare come ti ho suggerito prima)
  • Re: Raw socket e Ipv6

    Quello che forse ti confonde è che dimentichi che stai lavorando a livello 2
  • Re: Raw socket e Ipv6

    Per l'header ipv6 l'unica fonte certa è l'rfc

    te lo devi studiare a colazione, pranzo e cena
  • Re: Raw socket e Ipv6

    Consigli:
    cerca di dare una struttura al programma in modo che sia più leggibile
    definisci wlan0 solo una volta in testa al programma.

    edit:
    dividi le sezioni lettura scrittura e rendile autonome. questo ti serve per debuggare

    edit2:
    aggiungi una funzione di dump per debuggare il pacchetto.

    edit3:
    esegui questi piccoli accorgimenti.... io intanto vado a dormire perché domattina mi sveglio alle 6. 'notte
  • Re: Raw socket e Ipv6

    Ho aggiunto l'header eth e funziona ora pulisco il codice e lo rendo leggibile grazie ancora
Devi accedere o registrarti per scrivere nel forum
43 risposte