RAW Socket unter XP No Error
-
Hi
Folgeder Code sollte ein Raw Socket unter XP (nicht SP2) erstellen.
Er lässt sich mit gcc kompilieren, aber ich bekomme dann immer:sendto() No Error
Und zwar bei:
if(sendto(s, buffer, ntohs(ip->total_len ), 0, (struct sockaddr*)&to, sizeof(to))==-1){ perror("sendto() error"); }Und Paket wird keins verschickt! Was ist das Problem?
// includes #include <winsock2.h> #include <ws2tcpip.h> #include <windows.h> #include <stdio.h> // header struct iphdr { unsigned int len:4; unsigned int ver:4; unsigned char tos; unsigned short total_len; unsigned short ident; unsigned short frag_and_flags; unsigned char ttl; unsigned char proto; unsigned short checksum; unsigned int sourceIP; unsigned int destIP; }; //Header TCP struct tcphdr { unsigned short sport; unsigned short dport; unsigned int seqnum; unsigned int acknum; unsigned char DataOffset; unsigned char Flags; unsigned short Windows; unsigned short Checksum; unsigned short UrgPointer; }; // main entry int main(int argc, char *argv[]) { // private WSADATA wsa; int s; unsigned int on=1; struct iphdr *ip; struct tcphdr *tcp; struct sockaddr_in to; struct in_addr addr; char buffer[1024]; // setup winsock WSAStartup(MAKEWORD(2,2), &wsa); // create socket if((s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP))==-1){ printf("socket() error\n"); return 0; } // set some options if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char*)&on, sizeof(on)) == -1){ printf("setsockopt() error\n"); return -1; } // create header ip = (struct iphdr*) buffer; tcp = (struct tcphdr*) (buffer + sizeof(struct iphdr)); memset(ip, 0, sizeof(struct iphdr)); ip->ver = 4; ip->len = 5; ip->total_len = htons(sizeof(struct iphdr) + sizeof(struct tcphdr)); ip->ident = 2; ip->ttl = 255; ip->proto = IPPROTO_TCP; ip->sourceIP = inet_addr("192.168.1.11"); ip->destIP = inet_addr("192.168.1.12"); memset(tcp, 0, sizeof(struct tcphdr)); tcp->sport = htons(1024); tcp->dport = htons(54321); tcp->seqnum = 2; tcp->DataOffset = 5; tcp->acknum = 1; tcp->Windows = htons(65535); to.sin_addr.S_un.S_addr = ip->destIP; to.sin_family = AF_INET; to.sin_port = tcp->dport; printf("Ziel: %s:%i\n", inet_ntoa(to.sin_addr), ntohs(tcp->dport )); addr.s_addr = ip->sourceIP ; printf("Quelle: %s:%i\n", inet_ntoa(addr), ntohs(tcp->sport )); if(sendto(s, buffer, ntohs(ip->total_len ), 0, (struct sockaddr*)&to, sizeof(to))==-1){ perror("sendto() error"); } // quit getchar(); return 0; }
-
Ich habe jetzt hier IPPROTO_TCP in RAW gewechselt... Es kommt kein Error...
allerdings stimmt der TCP Header jetzt nie, die länge Beträgt 0 Byte....// create socket if((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))==-1){ printf("socket() error\n"); return 0; }