Netzwerkpakete generieren

Gast #1951138
Lesenswert?

Mir ist schon klar, dass es so einen Thread schonmal gab, allerdings 
scheint der sich todgelaufen zu haben: Wie schaffe ich es mit reinem 
C/C++ (assembler, falls nötig), Netzwerkpakete Byte für Byte selbst zu 
erschaffen und dann mit 'ner normalen Netzwerkkarte zu senden (Unter 
Windows), ohne irgendeine schräge Fertiglib zu verwenden?

Ich will keine TCP Verbindungen über Sockets, ich will viel mehr.

Selbst bestimmen will ich bei dem Paket alle Schichten des OSI Modells 
(SRC-Mac, DST-Mac, SRC-Port, DST-Port, etc.).
Gast #1952501
Lesenswert?

#include <stdlib.h>
#include <stdio.h>

#include <pcap.h>


int main(int argc, char **argv)
{
pcap_t *fp;
char errbuf[PCAP_ERRBUF_SIZE];
u_char packet[100];
int i;

    /* Check the validity of the command line */
    if (argc != 2)
    {
        printf("usage: %s interface (e.g. 'rpcap://eth0')", argv[0]);
        return 0;
    }

    /* Open the output device */
    if ( (fp= pcap_open(argv[1],            // 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", argv[1]);
        return 0;
    }

    /* Supposing to be on ethernet, set mac destination to 1:1:1:1:1:1 
*/
    packet[0]=1;
    packet[1]=1;
    packet[2]=1;
    packet[3]=1;
    packet[4]=1;
    packet[5]=1;

    /* set mac source to 2:2:2:2:2:2 */
    packet[6]=2;
    packet[7]=2;
    packet[8]=2;
    packet[9]=2;
    packet[10]=2;
    packet[11]=2;

    /* Fill the rest of the packet */
    for(i=12;i<100;i++)
    {
        packet[i]=(u_char)i;
    }

    /* Send down the packet */
    if (pcap_sendpacket(fp, packet, 100 /* size */) != 0)
    {
        fprintf(stderr,"\nError sending the packet: %s\n", 
pcap_geterr(fp));
        return 0;
    }

    return 0;
}




Dieser Code lässt sich nicht kompilieren; Fehlermeldung:
PCAP_OPENFLAG_PROMISCUOUS was not declared in this scope
pcap_open was not declared in this scope


Ich hab die Libs installiert, was man wohl schon daran sieht, dass er an 
sonsten den Code schluckt.
Woran liegts also?
Gast #1955955
Lesenswert?

Problem gefixed (seltsames Problem, Code unmittelbar von pcap Dev-Doc 
übernommen).

Neues Problem:

undefined reference to `_pcap_open_live'|
undefined reference to `_pcap_sendpacket'|
undefined reference to `_pcap_geterr'|



Kann doch garnicht angehen, da ich diese Funktionen nicht verwende (dass 
er die Protoypen im Header nicht findet ist ja kein Wunder)
Gast #1956068
Lesenswert?

Ich arbeite sonst fast ausschließlich mit Standartbiliotheken, Linken 
ist fast sowas wie'n Fremdwort für mich.

Jedenfalls .. gesagt, getan.

Woher nehme ich nun den passenden Wert für "device name" - ist es die 
MAC-Adresse der Netzwerkkarte?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren