pcap_set_rfmon 成功但实际上不起作用
pcap_set_rfmon succeeds but doesn't actually work
我目前正在尝试在 Ubuntu 20.04.3 LTS 上使用 libpcap 设置一个简单的数据包嗅探器,并且在使用 pcap_set_rfmon() 设置监控模式时面临很多困惑。我的代码和我使用的编译命令的修剪版本如下:
g++ trimsniff.cc -g -o tsniff -L/usr/local/lib -lpcap
代码:
#include <iostream>
#include <pcap/pcap.h>
#include <string>
#include <cstdlib>
#include <cstring>
using namespace std;
int main(int argc, char *argv[])
{
//Declare needed variables
const int MAX_NAME_LEN = 20;
char errbuf[PCAP_ERRBUF_SIZE];
char dev[MAX_NAME_LEN];
pcap_if_t *alldevs;
pcap_if_t *alldevsp;
pcap_t * handle;
//Check Libpcap version number
cout << pcap_lib_version() << endl << endl;
//Initialize the library for local charactr encoding & error check
if(pcap_init(PCAP_CHAR_ENC_LOCAL, errbuf))
{
fprintf(stderr, "Couldn't Initialize pcap; %s\n", errbuf);
}
else
{
cout << "PCAP Successfully Initialized" << endl << endl;
}
//trimmed version of device selection code, this assumes an
//available device was specified in the command line call
//(I make sure of this in the full code without error)
strcpy(dev, argv[1]);
cout << endl << "Selected Device: " << dev << endl << endl;
//Open device for sniffing
handle = pcap_create(dev, errbuf);
//Try setting monitor mode and error check, trimmed down to the error I'm facing
int mm_set = pcap_can_set_rfmon(handle);
if(mm_set==0)
{
fprintf(stderr, "Error setting monitor mode: Device doesn't have MM capability\n");
}
else
{
if(!pcap_set_rfmon(handle,1))
{
cout << "Monitor Mode Enabled, pcap_set_rfmon(...) == 0" << endl;
}
}
cout << endl;
//Using pcap_set_rfmon() here to illustrate issue, this will output a 0
//indicating success but the pcap_activate() error check contradicts this
cout << pcap_set_rfmon(handle,1) << endl;
//Activate the interface for sniffing
if(pcap_activate(handle))
{
cout << endl;
pcap_perror(handle,"Error");
cout << endl;
pcap_set_rfmon(handle,0);
pcap_activate(handle);
}
pcap_close(handle);
return 0;
}
我的设备当然可以使用监控模式,因为我过去曾使用终端命令和 aircrack-ng 成功监控无关的网络流量。
但是当我尝试使用 libpcap 函数时,pcap_set_rfmon() 将 return 0 就好像它成功了一样,而 pcap_can_set_rfmon() 与此矛盾并且 return s 0 表示不能设置监控模式。我修剪后的代码的输出如下,带零的行是 pcap_set_rfmon() 的输出,表示成功。
libpcap version 1.11.0-PRE-GIT (with TPACKET_V3)
PCAP Successfully Initialized
Selected Device: wlx00c0caadea0a
Error setting monitor mode: Device doesn't have MM capability
0
Error: That device doesn't support monitor mode
最后一条错误消息来自调用 pcap_activate()(使用 libpcap 错误打印函数 pcap_perror()),在尝试使用 pcap_set_rfmon() 设置监控模式后。
有谁知道这个矛盾从何而来and/or如何解决?
环顾四周后,这显然是基于 Linux 的系统的问题。 Libpcap 需要 link 与 libnl 才能使用 pcap_set_rfmon()
正确设置监控模式,但这并没有发生,可能是由于 libnl 库的版本冲突。此功能在我的 Mac 上工作正常,用于设置监控模式,但在 Ubuntu 中,我必须将 system()
功能与 ip link
和 iw
控制台命令一起用作解决方法。只要你事先做一些 OS 检测,让你的程序决定使用哪种方法是微不足道的。
我目前正在尝试在 Ubuntu 20.04.3 LTS 上使用 libpcap 设置一个简单的数据包嗅探器,并且在使用 pcap_set_rfmon() 设置监控模式时面临很多困惑。我的代码和我使用的编译命令的修剪版本如下:
g++ trimsniff.cc -g -o tsniff -L/usr/local/lib -lpcap
代码:
#include <iostream>
#include <pcap/pcap.h>
#include <string>
#include <cstdlib>
#include <cstring>
using namespace std;
int main(int argc, char *argv[])
{
//Declare needed variables
const int MAX_NAME_LEN = 20;
char errbuf[PCAP_ERRBUF_SIZE];
char dev[MAX_NAME_LEN];
pcap_if_t *alldevs;
pcap_if_t *alldevsp;
pcap_t * handle;
//Check Libpcap version number
cout << pcap_lib_version() << endl << endl;
//Initialize the library for local charactr encoding & error check
if(pcap_init(PCAP_CHAR_ENC_LOCAL, errbuf))
{
fprintf(stderr, "Couldn't Initialize pcap; %s\n", errbuf);
}
else
{
cout << "PCAP Successfully Initialized" << endl << endl;
}
//trimmed version of device selection code, this assumes an
//available device was specified in the command line call
//(I make sure of this in the full code without error)
strcpy(dev, argv[1]);
cout << endl << "Selected Device: " << dev << endl << endl;
//Open device for sniffing
handle = pcap_create(dev, errbuf);
//Try setting monitor mode and error check, trimmed down to the error I'm facing
int mm_set = pcap_can_set_rfmon(handle);
if(mm_set==0)
{
fprintf(stderr, "Error setting monitor mode: Device doesn't have MM capability\n");
}
else
{
if(!pcap_set_rfmon(handle,1))
{
cout << "Monitor Mode Enabled, pcap_set_rfmon(...) == 0" << endl;
}
}
cout << endl;
//Using pcap_set_rfmon() here to illustrate issue, this will output a 0
//indicating success but the pcap_activate() error check contradicts this
cout << pcap_set_rfmon(handle,1) << endl;
//Activate the interface for sniffing
if(pcap_activate(handle))
{
cout << endl;
pcap_perror(handle,"Error");
cout << endl;
pcap_set_rfmon(handle,0);
pcap_activate(handle);
}
pcap_close(handle);
return 0;
}
我的设备当然可以使用监控模式,因为我过去曾使用终端命令和 aircrack-ng 成功监控无关的网络流量。
但是当我尝试使用 libpcap 函数时,pcap_set_rfmon() 将 return 0 就好像它成功了一样,而 pcap_can_set_rfmon() 与此矛盾并且 return s 0 表示不能设置监控模式。我修剪后的代码的输出如下,带零的行是 pcap_set_rfmon() 的输出,表示成功。
libpcap version 1.11.0-PRE-GIT (with TPACKET_V3)
PCAP Successfully Initialized
Selected Device: wlx00c0caadea0a
Error setting monitor mode: Device doesn't have MM capability
0
Error: That device doesn't support monitor mode
最后一条错误消息来自调用 pcap_activate()(使用 libpcap 错误打印函数 pcap_perror()),在尝试使用 pcap_set_rfmon() 设置监控模式后。
有谁知道这个矛盾从何而来and/or如何解决?
环顾四周后,这显然是基于 Linux 的系统的问题。 Libpcap 需要 link 与 libnl 才能使用 pcap_set_rfmon()
正确设置监控模式,但这并没有发生,可能是由于 libnl 库的版本冲突。此功能在我的 Mac 上工作正常,用于设置监控模式,但在 Ubuntu 中,我必须将 system()
功能与 ip link
和 iw
控制台命令一起用作解决方法。只要你事先做一些 OS 检测,让你的程序决定使用哪种方法是微不足道的。