?
Hallo,
beschäftige mich derzeit mit den Raw Sockets. Ich will einen simplen 3-Way-Handshake schreiben doch leider scheitert es schon bei meinem ersten SYN Packet.
Irgendwie wird der Header nicht richtig geschrieben und ich finde meinen Fehler nicht:
dataSize=sizeof(iphdr)+sizeof(tcphdr);
iphdr.h_verlen = (4 << 4 | sizeof(IP_HEADER) / sizeof(unsigned long));
iphdr.total_len = htons(sizeof(IP_HEADER) + sizeof(TCP_HEADER));
iphdr.ident = 1;
iphdr.frag_and_flags = 0;
iphdr.ttl = 128;
iphdr.proto = IPPROTO_TCP;
iphdr.checksum = 0;
iphdr.destIP = sin.sin_addr.s_addr;
tcphdr.th_dport = sin.sin_port;
tcphdr.th_sport = htons(rand() % 1025);
tcphdr.th_seq = htonl(0x12345678);
tcphdr.th_ack = 0;
tcphdr.th_flag = 2;
tcphdr.th_lenres = (sizeof(TCP_HEADER) / 4 << 4 | 0);
tcphdr.th_win = htons(16384);
tcphdr.th_urp = 0;
tcphdr.th_sum = 0;
psdhdr.saddr = iphdr.sourceIP;
psdhdr.daddr = iphdr.destIP;
psdhdr.mbz = 0;
psdhdr.ptcl = IPPROTO_TCP;
psdhdr.tcpl = htons(sizeof(tcphdr));
memcpy(szBuffer, &psdhdr, sizeof(psdhdr));
memcpy(szBuffer + sizeof(psdhdr), &tcphdr, sizeof(tcphdr));
tcphdr.th_sum = checksum((USHORT *)szBuffer, dataSize);
memcpy(szBuffer, &iphdr, sizeof(iphdr));
memcpy(szBuffer + sizeof(iphdr), &tcphdr, sizeof(tcphdr));
memset(szBuffer + sizeof(iphdr) + sizeof(tcphdr), 0, 4);
iphdr.checksum = checksum((USHORT *)szBuffer, dataSize);
memcpy(szBuffer, &iphdr, sizeof(iphdr));
sendto(sock,szBuffer,dataSize,0,(struct sockaddr *)&sin,sizeof(sin));
Kann jemand mal den Code überfliegen?
Sitze jetzt schon knapp ne Stunde da dran und finde den Fehler einfach nicht....