通过原始套接字发送源MAC和IP
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过原始套接字发送源MAC和IP相关的知识,希望对你有一定的参考价值。
我对原始套接字有点新意,我正在尝试遵循this教程。我可以看到与wireshark传输的数据包很棒。
但是,该教程的源MAC和源IP缺失并解释了here和here。
问题是当我尝试将源MAC复制到已知结构时:
ioctl(fd,SIOCGIFINDEX,&ifr) // `fd` and `ifr` already defined
ioctl(fd,SIOCGIFHWADDR,&ifr)
const unsigned char* mac = (unsigned char*)ifr.ifr_hwaddr.sa_data;
printf("my MAC address: %02X:%02X:%02X:%02X:%02X:%02X
", // prints my mac- works fine
mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
memcpy(&req.arp_sha, mac, sizeof(req.arp_sha)); // `req` is already defined
当我调试代码时,mac
包含真正的MAC地址,req.arp_sha
包含其他内容。
我也试过这样复制:
req.arp_sha[0] = mac[0];
req.arp_sha[1] = mac[1];
编辑MAC我期待的是:08:00:27:E7:56:0B
MAC得到的是:00:00:0a:00:02:0f
当我对IP地址做同样的事情时,它很有用,我可以在wireshark上看到它。
这是IP代码:
ioctl(fd,SIOCGIFADDR,&ifr);
struct sockaddr_in* ipaddr = (struct sockaddr_in*)&ifr.ifr_addr;
const char * myIp = inet_ntoa(ipaddr->sin_addr);
printf("my IP address: %s
", myIp);
memcpy(&req.arp_spa,&ipaddr->sin_addr,sizeof(req.arp_spa));
我不明白我在这里做错了什么,我很乐意为你提供指导。
谢谢。
答案
请问这种类型?
struct ether_arp {
struct arphdr ea_hdr; /* fixed-size header */
u_int8_t arp_sha[ETHER_ADDR_LEN]; /* sender hardware address */
u_int8_t arp_spa[4]; /* sender protocol address */
u_int8_t arp_tha[ETHER_ADDR_LEN]; /* target hardware address */
u_int8_t arp_tpa[4]; /* target protocol address */
};
您没有显示整个代码,是吗?
在你说的第一个片段不起作用,你是否在printf之后立即调用memcpy?它不起作用的唯一可能性是mac是指向ifr.ifr_hwaddr.sa_data的指针。你打电话时可能会覆盖sa_data的内容
memcpy(&req.arp_sha, mac, sizeof(req.arp_sha));
尝试将mac定义为数组,并将ifr.ifr_hwaddr.sa_data中的内容复制到mac。
在第二个片段中,它应该不会很好,即使你说它有效。这不行:
memcpy(&req.arp_spa,&ipaddr->sin_addr,sizeof(req.arp_spa));
sin_addr是一个unsigned long,它是little endian,而req.arp_spa应该是big endian。你确定它在wireshark中看起来正确吗?你能打印出来吗?
以上是关于通过原始套接字发送源MAC和IP的主要内容,如果未能解决你的问题,请参考以下文章