Mailing List del Fortunae LUG ============================ Ciao a tutti. ... ecco a voi la mia ultima fatica. PREMESSA: utilità prossima allo 0, almeno per me. Non scandalizzatevi se ho fatto un codice veramente pietoso, perchè 1 non so il C, 2 non sono neppure ordinato. hview: E' una funzioncina che se gli passi il puntatore al primo char di un pacchetto IP, manda in output sullo schermo una graziosa rappresentazione di tutti i bits del pacchetto stesso. Come da premessa il codice fà veramente schifo e sicuramente ci sono migliaia di modi migliori per fare quello che ho fatto io. Segue un echo client UDP da usare in localhost che mostra il funzionamento di hview, una cosa graziosa è dare queste configurazioni a iptables in modo da confrontare i risultati di hview e quello che dice il kernel: iptables -A INPUT -j LOG --log-prefix "[INPUT]" iptables -A OUTPUT -j LOG --log-prefix "[OUTPUT]" ---CODE--- /*Non servono tutte ...*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<arpa/inet.h> #include<unistd.h> #include<netdb.h> #include<netinet/ip.h> #include<netinet/udp.h> #include<netinet/in.h> #include<sys/types.h> #include<sys/socket.h> /*Il solito check*/ unsigned short cksum(unsigned short *ptr, int nbytes); /*bin*/ void bin(unsigned char *dec, char *bin); /*hview*/ void hview(char *pkt, char mode); int main(int argc, char **argv) { char resp_count,request_count; char buffer[1024],resp[1024]; char *pkg, *request; struct iphdr *ip; struct udphdr *udp; struct pseudohdr { unsigned long saddr; unsigned long daddr; char useless; unsigned char protocol; unsigned short length; }pseudo_udp; int socket_id,ip_on=1; struct sockaddr_in addr; ssize_t n_read; if(argc <= 1) { printf("Usage: %s \"Request String\"\n",argv[0]); exit(-1); } else { request = argv[1]; for(request_count = 2;request_count < argc;request_count++) { strcat(request,argv[request_count]); } } pkg = (char *) malloc(sizeof(struct iphdr)+sizeof(struct udphdr)+strlen(request)); ip = (struct iphdr *) pkg; ip->version = 4; ip->ihl = 5; ip->tos = 0x00; ip->tot_len = sizeof(struct iphdr)+sizeof(struct udphdr)+strlen(request); ip->id = 0x00; ip->frag_off = 0x00; ip->ttl = 0xFF; ip->protocol = IPPROTO_UDP; ip->saddr = inet_addr("127.0.0.1"); ip->daddr = inet_addr("127.0.0.1"); ip->check = cksum((unsigned short *)ip,sizeof(ip)); pseudo_udp.saddr = inet_addr("127.0.0.1"); pseudo_udp.daddr = inet_addr("127.0.0.1"); pseudo_udp.useless = htons(0); pseudo_udp.protocol = IPPROTO_UDP; pseudo_udp.length = sizeof(struct udphdr) + strlen(request); udp = (struct udphdr *) (pkg+sizeof(struct iphdr)); udp->source = htons(79); udp->dest = htons(79); udp->len = htons(sizeof(struct udphdr) + strlen(request)); /*checl del udp ... se va bene ...*/ udp->check = cksum((unsigned short *)&pseudo_udp, sizeof(struct udphdr) + sizeof(struct pseudohdr)); memcpy(&pkg[sizeof(struct iphdr)+sizeof(struct udphdr)],request,strlen(request)); socket_id = socket(AF_INET,SOCK_RAW,IPPROTO_UDP); if(socket_id == -1) { perror("socket"); return -1; } if(setsockopt(socket_id,IPPROTO_IP,IP_HDRINCL,&ip_on,sizeof(int)) == -1) { perror("setsockopt"); return -1; } addr.sin_family = AF_INET; addr.sin_port = htons(79); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); memset(resp,'\0',1024); puts("L'IP header che invio io ..."); hview(pkg,1); if(sendto(socket_id,pkg,ip->tot_len,0,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) == -1) { perror("sendto"); return -1; } while(strlen(resp) == 0) { read(socket_id,resp,1024); } puts("L'IP header che ricevo ..."); hview(resp,1); puts("Ed il server rispose ..."); resp_count = sizeof(struct iphdr)+sizeof(struct udphdr); while(resp[resp_count] > 0) { printf("%c",resp[resp_count]); resp_count++; } printf("\n"); close(socket_id); return 0; } /*Funzione del check * Purtroppo non mi dato a conoscere chi abbia scritto per primo * questa funzione, alcuni dicono l'autore del Ping, comunque * chiunque esso si va il mio ringraziamento. Se qualcuno sa chi e' * mi piacerebbe me lo facesse sapere * */ unsigned short cksum(unsigned short *ptr, int nbytes) { register long sum; unsigned short oddbyte; register unsigned short answer; sum = 0; while (nbytes > 1) { sum += *ptr++; nbytes -= 2; } if (nbytes == 1) { oddbyte = 0; *((u_char *) &oddbyte) = *(u_char *)ptr; sum += oddbyte; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); answer = ~sum; return((unsigned short) answer); } void hview(char *pkt, char mode) { /*Version e IHL*/ char *b_verihl; unsigned char verihl = *pkt; /*Type of Service*/ char *b_tos; unsigned char tos = *(pkt+1); /*Total Lenght byte1*/ char *b_tl1; unsigned char tl1 = *(pkt+2); /*Total Lenght byte2*/ char *b_tl2; unsigned char tl2 = *(pkt+3); /*Identification byte1*/ char *b_id1; unsigned char id1 = *(pkt+4); /*Identification byte2*/ char *b_id2; unsigned char id2 = *(pkt+5); /*Flags*/ char *b_flags; unsigned char flags = *(pkt+6); /*Frag OffSet*/ char *b_frag; unsigned char frag = *(pkt+7); /*TTl*/ char *b_ttl; unsigned char ttl = *(pkt+8); /*Protocol*/ char *b_protocol; unsigned char protocol = *(pkt+9); /*CheckSum byte 1*/ char *b_check1; unsigned char check1 = *(pkt+10); /*CheckSum byte 2*/ char *b_check2; unsigned char check2 = *(pkt+11); /*Source byte 1*/ char *b_s1; unsigned char s1 = *(pkt+12); /*Source byte 2*/ char *b_s2; unsigned char s2 = *(pkt+13); /*Source byte 3*/ char *b_s3; unsigned char s3 = *(pkt+14); /*Source byte 4*/ char *b_s4; unsigned char s4 = *(pkt+15); /*Destination byte 1*/ char *b_d1; unsigned char d1 = *(pkt+16); /*Destination byte 2*/ char *b_d2; unsigned char d2 = *(pkt+17); /*Destination byte 3*/ char *b_d3; unsigned char d3 = *(pkt+18); /*Destination byte 4*/ char *b_d4; unsigned char d4 = *(pkt+19); /*Version e IHL*/ b_verihl = malloc(8*sizeof(char)); memset(b_verihl,'\0',8); bin(&verihl,b_verihl); /*Type of Service*/ b_tos = malloc(8*sizeof(char)); memset(b_tos,'\0',8); bin(&tos,b_tos); /*Total Lenght byte1*/ b_tl1 = malloc(8*sizeof(char)); memset(b_tl1,'\0',8); bin(&tl1,b_tl1); /*Total Lenght byte2*/ b_tl2 = malloc(8*sizeof(char)); memset(b_tl2,'\0',8); bin(&tl2,b_tl2); /*Identification byte1*/ b_id1 = malloc(8*sizeof(char)); memset(b_id1,'\0',8); bin(&tl2,b_id1); /*Identification byte 2*/ b_id2 = malloc(8*sizeof(char)); memset(b_id2,'\0',8); bin(&id2,b_id2); /*Flags*/ b_flags = malloc(8*sizeof(char)); memset(b_flags,'\0',8); bin(&flags,b_flags); /*Frag OffSet*/ b_frag = malloc(8*sizeof(char)); memset(b_frag,'\0',8); bin(&frag,b_frag); /*TTL*/ b_ttl = malloc(8*sizeof(char)); memset(b_ttl,'\0',8); bin(&ttl,b_ttl); /*Protocol*/ b_protocol = malloc(8*sizeof(char)); memset(b_protocol,'\0',8); bin(&protocol,b_protocol); /*CheckSum byte 1*/ b_check1 = malloc(8*sizeof(char)); memset(b_check1,'\0',8); bin(&check1,b_check1); /*CheckSum byte 2*/ b_check2 = malloc(8*sizeof(char)); memset(b_check2,'\0',8); bin(&check2,b_check2); /*Source byte 1*/ b_s1 = malloc(8*sizeof(char)); memset(b_s1,'\0',8); bin(&s1,b_s1); /*Source byte 2*/ b_s2 = malloc(8*sizeof(char)); memset(b_s2,'\0',8); bin(&s2,b_s2); /*Source byte 3*/ b_s3 = malloc(8*sizeof(char)); memset(b_s3,'\0',8); bin(&s3,b_s3); /*Source byte 4*/ b_s4 = malloc(8*sizeof(char)); memset(b_s4,'\0',8); bin(&s4,b_s4); /*Destination byte 1*/ b_d1 = malloc(8*sizeof(char)); memset(b_d1,'\0',8); bin(&d1,b_d1); /*Destination byte 2*/ b_d2 = malloc(8*sizeof(char)); memset(b_d2,'\0',8); bin(&d2,b_d2); /*Destination byte 3*/ b_d3 = malloc(8*sizeof(char)); memset(b_d3,'\0',8); bin(&d3,b_d3); /*Destination byte 4*/ b_d4 = malloc(8*sizeof(char)); memset(b_d4,'\0',8); bin(&d4,b_d4); if(mode == 0){ /*Version e IHL*/ printf("%c",*b_verihl); printf("%c",*(b_verihl+1)); printf("%c",*(b_verihl+2)); printf("%c",*(b_verihl+3)); printf("%c",*(b_verihl+4)); printf("%c",*(b_verihl+5)); printf("%c",*(b_verihl+6)); printf("%c ",*(b_verihl+7)); /*Type of Service*/ printf("%c",*b_tos); printf("%c",*(b_tos+1)); printf("%c",*(b_tos+2)); printf("%c",*(b_tos+3)); printf("%c",*(b_tos+4)); printf("%c",*(b_tos+5)); printf("%c",*(b_tos+6)); printf("%c ",*(b_tos+7)); /*Total Lenght byte1*/ printf("%c",*b_tl1); printf("%c",*(b_tl1+1)); printf("%c",*(b_tl1+2)); printf("%c",*(b_tl1+3)); printf("%c",*(b_tl1+4)); printf("%c",*(b_tl1+5)); printf("%c",*(b_tl1+6)); printf("%c ",*(b_tl1+7)); /*Total Lenght byte2*/ printf("%c",*b_tl2); printf("%c",*(b_tl2+1)); printf("%c",*(b_tl2+2)); printf("%c",*(b_tl2+3)); printf("%c",*(b_tl2+4)); printf("%c",*(b_tl2+5)); printf("%c",*(b_tl2+6)); printf("%c\n",*(b_tl2+7)); /*Identification byte1*/ printf("%c",*b_id1); printf("%c",*(b_id1+1)); printf("%c",*(b_id1+2)); printf("%c",*(b_id1+3)); printf("%c",*(b_id1+4)); printf("%c",*(b_id1+5)); printf("%c",*(b_id1+6)); printf("%c ",*(b_id1+7)); /*Identification byte 2*/ printf("%c",*b_id2); printf("%c",*(b_id2+1)); printf("%c",*(b_id2+2)); printf("%c",*(b_id2+3)); printf("%c",*(b_id2+4)); printf("%c",*(b_id2+5)); printf("%c",*(b_id2+6)); printf("%c ",*(b_id2+7)); /*Flags*/ printf("%c",*b_flags); printf("%c",*(b_flags+1)); printf("%c",*(b_flags+2)); printf("%c",*(b_flags+3)); printf("%c",*(b_flags+4)); printf("%c",*(b_flags+5)); printf("%c",*(b_flags+6)); printf("%c ",*(b_flags+7)); /*Frag OffSet*/ printf("%c",*b_frag); printf("%c",*(b_frag+1)); printf("%c",*(b_frag+2)); printf("%c",*(b_frag+3)); printf("%c",*(b_frag+4)); printf("%c",*(b_frag+5)); printf("%c",*(b_frag+6)); printf("%c\n",*(b_frag+7)); /*TTL*/ printf("%c",*b_ttl); printf("%c",*(b_ttl+1)); printf("%c",*(b_ttl+2)); printf("%c",*(b_ttl+3)); printf("%c",*(b_ttl+4)); printf("%c",*(b_ttl+5)); printf("%c",*(b_ttl+6)); printf("%c ",*(b_ttl+7)); /*Protocol*/ printf("%c",*b_protocol); printf("%c",*(b_protocol+1)); printf("%c",*(b_protocol+2)); printf("%c",*(b_protocol+3)); printf("%c",*(b_protocol+4)); printf("%c",*(b_protocol+5)); printf("%c",*(b_protocol+6)); printf("%c ",*(b_protocol+7)); /*CheckSum byte 1*/ printf("%c",*b_check1); printf("%c",*(b_check1+1)); printf("%c",*(b_check1+2)); printf("%c",*(b_check1+3)); printf("%c",*(b_check1+4)); printf("%c",*(b_check1+5)); printf("%c",*(b_check1+6)); printf("%c ",*(b_check1+7)); /*CheckSum byte 2*/ printf("%c",*b_check2); printf("%c",*(b_check2+1)); printf("%c",*(b_check2+2)); printf("%c",*(b_check2+3)); printf("%c",*(b_check2+4)); printf("%c",*(b_check2+5)); printf("%c",*(b_check2+6)); printf("%c\n",*(b_check2+7)); /*Source byte 1*/ printf("%c",*b_s1); printf("%c",*(b_s1+1)); printf("%c",*(b_s1+2)); printf("%c",*(b_s1+3)); printf("%c",*(b_s1+4)); printf("%c",*(b_s1+5)); printf("%c",*(b_s1+6)); printf("%c ",*(b_s1+7)); /*Source byte 2*/ printf("%c",*b_s2); printf("%c",*(b_s2+1)); printf("%c",*(b_s2+2)); printf("%c",*(b_s2+3)); printf("%c",*(b_s2+4)); printf("%c",*(b_s2+5)); printf("%c",*(b_s2+6)); printf("%c ",*(b_s2+7)); /*Source byte 3*/ printf("%c",*b_s3); printf("%c",*(b_s3+1)); printf("%c",*(b_s3+2)); printf("%c",*(b_s3+3)); printf("%c",*(b_s3+4)); printf("%c",*(b_s3+5)); printf("%c",*(b_s3+6)); printf("%c ",*(b_s3+7)); /*Source byte 4*/ printf("%c",*b_s4); printf("%c",*(b_s4+1)); printf("%c",*(b_s4+2)); printf("%c",*(b_s4+3)); printf("%c",*(b_s4+4)); printf("%c",*(b_s4+5)); printf("%c",*(b_s4+6)); printf("%c\n",*(b_s4+7)); /*Destination byte 1*/ printf("%c",*b_d1); printf("%c",*(b_d1+1)); printf("%c",*(b_d1+2)); printf("%c",*(b_d1+3)); printf("%c",*(b_d1+4)); printf("%c",*(b_d1+5)); printf("%c",*(b_d1+6)); printf("%c ",*(b_d1+7)); /*Destination byte 2*/ printf("%c",*b_d2); printf("%c",*(b_d2+1)); printf("%c",*(b_d2+2)); printf("%c",*(b_d2+3)); printf("%c",*(b_d2+4)); printf("%c",*(b_d2+5)); printf("%c",*(b_d2+6)); printf("%c ",*(b_d2+7)); /*Destination byte 3*/ printf("%c",*b_d3); printf("%c",*(b_d3+1)); printf("%c",*(b_d3+2)); printf("%c",*(b_d3+3)); printf("%c",*(b_d3+4)); printf("%c",*(b_d3+5)); printf("%c",*(b_d3+6)); printf("%c ",*(b_d3+7)); /*Destination byte 4*/ printf("%c",*b_d4); printf("%c",*(b_d4+1)); printf("%c",*(b_d4+2)); printf("%c",*(b_d4+3)); printf("%c",*(b_d4+4)); printf("%c",*(b_d4+5)); printf("%c",*(b_d4+6)); printf("%c\n",*(b_d4+7)); } else if(mode == 1) { /*PICTURE MODE*/ printf(" IP - HEADER\n"); printf("0 15-16 31\n"); printf("+-----+-----+-----------+-----------------------+\n"); printf("| Ver | IHL | TOS | Total Length |\n"); printf("| "); /*Version e IHL*/ printf("%c",*b_verihl); printf("%c",*(b_verihl+1)); printf("%c",*(b_verihl+2)); printf("%c",*(b_verihl+3)); printf("|"); printf("%c",*(b_verihl+4)); printf("%c",*(b_verihl+5)); printf("%c",*(b_verihl+6)); printf("%c",*(b_verihl+7)); printf(" | "); /*TOS*/ printf("%c",*b_tos); printf("%c",*(b_tos+1)); printf("%c",*(b_tos+2)); printf("%c",*(b_tos+3)); printf("%c",*(b_tos+4)); printf("%c",*(b_tos+5)); printf("%c",*(b_tos+6)); printf("%c",*(b_tos+7)); printf(" | "); /*Total Lenght byte 1*/ printf("%c",*b_tl1); printf("%c",*(b_tl1+1)); printf("%c",*(b_tl1+2)); printf("%c",*(b_tl1+3)); printf("%c",*(b_tl1+4)); printf("%c",*(b_tl1+5)); printf("%c",*(b_tl1+6)); printf("%c",*(b_tl1+7)); printf(" "); /*Total Lenght byte 2*/ printf("%c",*b_tl2); printf("%c",*(b_tl2+1)); printf("%c",*(b_tl2+2)); printf("%c",*(b_tl2+3)); printf("%c",*(b_tl2+4)); printf("%c",*(b_tl2+5)); printf("%c",*(b_tl2+6)); printf("%c",*(b_tl2+7)); printf(" |\n"); printf("+-----+-----+-----------+------+----------------+\n"); printf("| Identification | Flags| Frag Offset |\n"); printf("| "); /*Identification byte 1*/ printf("%c",*b_id1); printf("%c",*(b_id1+1)); printf("%c",*(b_id1+2)); printf("%c",*(b_id1+3)); printf("%c",*(b_id1+4)); printf("%c",*(b_id1+5)); printf("%c",*(b_id1+6)); printf("%c",*(b_id1+7)); printf(" "); /*Identification byte 2*/ printf("%c",*b_tl2); printf("%c",*(b_tl2+1)); printf("%c",*(b_tl2+2)); printf("%c",*(b_tl2+3)); printf("%c",*(b_tl2+4)); printf("%c",*(b_tl2+5)); printf("%c",*(b_tl2+6)); printf("%c",*(b_tl2+7)); printf(" | "); /*Flags*/ printf("%c",*b_frag); printf("%c",*(b_frag+1)); printf("%c",*(b_frag+2)); printf("| "); printf("%c",*(b_frag+3)); printf("%c",*(b_frag+4)); printf("%c",*(b_frag+5)); printf("%c",*(b_frag+6)); printf("%c",*(b_frag+7)); printf(" "); /*Frag OffSet*/ printf("%c",*b_frag); printf("%c",*(b_frag+1)); printf("%c",*(b_frag+2)); printf("%c",*(b_frag+3)); printf("%c",*(b_frag+4)); printf("%c",*(b_frag+5)); printf("%c",*(b_frag+6)); printf("%c",*(b_frag+7)); printf(" |\n"); printf("+-----------+-----------+------+----------------+\n"); printf("| TTL | Protocol | Header Checksum |\n"); printf("| "); /*TTL*/ printf("%c",*b_ttl); printf("%c",*(b_ttl+1)); printf("%c",*(b_ttl+2)); printf("%c",*(b_ttl+3)); printf("%c",*(b_ttl+4)); printf("%c",*(b_ttl+5)); printf("%c",*(b_ttl+6)); printf("%c",*(b_ttl+7)); printf(" | "); /*Protocol*/ printf("%c",*b_protocol); printf("%c",*(b_protocol+1)); printf("%c",*(b_protocol+2)); printf("%c",*(b_protocol+3)); printf("%c",*(b_protocol+4)); printf("%c",*(b_protocol+5)); printf("%c",*(b_protocol+6)); printf("%c",*(b_protocol+7)); printf(" | "); /*CheckSum byte 1*/ printf("%c",*b_check1); printf("%c",*(b_check1+1)); printf("%c",*(b_check1+2)); printf("%c",*(b_check1+3)); printf("%c",*(b_check1+4)); printf("%c",*(b_check1+5)); printf("%c",*(b_check1+6)); printf("%c",*(b_check1+7)); printf(" "); /*CheckSum byte 2*/ printf("%c",*b_check2); printf("%c",*(b_check2+1)); printf("%c",*(b_check2+2)); printf("%c",*(b_check2+3)); printf("%c",*(b_check2+4)); printf("%c",*(b_check2+5)); printf("%c",*(b_check2+6)); printf("%c",*(b_check2+7)); printf(" |\n"); printf("+-----------+-----------+-----------------------+\n"); printf("| Source Ip Address |\n"); /*Source byte 1*/ printf("| "); printf("%c",*b_s1); printf("%c",*(b_s1+1)); printf("%c",*(b_s1+2)); printf("%c",*(b_s1+3)); printf("%c",*(b_s1+4)); printf("%c",*(b_s1+5)); printf("%c",*(b_s1+6)); printf("%c",*(b_s1+7)); printf(" "); /*Source byte 2*/ printf("%c",*b_s2); printf("%c",*(b_s2+1)); printf("%c",*(b_s2+2)); printf("%c",*(b_s2+3)); printf("%c",*(b_s2+4)); printf("%c",*(b_s2+5)); printf("%c",*(b_s2+6)); printf("%c",*(b_s2+7)); printf(" "); /*Source byte 3*/ printf("%c",*b_s3); printf("%c",*(b_s3+1)); printf("%c",*(b_s3+2)); printf("%c",*(b_s3+3)); printf("%c",*(b_s3+4)); printf("%c",*(b_s3+5)); printf("%c",*(b_s3+6)); printf("%c",*(b_s3+7)); printf(" "); /*Source byte 4*/ printf("%c",*b_s4); printf("%c",*(b_s4+1)); printf("%c",*(b_s4+2)); printf("%c",*(b_s4+3)); printf("%c",*(b_s4+4)); printf("%c",*(b_s4+5)); printf("%c",*(b_s4+6)); printf("%c",*(b_s4+7)); printf(" |\n"); printf("+-----------------------------------------------+\n"); printf("| Destination Ip Address |\n"); /*Destination byte 1*/ printf("| "); printf("%c",*b_d1); printf("%c",*(b_d1+1)); printf("%c",*(b_d1+2)); printf("%c",*(b_d1+3)); printf("%c",*(b_d1+4)); printf("%c",*(b_d1+5)); printf("%c",*(b_d1+6)); printf("%c",*(b_d1+7)); printf(" "); /*Destination byte 2*/ printf("%c",*b_d2); printf("%c",*(b_d2+1)); printf("%c",*(b_d2+2)); printf("%c",*(b_d2+3)); printf("%c",*(b_d2+4)); printf("%c",*(b_d2+5)); printf("%c",*(b_d2+6)); printf("%c",*(b_d2+7)); printf(" "); /*Destination byte 3*/ printf("%c",*b_d3); printf("%c",*(b_d3+1)); printf("%c",*(b_d3+2)); printf("%c",*(b_d3+3)); printf("%c",*(b_d3+4)); printf("%c",*(b_d3+5)); printf("%c",*(b_d3+6)); printf("%c",*(b_d3+7)); printf(" "); /*Destination byte 4*/ printf("%c",*b_d4); printf("%c",*(b_d4+1)); printf("%c",*(b_d4+2)); printf("%c",*(b_d4+3)); printf("%c",*(b_d4+4)); printf("%c",*(b_d4+5)); printf("%c",*(b_d4+6)); printf("%c",*(b_d4+7)); printf(" |\n"); printf("+-----------------------------------------------+\n"); }//End if(mode) } void bin(unsigned char *dec, char *bin) { int ctrl; char output[7]; for(ctrl = 0;ctrl <= 5;ctrl++) { output[ctrl] = *dec%2; *dec = (unsigned char)*dec/2; } output[6] = *dec%2; output[7] = (unsigned char)*dec/2; for(ctrl = 0;ctrl <= 7;ctrl++) { if(output[7 - ctrl] == 0) memset(bin+ctrl,48,1); else if(output[7 - ctrl] == 1) memset(bin+ctrl,49,1); } } ---CODE--- ciao a tutti! -- Gecco è bravo... bello e bravo! (cit.)