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-16

    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
    


  • 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?


Anmelden zum Antworten