005
08.11.2008, 12:53 Uhr
~toski
Gast
|
hm ok, hab es jetzt mal so gemacht und mir von woandes eine neue checksum routine kopiert, wenn ich jetzt zum sendto()-Befehl komme, krieg ich die Meldung das ich invalid argument angegeben haben. Ist das jetzt noch die Headerprüfsumme oder is da noch was anderes falsch ?
Bin mir nicht sicher ob ich beim Aufruf des send-to die parameter richtig mitgebe. Kann ich als Destination-Adress die information aus dem header nehmen oder sind die typen inkompatibel?
Code: |
#define __USE_BSD /* use bsd'ish ip header */ #include <sys/socket.h> /* these headers are for a Linux system, but */ #include <netinet/ip.h> #include <netinet/udp.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h>
unsigned short in_cksum(unsigned short *ptr, int nbytes) { register long sum =0; u_short oddbyte = 0; while(nbytes > 1) { sum += *ptr++; nbytes -=2; } if(nbytes == 1) { *((u_char *) &oddbyte) = *(u_char*) ptr; sum += oddbyte; } sum = (sum>>16) + (sum & 0xffff); sum += (sum>>16); return (u_short)~sum; }
int main(int argc, char **argv) {
/* Aktuelle Nutzer Root bzw. Rootrechte vorhanden */ int uid = geteuid(); if ( uid != 0) { printf("Benoetigt Root-Rechte! Aktuelle ID: %i", uid); exit(1); }
unsigned int headersize = sizeof(struct ip) + sizeof(struct udphdr); unsigned int payload = 4096; unsigned int packetsize = headersize + payload; unsigned char packet[packetsize]; memset(packet,0,packetsize); struct ip *iph = (struct ip*) packet; struct udphdr *udp = (struct udphdr *) packet + sizeof(struct ip); int rawsock=0; if ((rawsock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)) < 0) { perror("Socketerzeugung ist in die Hose gegangen!"); exit(1); }
/* Eigenen IP-Header verwenden, Kernel-Header unterdrücken */ int on=1; if (setsockopt(rawsock, IPPROTO_IP, IP_HDRINCL, (const char* )&on, sizeof(on)) < 0 ) { perror("IP_HDRINCL fehlgeschlagen!\n"); exit(1); } /* IP Header zusammenbauen */ iph->ip_v = 4; //IPv4 iph->ip_hl = 5; iph->ip_tos = 0x0; iph->ip_len = htons(packetsize); /* Groesse das Paketes */ iph->ip_ttl = 255; iph->ip_sum = 0; //Berechnung erfolgt weiter unten iph->ip_p = IPPROTO_UDP; iph->ip_src.s_addr = inet_addr("192.168.2.103"); iph->ip_dst.s_addr = inet_addr("127.0.0.1"); iph->ip_id = htons(random());
/* UDP Header zusammenbauen */ udp->uh_sport = 1234; udp->uh_dport = 1235; udp->uh_ulen = sizeof(struct udphdr) + payload; udp->uh_sum = 0; //printf("Checksumme berechnen, Headersize \n"); iph->ip_sum = in_cksum((unsigned short*) &iph, sizeof(struct ip)); printf("Errechnete Checksumme: %i\n", iph->ip_sum);
printf("Versenden\n"); if (sendto(rawsock, packet, packetsize, 0, (struct sockaddr*) &(iph->ip_dst.s_addr), sizeof(struct sockaddr_in)) < 0 ) perror("Da is was Fehlgeschlagen"); close(rawsock); return 0; }
|
|