Raw Tcp Socket (Winpcap)



  • Hallo,

    ich versuche gerade einen Raw Socket mit winpcap zu schreiben.
    Ich habe auf zwei Rechnern Wireshark installiert und habe versucht, von Rechner A ein Packet zu Rechner B zu senden.

    Im Wireshark von Recher A kann ich eindeutig das Packet sehen, welches zu Recher B gesendet wird. Jedoch gibt es auf Recher B keinerlei anzeichen dafür, dass ein Packet von Rechner A ankommen würde.

    if ( (fp = pcap_open(dev[count].name,        // name of the device
                            100,						// portion of the packet to capture (only the first 100 bytes)
                            PCAP_OPENFLAG_PROMISCUOUS,  // promiscuous mode
                            1000,						// read timeout
                            NULL,						// authentication on the remote machine
                            errbuf						// error buffer
                            ) ) == NULL)
        {
            fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", dev[count].name);
            return 1;
        }
    	printf("Opened");
    	pcap_freealldevs(alldevs);
    
    	// *******************  Ethernet Header *****************
    
    	ehdr = (PETHER_HDR)packet;
    
    	memcpy(ehdr->source , s_mac , 6);	//Source Mac address
    	memcpy(ehdr->dest,d_mac,6);	//Destination MAC address
    	ehdr->type = htons(0x0800); //IP Frames
    
    	// *******************  IP Header *****************
    
    	iphdr = (PIPV4_HDR)(packet + sizeof(ETHER_HDR));
    
    	iphdr->ip_version = 4;
    	iphdr->ip_header_len = 5;	
    	iphdr->ip_tos = 0;
    	iphdr->ip_total_length = htons (sizeof(IPV4_HDR) + sizeof(TCP_HDR) + strlen(dump));
    	iphdr->ip_id = htons(2);
    	iphdr->ip_frag_offset = 0;
    	iphdr->ip_reserved_zero=0;
    	iphdr->ip_dont_fragment=1;
    	iphdr->ip_more_fragment=0;
    	iphdr->ip_frag_offset1 = 0;
    	iphdr->ip_ttl    = 200;
    	iphdr->ip_protocol = IPPROTO_TCP;
    	iphdr->ip_srcaddr  = inet_addr("IP Recher A");
    	iphdr->ip_destaddr = inet_addr(IP Recher B");
    	iphdr->ip_checksum =0;
    	iphdr->ip_checksum = in_checksum((unsigned short*)iphdr, sizeof(IPV4_HDR));
    
    	// *******************  TCP Header *****************
    	tcphdr = (PTCP_HDR)(packet + sizeof(ETHER_HDR) + sizeof(IPV4_HDR));
    
    	tcphdr->source_port = htons( 5000 );
    	tcphdr->dest_port = htons(80);
    	tcphdr->sequence=0;
    	tcphdr->acknowledge=0;
    	tcphdr->reserved_part1=0;
    	tcphdr->data_offset=5;
    	tcphdr->fin=0;
    	tcphdr->syn=1;
    	tcphdr->rst=0;
    	tcphdr->psh=0;
    	tcphdr->ack=0;
    	tcphdr->urg=0;
    	tcphdr->ecn=0;
    	tcphdr->cwr=0;
    	tcphdr->window = htons(64240);
    	tcphdr->checksum=0;
    	tcphdr->urgent_pointer = 0;
    
    	// *******************  Data Dump *****************
    	data = (char*)(packet + sizeof(ETHER_HDR) + sizeof(IPV4_HDR) + sizeof(TCP_HDR));
    	strcpy(data,dump);
    
    	// *******************  Checksum calculation *****************
    
    	pseudo_header.source_address = inet_addr("IP Recher A");
    	pseudo_header.dest_address = inet_addr("Ip Recher B");
    	pseudo_header.placeholder = 0;
    	pseudo_header.protocol = IPPROTO_TCP;
    	pseudo_header.tcp_length = htons(sizeof(TCP_HDR) + strlen(dump));
    	memcpy(&pseudo_header.tcp , tcphdr , sizeof TCP_HDR);
    
    	unsigned char *seudo;
    	seudo = new unsigned char(sizeof (P_HDR) + strlen(dump));
    	memcpy(seudo, &pseudo_header, sizeof P_HDR);
    	memcpy(seudo + sizeof P_HDR , data , strlen(dump));
    
    	tcphdr->checksum = in_checksum((unsigned short*)seudo, sizeof(P_HDR) + strlen(dump));
    
    	printf("\nSending Packet...");
    
    		pcap_sendpacket(fp , packet , sizeof(ETHER_HDR) + sizeof(IPV4_HDR) + sizeof(TCP_HDR) + strlen(dump));
    		printf("Send\n");
    


  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • kanns jetzt gerade nicht testeen, aber versucch mal das ...
    kommt da ein fehler oder nicht? wenn ja welcher?

    pcap_sendpacket() returns 0 on success and -1 on failure.

    If -1 is returned, pcap_geterr() or pcap_perror() may be called with p as an argument to fetch or display the error text.

    Quelle: http://linux.die.net/man/3/pcap_sendpacket

    oder hast du das schon versucht bzw. eingebaut?

    hoff das hilft dir...
    lg



  • Ich habe gerade ausprobiert ob es fahler gibt, das pcap_sendpacket() gibt jedoch 0 zurück, also gibt es da keine Fehler.



  • julian1811 schrieb:

    Ich habe gerade ausprobiert ob es fahler gibt, das pcap_sendpacket() gibt jedoch 0 zurück, also gibt es da keine Fehler.

    mhh ok, hast schon deine address angaben überprüft... stimmen die wirklich?
    kommen die pakete gar nicht an?
    nutzt du auch ein wireshark auf rechner b? ist das auch richitig eingestellt?

    das kann ich dir pauschal jetzt nicht beantworten, aber dann sieht es soweit so aus als wenn es kein code problem gibt... da die funktion ja anscheinend die pakete sendet...

    also liegt meiner meinung nach das problem bei rechner b oder "auf dem weg dahin"...
    kanns sein das du ne firewall dazwischen hast? bzw. i.was was die pakete vll blockiert? 😃

    lg



  • nachtrag:
    willst du pakete durch dein lokales netzwerk senden oder steht der rechner b ganz woanders und du willst "durchs Internet"?

    wie ist dein netzwerk denn aufgebaut?
    -> i.was was die die verbindung blockieren könnten?
    -> ist der port wirklich offen? (auf rechner b) - (gibt es etwas zwischen a und b was den port blockieren könnte?)

    kannst du den rechner überhaupt von a nach b erreichen? (mit genau diesen adressangaben?)



  • Also Rechner b steht im lokalen Netzwerk, wireshark auf beiden Rechnern, friewalls sind auf Rechner a und b deaktiviet.

    Dazwischen ist nur der Router, da musste ich später nochmal Schauen, ob der irgendwas blockt.

    Muss man den Port auf Rechner b erst freischalten?



  • julian1811 schrieb:

    Also Rechner b steht im lokalen Netzwerk, wireshark auf beiden Rechnern, friewalls sind auf Rechner a und b deaktiviet.

    Dazwischen ist nur der Router, da musste ich später nochmal Schauen, ob der irgendwas blockt.

    Muss man den Port auf Rechner b erst freischalten?

    ok, meiner meinung nach wirds wahrscheinlich am router liegen...
    kann ja eig nur noch so sein, klappt ja eig sonst alles...

    schau mal die firewall einstellungen(falls der router soetwas hat...) oder portweiterleitung...!

    manche router blockieren ports ob das passiert weiß ich nicht....

    lass am besten mal "nmap" durch dein netzwerklaufen und schau ob die ports die du nutzten willst verfügbar und offen sind...

    oder kann das bei dir nicht sein das die ports geschlossen sind?
    du kannst auch einfach mal den router rausziehen und die verbindung von a nach b direkt aufbauen, dann müsste es ja eig auch einfach so gehen... 🙄

    lg



  • Warum gibst du die IPs der Rechner nicht direkt ein?
    Einmal taucht in deinem Code "IP Recher B" dann wieder "Ip Recher B" auf.



  • Also es lag am TCP. Mit UDP oder ICMP funktioniert die Verbindung zwischen Rechner A und B, jedoch nicht von Rechner A zu einem Recher C, der sich nicht im LAN befindet, sondern im Internet.


Anmelden zum Antworten