【转】busybox分析——arp设置ARP缓存表中的mac地址

转自:http://blog.chinaunix.net/uid-26009923-id-5098083.html

1. 将arp缓存表中某一IP的MAC地址修改

cong@msi:/work/test/tcpip/busy/arp$ cat arp.c
#include "utils.h" #include <net/if_arp.h>
#include <linux/sockios.h>
//usage: arp 192.168.4.111 78:6a:89:18:31:0c
#define ETH_ALEN 6 int INET_resolve(const char *name, struct sockaddr_in *s_in)
{
struct hostent *hp;
/* Grmpf. -FvK */
s_in->sin_family = AF_INET;
s_in->sin_port = 0; /* Look to see if it's a dotted quad. */
if (inet_aton(name, &s_in->sin_addr)) {
return 0;
} hp = gethostbyname(name);
if (hp == NULL) {
return -1;
}
memcpy(&s_in->sin_addr, hp->h_addr_list[0], sizeof(struct in_addr));
return 0;
} /* Convert Ethernet address from "XX[:]XX[:]XX[:]XX[:]XX[:]XX" to sockaddr.
* Return nonzero on error.
*/
int in_ether(const char *bufp, struct sockaddr *sap)
{
char *ptr;
int i, j;
unsigned char val;
unsigned char c;
dbmsg();
sap->sa_family = ARPHRD_ETHER;
ptr = (char *) sap->sa_data; i = ETH_ALEN;
goto first;
do {
/* We might get a semicolon here */
if (*bufp == ':')
bufp++;
first:
j = val = 0;
do {
c = *bufp;
if (((unsigned char)(c - '0')) <= 9) {
c -= '0';
} else if ((unsigned char)((c|0x20) - 'a') <= 5) {
c = (unsigned char)((c|0x20) - 'a') + 10;
} else {
if (j && (c == ':' || c == '\0'))
/* One-digit byte: __:X:__ */
break;
return -1;
}
++bufp;
val <<= 4;
val += c;
j ^= 1;
} while (j); *ptr++ = val; } while (--i); /* Error if we aren't at end of string */
return *bufp;
} int main ( int argc, char *argv[] )
{
struct arpreq req;
struct sockaddr sa;
int ret;
if(argc != 3)
{
dbmsg("usage: ./arp ");
exit(0);
}
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
return -1;
memset(&req, 0, sizeof(req));
//a. put host IP to arp_p
INET_resolve(argv[1], (struct sockaddr_in*)&sa);
memcpy(&req.arp_pa, &sa, sizeof(struct sockaddr)); //b. put host MAC to arp_ha
in_ether(argv[2], &req.arp_ha); //c. set flag
req.arp_flags = ATF_PERM | ATF_COM; //d. invoke ioctl
dbmsg("next invoke ioctl");
ret = ioctl(sockfd, SIOCSARP, &req);
if(ret < 0)
{
dbmsg("error %s", strerror(errno));
exit(-1);
}
return EXIT_SUCCESS;
}

3. 执行结果

cong@msi:/work/test/tcpip/busy/arp$ cat /proc/net/arp | grep "192.168.4.111"   //查看arp缓存中的192.168.4.111的MAC地址
192.168.4.111 0x1 0x2 78:6a:89:18:31:0b * eth2 -->结尾是0b cong@msi:/work/test/tcpip/busy/arp$ ping 192.168.4.111 //可以ping通的
PING 192.168.4.111 (192.168.4.111) 56(84) bytes of data.
64 bytes from 192.168.4.111: icmp_seq=1 ttl=64 time=93.9 ms cong@msi:/work/test/tcpip/busy/arp$ sudo ./arp 192.168.4.111 78:6a:89:18:31:0c //修改arp缓存中的192.168.4.111的MAC地址
arp.c:in_ether[38]:
arp.c:main[101]: next invoke ioctl cong@msi:/work/test/tcpip/busy/arp$ ping 192.168.4.111 //再次ping发现不通了
PING 192.168.4.111 (192.168.4.111) 56(84) bytes of data.
From 192.168.4.62: icmp_seq=1 Redirect Network(New nexthop: 192.168.4.62)
From 192.168.4.62: icmp_seq=2 Redirect Network(New nexthop: 192.168.4.62)
From 192.168.4.62: icmp_seq=3 Redirect Network(New nexthop: 192.168.4.62) cong@msi:/work/test/tcpip/busy/arp$ cat /proc/net/arp | grep "192.168.4.111" //查看arp缓存中的192.168.4.111的MAC地址
192.168.4.111 0x1 0x6 78:6a:89:18:31:0c * eth2 -->将结尾的0b改成了0c

  

  

【转】busybox分析——arp设置ARP缓存表中的mac地址的更多相关文章

  1. 深度技术W10系统中绑定MAC地址和IP地址的设置技巧

    深度技术W10系统中绑定MAC地址和IP地址的设置技巧分享给大家,感兴趣的用户,请一起来了解下,以备以后作参考,具体如下:1.点击“开始——搜索”,输入CMD命令,然后在CMD上右键选择以管理员身份运 ...

  2. Linux 在 i 节点表中的磁盘地址表中,若一个文件的长度是从磁盘地址表的第 1 块到第 11 块 解析?

    面试题: 在 i 节点表中的磁盘地址表中,若一个文件的长度是从磁盘地址表的第 1 块到第 11块,则该文件共占有 B  块号.A 256 B 266 C 11 D 256×10 linux文件系统是L ...

  3. 使用ARP获取局域网内设备IP和MAC地址

    根据Arp列表数据,查询本地设备在线状态 使用 arp -a 获得所有内网地址,首先看Mod对象 public struct MacIpPair { public string HostName; p ...

  4. MySQL中设置同一张表中一个字段的值等于另一个字段的值

    今天遇到了一个需求,我在一张表中新增了一个字段,因为这张表以前已经有很多数据了,这样对于以前的数据来说,新增的这个字段的值也就是为该字段的默认值,现在需要将新增的这个字段添加上数据,数据来源为同表的另 ...

  5. 贴一份用delphi修改注册表改网卡MAC地址的代码

    //提示:此代码需要use Registry, Common; function WriteMAC(model:integer):integer; var reg:TRegistry; begin r ...

  6. (转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理 ...

  7. ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御

    ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3  ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...

  8. 网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...

  9. MAC地址表、ARP缓存表以及路由表

    一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...

随机推荐

  1. 分布式存储系统 Ceph

    你了解Ceph吗? Ceph是一种分布式存储系统,它可以将多台服务器组成一个超大集群,把这些机器中的磁盘资源整合到一块儿,形成一个大的资源池(PB级别),然后按需分配给应用使用. 那么你知道Ceph的 ...

  2. C++之旅(第一天)

    基础知识 完全支持C语言 可以在C++引入C的头文件 #include <stdio.h> #include <iostream> int main() { } 输入和输出 C ...

  3. webmagic的设计机制及原理-如何开发一个Java爬虫 转

    此文章是webmagic 0.1.0版的设计手册,后续版本的入门及用户手册请看这里:https://github.com/code4craft/webmagic/blob/master/user-ma ...

  4. getAttribute() 与 attr() 的区别

    getAttribute() 和 attr() 都是获取元素属性的方法,只是一种是 JS 写法,一种是 JQ 写法,但其实它们是有区别的. 主要区别 调用 getAttribute() 的主体必须是元 ...

  5. 【.Net基础一】 类型、对象、线程栈、托管堆运行时的相互关系

    目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 J ...

  6. 【c++ primer, 5e】返回类型和return语句

    [无返回值函数] 1.在c++的void函数中,可以显式地使用return;语句来提前结束函数的调用. [有返回值函数] 1.值是如何被返回的:返回一个值的方式和初始化一个变量或者形参的方式完全一样. ...

  7. asp.net发送短信

    public class SmsServiceManager { public static string Send(string PhoneNumber, out string sendNo) { ...

  8. [BZOJ3174]拯救小矮人

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  9. 线程实现Runnable接口比继承Thread的优势

    1.适合多个相同程序代码的线程去处理同一资源,把虚拟CPU(线程)同程序的代码.数据有效分离,较好地体现了面向对象的设计思想.2.可以避免由于java单继承特性带来的局限.3.增强了程序的健壮性,代码 ...

  10. R中的sub替换函数【转】

    R中的grep.grepl.sub.gsub.regexpr.gregexpr等函数都使用正则表达式的规则进行匹配.默认是egrep的规则,也可以选用Perl语言的规则.在这里,我们以R中的sub函数 ...