Ticket #21225: patch-arpspoof.c.diff

File patch-arpspoof.c.diff, 4.6 KB (added by hsivank@…, 15 years ago)
  • arpspoof.c

    old new  
    1414#include <sys/types.h>
    1515#include <sys/param.h>
    1616#include <netinet/in.h>
     17#include <netinet/if_ether.h>
    1718
    1819#include <stdio.h>
    1920#include <string.h>
     
    2526#include "arp.h"
    2627#include "version.h"
    2728
    28 extern char *ether_ntoa(struct ether_addr *);
     29//extern char *ether_ntoa(struct ether_addr *);
    2930
    30 static struct libnet_link_int *llif;
     31static libnet_t *l;
    3132static struct ether_addr spoof_mac, target_mac;
    3233static in_addr_t spoof_ip, target_ip;
    3334static char *intf;
     
    4142}
    4243
    4344static int
    44 arp_send(struct libnet_link_int *llif, char *dev,
    45          int op, u_char *sha, in_addr_t spa, u_char *tha, in_addr_t tpa)
     45arp_send(libnet_t *l, int op, u_int8_t *sha,
     46         in_addr_t spa, u_int8_t *tha, in_addr_t tpa)
    4647{
    47         char ebuf[128];
    48         u_char pkt[60];
    49        
     48        int retval;
     49
    5050        if (sha == NULL &&
    51             (sha = (u_char *)libnet_get_hwaddr(llif, dev, ebuf)) == NULL) {
     51            (sha = (u_int8_t *)libnet_get_hwaddr(l)) == NULL) {
    5252                return (-1);
    5353        }
    5454        if (spa == 0) {
    55                 if ((spa = libnet_get_ipaddr(llif, dev, ebuf)) == 0)
     55                if ((spa = libnet_get_ipaddr4(l)) == -1)
    5656                        return (-1);
    57                 spa = htonl(spa); /* XXX */
    5857        }
    5958        if (tha == NULL)
    6059                tha = "\xff\xff\xff\xff\xff\xff";
    6160       
    62         libnet_build_ethernet(tha, sha, ETHERTYPE_ARP, NULL, 0, pkt);
     61        libnet_autobuild_arp(op, sha, (u_int8_t *)&spa,
     62                             tha, (u_int8_t *)&tpa, l);
     63        libnet_build_ethernet(tha, sha, ETHERTYPE_ARP, NULL, 0, l, 0);
    6364       
    64         libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, ETHER_ADDR_LEN, 4,
    65                          op, sha, (u_char *)&spa, tha, (u_char *)&tpa,
    66                          NULL, 0, pkt + ETH_H);
    67 
    6865        fprintf(stderr, "%s ",
    6966                ether_ntoa((struct ether_addr *)sha));
    7067
    7168        if (op == ARPOP_REQUEST) {
    7269                fprintf(stderr, "%s 0806 42: arp who-has %s tell %s\n",
    7370                        ether_ntoa((struct ether_addr *)tha),
    74                         libnet_host_lookup(tpa, 0),
    75                         libnet_host_lookup(spa, 0));
     71                        libnet_addr2name4(tpa, LIBNET_DONT_RESOLVE),
     72                        libnet_addr2name4(spa, LIBNET_DONT_RESOLVE));
    7673        }
    7774        else {
    7875                fprintf(stderr, "%s 0806 42: arp reply %s is-at ",
    7976                        ether_ntoa((struct ether_addr *)tha),
    80                         libnet_host_lookup(spa, 0));
     77                        libnet_addr2name4(spa, LIBNET_DONT_RESOLVE));
    8178                fprintf(stderr, "%s\n",
    8279                        ether_ntoa((struct ether_addr *)sha));
    8380        }
    84         return (libnet_write_link_layer(llif, dev, pkt, sizeof(pkt)) == sizeof(pkt));
     81        retval = libnet_write(l);
     82        if (retval)
     83                fprintf(stderr, "%s", libnet_geterror(l));
     84
     85        libnet_clear_packet(l);
     86
     87        return retval;
    8588}
    8689
    8790#ifdef __linux__
     
    119122                /* XXX - force the kernel to arp. feh. */
    120123                arp_force(ip);
    121124#else
    122                 arp_send(llif, intf, ARPOP_REQUEST, NULL, 0, NULL, ip);
     125                arp_send(l, ARPOP_REQUEST, NULL, 0, NULL, ip);
    123126#endif
    124127                sleep(1);
    125128        }
     
    136139        if (arp_find(spoof_ip, &spoof_mac)) {
    137140                for (i = 0; i < 3; i++) {
    138141                        /* XXX - on BSD, requires ETHERSPOOF kernel. */
    139                         arp_send(llif, intf, ARPOP_REPLY,
    140                                  (u_char *)&spoof_mac, spoof_ip,
    141                                  (target_ip ? (u_char *)&target_mac : NULL),
     142                        arp_send(l, ARPOP_REPLY,
     143                                 (u_int8_t *)&spoof_mac, spoof_ip,
     144                                 (target_ip ? (u_int8_t *)&target_mac : NULL),
    142145                                 target_ip);
    143146                        sleep(1);
    144147                }
     
    151154{
    152155        extern char *optarg;
    153156        extern int optind;
    154         char ebuf[PCAP_ERRBUF_SIZE];
     157        char pcap_ebuf[PCAP_ERRBUF_SIZE];
     158        char libnet_ebuf[LIBNET_ERRBUF_SIZE];
    155159        int c;
    156160       
    157161        intf = NULL;
     
    163167                        intf = optarg;
    164168                        break;
    165169                case 't':
    166                         if ((target_ip = libnet_name_resolve(optarg, 1)) == -1)
     170                        if ((target_ip = libnet_name2addr4(l, optarg, LIBNET_RESOLVE)) == -1)
    167171                                usage();
    168172                        break;
    169173                default:
     
    176180        if (argc != 1)
    177181                usage();
    178182       
    179         if ((spoof_ip = libnet_name_resolve(argv[0], 1)) == -1)
     183        if ((spoof_ip = libnet_name2addr4(l, argv[0], LIBNET_RESOLVE)) == -1)
    180184                usage();
    181185       
    182         if (intf == NULL && (intf = pcap_lookupdev(ebuf)) == NULL)
    183                 errx(1, "%s", ebuf);
     186        if (intf == NULL && (intf = pcap_lookupdev(pcap_ebuf)) == NULL)
     187                errx(1, "%s", pcap_ebuf);
    184188       
    185         if ((llif = libnet_open_link_interface(intf, ebuf)) == 0)
    186                 errx(1, "%s", ebuf);
     189        if ((l = libnet_init(LIBNET_LINK, intf, libnet_ebuf)) == NULL)
     190                errx(1, "%s", libnet_ebuf);
    187191       
    188192        if (target_ip != 0 && !arp_find(target_ip, &target_mac))
    189193                errx(1, "couldn't arp for host %s",
    190                      libnet_host_lookup(target_ip, 0));
     194                     libnet_addr2name4(target_ip, LIBNET_DONT_RESOLVE));
    191195       
    192196        signal(SIGHUP, cleanup);
    193197        signal(SIGINT, cleanup);
    194198        signal(SIGTERM, cleanup);
    195199       
    196200        for (;;) {
    197                 arp_send(llif, intf, ARPOP_REPLY, NULL, spoof_ip,
    198                          (target_ip ? (u_char *)&target_mac : NULL),
     201                arp_send(l, ARPOP_REPLY, NULL, spoof_ip,
     202                         (target_ip ? (u_int8_t *)&target_mac : NULL),
    199203                         target_ip);
    200204                sleep(2);
    201205        }