Raw Sockets

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo, ich beschäftige mich seit einiger Zeit mit Raw Sockets in C, und habe versucht, das gelesene mit XCode umzusetzen, jetzt will es aber nicht klappen, mit keinem der von mir gefundenen Beispiele.
    Hat jemand eine Idee wie ich einen simplen Paket Sniffer mit XCode in C zu programmieren?
    Vielen Dank im Voraus
  • pijeyy schrieb:

    Hallo, ich beschäftige mich seit einiger Zeit mit Raw Sockets in C, und habe versucht, das gelesene mit XCode umzusetzen, jetzt will es aber nicht klappen, mit keinem der von mir gefundenen Beispiele.
    Hat jemand eine Idee wie ich einen simplen Paket Sniffer mit XCode in C zu programmieren?
    Vielen Dank im Voraus

    Mit Xcode hat das wenig zu tun, das ist "nur" die Programmierumgebung.

    Was hast Du denn (erfolglos) probiert? Vielleicht mal ein Projekt posten.

    -- hns
  • Ja, auf was ich hinweisen wollte ist dass ich mit einem Mac arbeite, und nicht wie in all den Beispielen die ich gefunden habe mit einer Linux Distribution. Und irgendwie ist es nicht das selbe... Naja, ich habe vieles probiert, hier ein paar Beispiele. Ich bin davon ausgegangen dass OSX auf Linux basiert und somit die Programme auch da laufen sollten...

    binarytides.com/blog/packet-sn…-using-linux-sockets-bsd/


    naja, ich denke nicht dass es etwas bringt wenn ich hier diverse links poste, ich ende auf jeden fall immer bei irgendwelchen Fehlern im Quellcode, zum Beispiel dass "sizeof(struct iphdr)" nit erlaubt sei oder so... :S
  • pijeyy schrieb:

    Ja, auf was ich hinweisen wollte ist dass ich mit einem Mac arbeite, und nicht wie in all den Beispielen die ich gefunden habe mit einer Linux Distribution. Und irgendwie ist es nicht das selbe... Naja, ich habe vieles probiert, hier ein paar Beispiele. Ich bin davon ausgegangen dass OSX auf Linux basiert und somit die Programme auch da laufen sollten...

    binarytides.com/blog/packet-sn…-using-linux-sockets-bsd/


    naja, ich denke nicht dass es etwas bringt wenn ich hier diverse links poste, ich ende auf jeden fall immer bei irgendwelchen Fehlern im Quellcode, zum Beispiel dass "sizeof(struct iphdr)" nit erlaubt sei oder so... :S

    Das liegt daran, dass Mac OS X NICHT auf Linux basiert. Beide sind POSIX-kompatibel, aber raw sockets gehören nicht dazu.
    Daher passen die Header oft nicht oder nicht exakt. Und so findet man manchmal lange #ifdef-Ketten in plattformunabhängigen Paketen.
    Welche Funktionen es gibt findest DU per man-Befehl oder in Xcode über Help/Open man page... heraus (ich nehme gerne auch ManOpen).

    Am besten suchst Du Dir ein Projekt heraus das möglichst einfach ist und passt es so lange an bis es compiliert.
    Dass z.B. sizeof(struct iphdr) nicht erkant wird ist ja schon ein Hinweis wo Du den heben ansetzen mußt.
    Dann hast Du so viel gelernt dass auch komplexere Projekte kein Problem mehr sind.

    -- hns
  • @hns
    Vielen Dank für die Antworten, ich habe nun mal ein Projekt gefunden und habe es hat sogar funktioniert. Folgenden Code habe ich verwendet:

    C-Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <unistd.h>
    4. #include <string.h>
    5. #include <netdb.h>
    6. #include <sys/types.h>
    7. #include <sys/stat.h>
    8. #include <sys/socket.h>
    9. #include <netinet/in_systm.h>
    10. #include <netinet/in.h>
    11. #include <netinet/ip.h>
    12. #include <netinet/udp.h>
    13. #include <netinet/ip_icmp.h>
    14. #include <netinet/tcp.h>
    15. #include <arpa/inet.h>
    16. // Creating socket and declaring struct of IP protocol
    17. int main(void)
    18. {
    19. int s;
    20. struct sockaddr_in dir = {AF_INET, 0, 0 };
    21. char buff[1024];
    22. int len = sizeof(dir);
    23. struct ip *ip1 = (struct ip* ) (buff+ sizeof (dir));
    24. //Not necesary, it tells that you must to be root
    25. if (geteuid() != 0)
    26. {
    27. printf("You have to be root!\n");
    28. exit(0);
    29. }
    30. if ((s = socket(AF_INET, SOCK_RAW, 6)) < 0)
    31. {
    32. printf ("Error creating socket\n");
    33. exit (0);
    34. }
    35. // It starts to listen for packets
    36. printf("Waiting for packets...\n");
    37. while (1)
    38. {
    39. bzero(buff, 1024);
    40. //If it recieves a packet, the user will be informed
    41. while (recvfrom(s, buff, 1024, 0, (struct sockaddr_in*) &dir, &len) > 0)
    42. {
    43. unsigned char *srcBytes = (unsigned char*)&ip1->ip_src;
    44. printf ("I got a packet!\t ip: %s", inet_ntoa(ip1->ip_src));
    45. }
    46. }
    47. }
    Alles anzeigen



    Aber das Problem ist, dass das Programm zwar läuft, aber es werden keine Pakete gelesen! Hat irgendjemand darauf eine Lösung oder Idee?

    @Michael Vielen Dank, das werde ich mir mal ansehen :)
  • pijeyy schrieb:

    Vielen Dank, aber ich bin noch immer am verzweifeln! :(

    Ich fand Code Ausschnitte zu bpf, aber auch das funktioniert nicht. Hat dann niemand Erfahrung in diesem Gebiet und kann mir einen funktionierenden Code Schnipsel geben, den ich analysieren kann?


    besser ist du nimmst einen nicht funktionierenden schnipsel und du analysierst was falsch ist bzw was du ändern musst!