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

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

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

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

[email protected]:/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. 执行结果

[email protected]:/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

[email protected]:/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

[email protected]:/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

[email protected]:/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)

[email protected]:/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

  

  

时间: 2024-12-11 08:40:35

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

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

深度技术W10系统中绑定MAC地址和IP地址的设置技巧分享给大家,感兴趣的用户,请一起来了解下,以备以后作参考,具体如下:1.点击“开始——搜索”,输入CMD命令,然后在CMD上右键选择以管理员身份运行.2.在打开的命令行窗口中,输入 netsh i i show in运行,在以上显示内容中找到你用来上网连接的Idx号码,在下面命令中使用 (比如小编这里上网的网卡是“WLAN”所以Idx为5). 3.在命令提示符窗口输入:arp -a 查看各个IP与对应的mac地址 4.输入netsh -c "

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

//提示:此代码需要use Registry, Common; function WriteMAC(model:integer):integer; var reg:TRegistry; begin reg:=TRegistry.Create; //创建注册表对象 reg.RootKey:=HKEY_LOCAL_MACHINE; //指定注册表根为HKLM if reg.OpenKey('\System\CurrentControlSet\Control\Class\ {4D36E972-E325

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

郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的. 交换机的工作原理 交换机在接收到数据帧以后,首先.会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着.会检查自己的MAC

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

一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的. 交换机的工作原理 交换机在接收到数据帧以后,首先.会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着.会检查自己的MAC表中是否有数据帧中目标MAC地址的信息,如果有则会根据MAC表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数

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

一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的. 交换机的工作原理 交换机在接收到数据帧以后,首先.会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着.会检查自己的MAC表中是否有数据帧中目标MAC地址的信息,如果有则会根据MAC表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数

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

ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3  ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP地址和一个对应的MAC地址组成.这样多个ARP条目就组成了一个ARP缓存表.当某台主机向局域网中另外的主机发送数据的时候,会根据ARP缓存表里的对应关系进行发送本文选自ARP协议全面实战手册——协议详解.攻击与防御. 1.查看ARP缓存记录本文选自ARP协议全面实战手册——协议详解.攻击与防御 [实

ARP/代理ARP

1.ARP首先讲到ARP,ARP是地址解析协议,它的作用是在以太网环境下,通过3层的IP地址来找寻2层的MAC地址,得到一张ARP缓存表.转发数据的时候根据ARP缓存表来进行传输.下图详细说明数据传输时ARP是如何一步步操作的.在配置IP地址后,不做任何ping操作,ARP缓存表是这样的: 当PC去ping R1的时候,你会发现第一个丢包了.像这样R1#ping 192.168.1.2Type escape sequence to abort.Sending 5, 100-byte ICMP E

中间人攻击——ARP欺骗 就是中间人攻击 利用报文欺骗并修改IP和mac地址之间的映射关系 让传送数据的地址失效

中间人攻击——ARP欺骗的原理.实战及防御 0x01 网关是啥? 网关是工作在OSI七层模型中的传输层或者应用层,用于高层协议的不同 网络之间的连接,网关就好比一个房间通向另一个房间的一扇门. 0x02 ARP协议 ARP(Address Resolution Protocol)地址转换协议,工作在OSI模型的数据链路层,在以太网中,网络设备之间互相通信是用MAC地址而不是IP地址,ARP协议就是用来把IP地址转换为MAC地址的.而RARP和ARP相反,它是反向地址转换协议,把MAC地址转换为I

当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值

{"当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'OrderList' 中的标识列插入显式值"} 对于这个异常可以从两个角度来处理:A:数据库执行语句  B:直接修改NHibernate中持久化类映射配置文件id节点 A数据库执行语句: 问题描述:当在数据库表主键设计为 (Orderid  int identity primary key),相对这个主键IDENTITY_INSERT默认设置为OFF,就是不能够显示插入主键id的值,例子如下: insert int