Building the Protocol Blocks

Once we have created a libnet context, we can start building the protocol blocks to be sent. Remember that we must create the protocol blocks in order, from the highest-level protocol to the lowest-level protocol we are required to build. Because we are using the LIBNET_LINK injection type, we are required to create the link layer packet as well as any higher-level packets. Therefore, we need to start by creating the ARP packet header, as shown in Example 11-2.

Example 11-2. Creating the ARP header

in_addr_t ipaddr;                     /* source ip address */
in_addr_t destaddr;                   /* destination ip address */
u_int8_t *macaddr;                    /* destination mac address */
struct libnet_ether_addr *hwaddr;     /* source MAC address */
libnet_ptag_t arp = 0;                /* ARP protocol tag */

/* get the hardware address for the card we are using */
hwaddr = libnet_get_hwaddr (l);

/* build the ARP header */
arp = libnet_autobuild_arp (ARPOP_REPLY,              /* operation */
                          (u_int8_t *) hwaddr,        /* source hardware addr */
                          (u_int8_t *) &ipaddr,       /* source protocol addr */
                          macaddr,                    /* target hardware addr */
                          (u_int8_t *) &destaddr,     /* target protocol addr */
                          l);                         /* libnet context */

if (arp == -1)
    {
      fprintf (stderr,
           "Unable to build ARP header: %s\n", libnet_geterror (l));
      exit (1);
    }

Example 11-2 uses the libnet_autobuild_arp() function, which has the following prototype:

libnet_ptag_t libnet_autobuild_arp (u_int16_t op, u_int8_t *sha, u_int8_t *spa,
             u_int8_t *tha, u_int8_t *tpa, libnet_t *l)

The build and autobuild functions ...

Get Network Security Tools now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.