gpt4 book ai didi

c++ - 在 Linux 上嗅探以太网接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:55 26 4
gpt4 key购买 nike

我试图只捕获来自特定接口(interface)的数据包,但我正在从所有接口(interface)获取数据包。我做错了什么?

bool Snooper::raw_init (const char *device)
{

uid_t privid = geteuid();
int retval;
bool retVal = false;

do {
if ((retval = setuid(0)) != 0) {
perror("seteuid error");
break;
}

cap_t caps = cap_get_proc();
cap_value_t cap_list[2];
cap_list[0] = CAP_NET_RAW;
cap_list[1] = CAP_SETUID;
if ((retval = cap_set_flag(caps, CAP_EFFECTIVE, 2, cap_list, CAP_SET)) == -1) {
perror("cap_set_flag error");
break;
}
if ((retval = cap_set_proc(caps)) == -1) {
perror("cap_set_proc error");
break;
}

struct ifreq ifr;
memset(&ifr, 0, sizeof (struct ifreq));

/* Open A Raw Socket */
if ((m_sockfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))) < 1) {
perror("Snooper::raw_init:socket Error");
break;
}

/* Set the device to use */
strncpy(ifr.ifr_name, device, strlen(device) + 1);

/* Get the current flags that the device might have */
if (ioctl(m_sockfd, SIOCGIFFLAGS, &ifr) == -1) {
perror("Error: Could not retrieve the flags from the device.\n");
break;
}

printf("The interface is ::: %s\n", device);
perror("Retrieved flags from interface successfully");

/* Set the old flags plus the IFF_PROMISC flag */
ifr.ifr_flags |= IFF_PROMISC;
if (ioctl(m_sockfd, SIOCSIFFLAGS, &ifr) == -1) {
perror("Error: Could not set flag IFF_PROMISC");
break;
}
printf("Setting interface ::: %s ::: to promisc\n", device);

/* Configure the device */
if (ioctl(m_sockfd, SIOCGIFINDEX, &ifr) < 0) {
perror("Error: Error getting the device index.\n");
break;
}
retVal = true;
} while(false);

if ((retval = seteuid(privid)) != 0) {
perror("seteuid error");
}
return retVal;
}

我首先验证我可以 suid 到 root,因为 IFF_PROMISC 需要它。然后为 UDP 流量创建套接字,为设备执行 IOCtl,最后为 PROMISC 创建 IOCtl。

现在我已经准备好一个套接字,我在 recv 上循环,但是我也从其他接口(interface)获取数据包。

最佳答案

要从特定接口(interface)捕获数据包,您必须使用 bind 将套接字绑定(bind)到该接口(interface)功能。你可以看看this answer举个例子。

关于c++ - 在 Linux 上嗅探以太网接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21323023/

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