Forum: PC-Programmierung Netzwerkpakete generieren


von vyt (Gast)


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.).

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?


von vyt (Gast)


Lesenswert?

Das ist eine Lib, aber damit kann ich leben - danke dir.

von vyt (Gast)


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?

von Εrnst B. (ernst)


Lesenswert?

vyt schrieb:

> Woran liegts also?

dein Beispielcode passt nicht zu deiner PCAP-Version und/oder du musst 
die "remote-ext.h" noch includieren.


Die kompatible Open-Funktion wäre:
1
pcap_t *   pcap_open_live (const char *device, int snaplen, int promisc, int to_ms, char *ebuf)

von vyt (Gast)


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)

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Typischer Layer-8-Fehler:

Wie linkt man wohl gegen eine Libary unter c?

-lpcap ist dein Freund...

von vyt (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.