raw socket problem
-
Hallo,
Ich hab hier ein device das ethernet auf dem mac layer spricht (kein arp -> ip -> tcp/udp).
In Wireshark sieht ein Paket was es verschickt so aus:
01 02 03 04 05 06 00 00 00 00 00 00 55 aa + DatenDas ist folgerndermaßen aufgebaut:
Empfänger: 01 02 03 04 05 06 Sender: 00 00 00 00 00 00 Protokoll: 55 aa
Also wirklich nur ein reines mac Paket mit 6 Byte Empfänger, 6 Byte Sender und 2 Byte Protokoll.
So ein Paket möchte ich jetzt gerne mit c auf dem loopback device erzeugen. Mit python habe ich es folgendermaßen hinbekommen:
proto = 0x55aa s = socket(AF_PACKET, SOCK_RAW, proto) s.bind(("lo", proto)) ifName, ifProto, pktType, hwType, hwAddr = s.getsockname() srcAddr = hwAddr dstAddr = "\x01\x02\x03\x04\x05\x06" ethData = "DATA" txFrame = struct.pack("!6s6sh", dstAddr, srcAddr, proto) + ethData s.send(txFrame)
Das erzeugt genau obiges Paket.
Wie kriege ich das in c hin? Ich finde einfach keine Möglichkeit per bind das lo interface zuzuweisen und ich weiß auch nicht so recht wo ich angebe welches Protokoll genutzt werden soll. Alle Tutorials die ich dazu finde bauen sich mindestens IP Pakete und binden dann auf 127.0.0.1, das ist aber schon ein layer zu hoch...
-
Hier ist ein link zur Raw Socketprogrammierung uter linux. Eventuell hilft dir es weiter bei deinem Problem.
-
-
IceTray schrieb:
Link: http://www.chaostal.de/cgi-bin/parser.cgi?input=article/raw-socket&output=text
Das hatte ich schon gefunden, aber auch da wird ein IP-Paket erzeugt. Wenn man das macht lassen sich die Sockets ja wieder wie normale Sockets verwenden.
-
OK, ich habs. Ein Minimalbeispiel in der packet(7) manpage hätte mir hier 10 Stunden rumprobieren sparen können...
Für interessierte (die wichtigsten stellen zusammenkopiert):
#include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <netpacket/packet.h> #include <linux/if.h> #include <linux/sockios.h> #include <errno.h> #define MAC_ADDR_LEN 6 int sockfd; struct sockaddr_ll dest_addr; struct ifreq if_req; MacAddress dest_mac = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; MacAddress src_mac = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; short int proto = htons(0x55aa); sockfd = socket(AF_PACKET, SOCK_RAW, proto); memset(&if_req, 0, sizeof(struct ifreq)); strncpy(if_req.ifr_name, "lo", 2); ioctl(sockfd, SIOCGIFINDEX, &if_req); memset(&dest_addr, 0, sizeof(struct sockaddr_ll)); dest_addr.sll_family = PF_PACKET; dest_addr.sll_protocol = proto; dest_addr.sll_halen = MAC_ADDR_LEN; dest_addr.sll_ifindex = if_req.ifr_ifindex; memcpy(&(dest_addr.sll_addr), dest_mac, MAC_ADDR_LEN); memcpy(image, dest_mac, MAC_ADDR_LEN); memcpy((char*)image + MAC_ADDR_LEN, src_mac, MAC_ADDR_LEN); memcpy((char*)image + 2*MAC_ADDR_LEN, &proto, sizeof(proto)); sendto(sockfd, image, 1000, 0, &dest_addr, sizeof(struct sockaddr_ll));
-
Hallo,
kann mir jemand sagen, wo Ihr dieses 0x55aa herhabt (ausser, ich habe gesehen, dass jemand anderes das so gemacht hat, und habe es uebernommen, ohne mir darueber Gedanken zu machen) ?Ich moechte gerne WLAN (802.11) Packete ueber RAW-Sockets verschicken;
so auf Anhieb wuerde ich jetzt als Protokoll wahrscheinlich ETH_P_PAE (0x888E) verwenden, wie es in der /usr/include/linux/if_ether.h definiert ist, siehe hier:http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/include/linux/if_ether.h
Da steht nix mit 0x55aa drin;
wo kommt diese Adresse also sonst her; wuerde mich ueber jeden Hinweis freuen.Vielen Dank.
-
Das ist keine Adresse sondern das Kürzel für das Protokoll. :3 Da sie/er ihr/sein eigenes Protokoll gebastelt hat, wirst du ihr/sein Kürzel natürlich nirgendwo finden. ^^
-
Um das mal ein wenig zu untermauern, warum man diese Byte-folge so häufig vorfindet.
Das ist einfach eine alternierende Bitfolge. Man geht davon aus, dass das nicht zufällig passieren kann. Im vorliegenden Fall, hätte man aber auch so lustige Sachen wie CAFE, AFFE, DEAD, BEEF, BED, DAD, ACE, nehmen können.
-
Wo wir gerade dabei sind,
kann mir jemand sagen,
wie ich unter Linux (oder erstmal ueberhaupt unter egal was) ein eigenes Layer2-Protokoll definieren kann oder mir einen Hinweis geben, wo ich nachgucken kann (ausser giyf, das habe ich natuerlich schon hinter mir)?Sagen wir, ich habe jetzt 2 Computer und habe mir jetzt ein Protokoll ausgedacht,
dem ich beispielsweise das Kuerzel 0xAFFE gebe.Nun verschicke ich ein Paket, welches diesem Protokoll folgt, und moechte, dass mein 2. Computer, wenn er das empfaengt, nachschaut, wie er das weiterverarbeiten muss.
Jemand eine Idee?
Vielen Dank.
-
Soweit mir bekannte ist kommst du nicht daran vorbei dir ein Kernel-Modul dafür zu schreiben. Dazu wirst du sicherlich die entsprechenden Dokumentationen finden und wenn nicht kannst du ja im Quellcode nachsehen
blan