C Arp Packet
-
Versuche mich in C in Netzwerkprogrammierung und habe dazu ein Programm das ein Arp Packet versenden soll geschrieben. Nur funktioniert das ganze nicht ganz, das Packet wird zwar korrekt versendet nur nicht als ARP!? In wireshark wird das Protokoll als "SLL" angegeben, ich glaub da ist was mit den Headern schiefgelaufen doch ich komm irgendwie nicht drauf was genau.
#include "headers.h" #define ARPOP_REPLY 2 #define ARPHDR_ETHER 1 #define ETH_ALEN 6 struct arp_ext_header { // Ethernet dependent part of arp unsigned char S_MAC[ETH_ALEN]; /* Sender hardware address. */ unsigned char S_IP[4]; /* Sender IP address. */ unsigned char D_MAC[ETH_ALEN]; /* Target hardware address. */ unsigned char D_IP[4]; /* Target IP address. */ }; int arpSend(int argc, char **argv) { int sock, uid; struct sockaddr addr; struct ether_header *EthHdr; struct arphdr *ArpHdr; struct arp_ext_header *ArpExtHdr; int packetsize = sizeof(struct ether_header) + sizeof(struct arphdr) + sizeof(struct arp_ext_header); unsigned char packet[packetsize]; memset(packet, 0, packetsize); EthHdr = (struct ether_header *) packet; ArpHdr = (struct arphdr *) (packet + sizeof(struct ether_header)); ArpExtHdr = (struct arp_ext_header *) (packet + sizeof(struct ether_header) + sizeof(struct arphdr)); // define MAC-Addresses char *SMAC = "BB:BB:BB:BB:BB:BB"; char *DMAC = "AA:AA:AA:AA:AA:AA"; // define IP-Addresses char *SIP = "12.12.111.111"; char *DIP = "10.50.6.173"; //Interface char *dev = "wlan0"; //Check for root uid = getuid(); if (uid != 0) { printf("You must have UID 0 instead of %d.\n", uid); exit(1); } if ((sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ARP))) == -1) { perror("socket"); exit(1); } memcpy(EthHdr->ether_shost, (const void *) ether_aton(SMAC), ETHER_ADDR_LEN); memcpy(EthHdr->ether_dhost, (const void *) ether_aton(DMAC), ETHER_ADDR_LEN); EthHdr->ether_type = htons(ETHERTYPE_ARP); // ARP Protokoll ArpHdr->ar_hln = 6; ArpHdr->ar_hrd = htons(ARPHDR_ETHER); ArpHdr->ar_op = htons(ARPOP_REPLY); ArpHdr->ar_pln = 4; ArpHdr->ar_pro = htons(ETH_P_IP); memcpy(ArpExtHdr->S_MAC, ether_aton(SMAC), ETH_ALEN); // Sender MAC *(u_long *) ArpExtHdr->S_IP = inet_addr(SIP); // Source IP memcpy(ArpExtHdr->D_MAC, ether_aton(DMAC), ETH_ALEN); // Target MAC *(u_long *) ArpExtHdr->D_IP = inet_addr(DIP); // Target IP //Set interface strncpy(addr.sa_data, dev, sizeof(addr.sa_data)); printf("Sending ARP packet\n"); if ((sendto(sock, packet, packetsize, 0, &addr, sizeof(struct sockaddr))) == -1) { perror("send"); exit(1); } return 0; }
-
dann zeig doch was du geschickt hast. macht die fehlersuche vielleicht einfacher.
-
Wireshark:
source destination Protocol Info bb:bb:bb:bb:bb:bb SLL Sent by us
Details
Frame 29 (44 bytes on wire) Arrival Time: ... [Time delta from previous captured frame: 1.516 sec] [Time delta from previous displayed frame: 1.516 sec] [Time since reference or first frame 49.2345235 sec] Frame Number: 29 Frame Length: 44 byte Capture Length: 44 bytes [Frame is marked: False] [Protocols in frame: sll:data] Linux cooked capture Packet type: Sent by us (4) Link-layer address type: 1 Link-layer address length 6 Source bb:bb:bb:bb:bb:bb (bb:bb:bb:bb:bb:bb) Protocol: Unknown (0x0000) Data (28 bytes) Data: 0010712342134252AAAAABB24323532324 [Length: 28]
-
kannst du das auch mal undecodiert posten. ich denke du schickst keinen ethernetheader. und die mac adressen wuerde ich auch noch einmal ueberdenken.
-
-
Hab im Programm noch
... write(1, packet, sizeof(packet)); ...
eingefuegt, und dann den Hexdump erzeugt mit ./ARP | od -t x1
0000000 aa aa aa aa aa aa bb bb bb bb bb bb 08 06 00 01 0000020 08 00 06 04 00 02 bb bb bb bb bb bb 0a 32 06 ad 0000040 aa aa aa aa aa aa 7f 00 00 01 53 65 6e 64 69 6e 0000060 67 20 41 52 50 20 70 61 63 6b 65 74 0a 0000075
In der ersten Zeile stimmen mal folgende Werte nicht:
Packet type: 1-2
Link-Layer address type: 3-4
Link-Layer address length: 5-6
Protocol: 15-16Dazu der Hex den mir Wireshark fuer dieses gesendete Packet liefert:
0000 00 04 00 01 00 06 bb bb bb bb bb bb 00 00 00 00 0010 08 06 08 00 06 04 00 02 bb bb bb bb bb bb 0a 32 0020 06 ad aa aa aa aa aa aa 7f 00 00 01
-
Typ222 schrieb:
0000000 aa aa aa aa aa aa bb bb bb bb bb bb 08 06 00 01 0000020 08 00 06 04 00 02 bb bb bb bb bb bb 0a 32 06 ad 0000040 aa aa aa aa aa aa 7f 00 00 01 53 65 6e 64 69 6e 0000060 67 20 41 52 50 20 70 61 63 6b 65 74 0a 0000075
das sieht doch ganz gut aus. du sendest an "7f 00 00 01" =^ localhost. das ist kein ethernet-interface. arp innerhalb einer maschine macht ohnehin keinen sinn.
machst du hier einen capture auf ein loopback-interface?
Typ222 schrieb:
Dazu der Hex den mir Wireshark fuer dieses gesendete Packet liefert:
0000 00 04 00 01 00 06 bb bb bb bb bb bb 00 00 00 00 0010 08 06 08 00 06 04 00 02 bb bb bb bb bb bb 0a 32 0020 06 ad aa aa aa aa aa aa 7f 00 00 01
das würde den pseudoheader erklären. was genau hast du eigentlich vor?