gpt4 book ai didi

c - 无法使用 ioctl 更改 mac 地址

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:43 25 4
gpt4 key购买 nike

最近我对如何使用低级方法在 Linux 中访问和设置网络接口(interface)很感兴趣。所以我发现,在网上搜索 ioctl 回调,我学会了如何使用它。我开始写下一些东西,但今天我在更改接口(interface)的 mac 地址时遇到了问题。

我使用的代码是:

int change_mac(int handler){
srand(times(NULL));

get_hwaddr(handler,&req);
for(int i=0;i<6;i++){
req.ifr_hwaddr.sa_data[i]=(char)rand();
}
char err=ioctl(sock,SIOCSIFHWADDR,&req);
if(err<0){
printf("Problem to change the mac address with a random one\n %i",err);
exit(0);
}
}

int get_hwaddr(int handler,struct ifreq* req_a){
if(handler>=current){
return -1;
}
strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]));

if(ioctl(sock,SIOCGIFHWADDR,req_a)<0){
return -2;
}
}

为了更好地理解我的代码,“interfaces”变量是一个 char**,当我初始化一个新接口(interface)时,我在其中存储接口(interface)的名称,并且在该函数中将名称存储在该变量中后,我返回一个 int作为处理程序。

在更改mac地址之前,我从代码中放下了界面。

现在,当我调用 ioctl 更改 mac 地址时,SIOCSIFHWADDR ioctl 返回 -1。

谁能帮帮我?对不起英语

最佳答案

看看netdevice(7) man page :

SIOCGIFHWADDR, SIOCSIFHWADDR

Get or set the hardware address of a device using ifr_hwaddr.The hardware address is specified in a struct sockaddr.sa_family contains the ARPHRD_* device type, sa_data the L2hardware address starting from byte 0. Setting the hardwareaddress is a privileged operation.

因此,您需要做一些事情来更改 MAC:

  1. ifr_name(必须是 nul 结尾的字符串)
  2. sa_family 包含 ARPHRD_* 设备类型(在 get_hwaddr() 中填写?)
  3. sa_data 从字节0开始的L2硬件地址(完成)
  4. 设置硬件地址是特权操作(sudo)

由于您在评论中确认您在主机上使用 sudo 运行它,请确保您的接口(interface)名称正确且以 nul 终止,即更改行:

strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]));

到行:

strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]) + 1);

这是更改 MAC 的代码示例: https://gist.github.com/mad4j/8864135

关于c - 无法使用 ioctl 更改 mac 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46093793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com