使用 Linux c 套接字捕获 Beacon 帧

Posted

技术标签:

【中文标题】使用 Linux c 套接字捕获 Beacon 帧【英文标题】:capture Beacon frames using Linux c sockets 【发布时间】:2018-10-24 07:14:52 【问题描述】:

我想使用 Linux c 套接字从我的路由器捕获信标帧。

    什么是套接字打开定义? 那些合适吗? sock_raw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))

    应该处于管理模式还是监控模式?

非常感谢

大理 p.s 我不想使用第三方库来实现这个,比如 libpcap。

【问题讨论】:

【参考方案1】:

这是我的知识回答:

1) 是的。你声明int sock_raw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));是正确的

2) 您的设备需要处于监控模式才能捕获信标帧。如果您的 linux 机器安装了 aircrack-ng 套件,您可以使用 airmon-ng start [DEV NAME] 将其置于监控模式,或者如果安装了 net-tools 等,您可以执行以下操作(示例使用 'wlan0' 作为我要放置的设备进入监控模式):

ifconfig wlan0 down 
iw wlan0 set type monitor 
ip link set wlan0 name wlan0mon && ifconfig wlan0mon up

接下来,如果你想在 C 中继续使用你的监控模式套接字,你可以使用以下命令:

struct ifreq ifr;
struct sockaddr_ll ll;
assert(sizeof(ifr.ifr_name) == IFNAMSIZ);

int sock_raw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
strncpy(ifr.ifr_name, "wlan0mon", sizeof(ifr._ifr_name)); 
ioctl(sock_raw, SIOCGIFINDEX, &ifr);

ll.sll_ifindex = ifr.ifr_ifindex;
ll.sll_protocol = htons(ETH_P_ALL);
ll.sll_family = PF_PACKET;

bind(sock_raw, (struct sockaddr *)&ll, sizeof(ll));

此 C 代码设置原始套接字以供监视模式使用,然后将其绑定到监视模式设备。现在它可以用于发送/接收 802.11 帧等。我希望这会有所帮助:)

【讨论】:

以上是关于使用 Linux c 套接字捕获 Beacon 帧的主要内容,如果未能解决你的问题,请参考以下文章

有关802.11的Beacon帧

beacon帧字段结构最全总结——HT字段总结

为啥在有探测响应时需要 Beacon

Salt Beacon 监控 windows 进程

Linux 上的 C++:设置套接字和数据包以最小化 RTP 流延迟

从连续的物理内存写入硬盘