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.).
#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?
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) |
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)
Typischer Layer-8-Fehler: Wie linkt man wohl gegen eine Libary unter c? -lpcap ist dein Freund...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.