我想捕获从我的机器出来的数据包,我正在使用libpcap(版本1.0.0-1).问题是,像这样的基本程序 -
#include <stdio.h>
#include <pcap.h>
int main(int argc, char *argv[]) {
char *dev, errbuf[PCAP_ERRBUF_SIZE];
dev = pcap_lookupdev(errbuf);
if (dev == NULL) {
fprintf(stderr, "%s\n", errbuf);
return (2);
}
printf("Device : %s\n", dev);
return (0);
}
Run Code Online (Sandbox Code Playgroud)
似乎没有显示无线接口.每次我编译并运行程序时,它都会检测到eth0.我怎样才能捕获无线接口呢?
我试图将我的设备设置为监控模式,我知道它能够处于监控模式,执行"iwconfig wlan0模式监控"工作,我运行我的代码,我可以从任何地方捕获数据包.
问题是在libpcap中它根本无法将我的设备设置为监控模式(没有输入上述命令行).在手动连接到接入点之前,我无法捕获任何数据包.
pcap_t *handler = pcap_create("wlan0",errbuff);
if(pcap_set_rfmon(handler,1)==0 )
{
std::cout << "monitor mode enabled" << std::endl;
}
handler=pcap_open_live ("wlan0", 2048,0,512,errbuff);
int status = pcap_activate(handler); //it returns 0 here.
Run Code Online (Sandbox Code Playgroud)
这是一个代码问题,还是pcap库的问题?有没有人成功将他们的设备设置为监控模式而不使用命令行?我正在使用Realtek2500 btw.
是否有任何可能的方法在Windows中"丢弃"像真正的IPS(入侵防御系统),类似于unix中的iptables.
此外,如果我使用matlab有一种方法"捕获网络上的数据包"并将其提供给神经网络?在Windows上的Matlab是.
我很难理解libpcap如何"捕获"数据但你却无法实时"丢弃"数据?
相当令人讨厌的snort不能这样做,snort只能作为Windows上的IDS,而不是Linux上的IDS/IPS,因为它能够正确规则到iptables.
我正在使用 WinPcap 学习网络编程。这是片段:
int ip_hlen = (ih->ver_ihl & 0xf) * 4; /* get ip header length */
tcp_header *th = (tcp_header *) ((u_char*)ih + ip_len);
int tcp_hlen = (ntohs(th->th_len_resv_code) & 0xf000) >> 12)*4; /* get tcp header length */
Run Code Online (Sandbox Code Playgroud)
问题是为什么ntohs只有在获取 tcp_hlennot时才使用ip_hlen。
事实上,ntohs只接受u_short作为参数解释一点。http://msdn.microsoft.com/en-us/library/windows/desktop/ms740075%28v=vs.85%29.aspx
我仍然对何时使用 ntohs 何时不使用感到困惑。
以下是 IP 和 TCP 数据包定义的结构:
/* ipv4 header */
typedef struct ip_header {
u_char ver_ihl; /* version and ip header length */
u_char tos; /* …Run Code Online (Sandbox Code Playgroud) 我开始研究python嗅探器项目.我想使用pcap模块,但我的电脑总是说"没有名为pcap的模块".我读到libpcap和pcap附带OS X但实际上它不起作用......
我在网上做了很多研究,仍然无法运行我的python代码.我怎么做运行/链接或安装pcap?
请注意,我最近更新到OSX Yosemite(但我不知道pcap之前是否有效).
我正在使用802.11 radiotap标头制作我自己的解析器,它指出数据包格式是这种格式,长度为2个字节:
在Wireshark中,标头的十六进制是以下形式,其中2个字节19 00是长度字段,但是Wireshark忽略尾随的00,并将其解释为legnth 25(十进制),而不是长度6400(十进制):
Wireshark如何(正确)知道正确地解释数字?
上面的链接说长度存储在little endian中,而我的系统是little endian,所以我不确定在那前面发生了什么?
我想在CentOS 5.5机器上安装和使用libpcap的最新版本(1.1.1).我通过以下方式配置,编译和安装了新的libpcap库:
[dima@localhost libpcap-1.1.1]$ ./configure
[dima@localhost libpcap-1.1.1]$ make
[dima@localhost libpcap-1.1.1]$ sudo make install
Run Code Online (Sandbox Code Playgroud)
但是当我尝试链接libpcap共享库(使用-lpcap链接器标志)时,我的应用程序链接到旧版本的libpcap库(使用pcap_lib_version()API调用验证).
我需要做什么才能链接到新的libpcap库?
提前致谢
我已经获得了大学课程(网络工程)的项目,该项目涉及编写数据包嗅探器,可以捕获和识别IPv4,IPv6,TCP,UDP,IP,ICMP等数据包并显示其内容.
最初我们被指示使用libpcap来做这件事,但我们刚刚被一位大学技术人员告知,目前的安装(Arch linux)不可能使用libpcap.
还有哪些方法可以在C中创建不使用libpcap的数据包嗅探器?
我不是要求这个项目的答案,我只是在问方向,我应该从哪里开始?
我希望能够在tcp客户端的tcp流中拦截/修改数据.pcap的示例显示了如何解析tcp包头/有效负载.但是假设,我想在tcp客户端读取之前修改数据包有效负载,或者完全丢弃数据包.我怎么能用pcap capure做到这一点?
我正在尝试编译一个简单的libpcap示例,
#include<stdio.h>
#include<pcap.h>
int main(int argc, char *argv[])
{
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
char filter_exp[] = "port 23";
bpf_u_int32 mask;
bpf_u_int32 net;
dev = pcap_lookupdev(errbuf);
if (dev == NULL )
{
fprintf(stderr, "couldn't find default device: %s\n", errbuf);
return (2);
}
printf("Device: %s\n", dev);
//LOOKUP NETMASK and IP
if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1)
{
fprintf(stderr, "can't get netmask for device %s\n", dev);
net = 0;
mask = 0;
}
printf("lookup\n");
pcap_t *handle;
printf("handle defined\n");
handle …Run Code Online (Sandbox Code Playgroud) 我有这段代码,可以很好地用libpcap编写一个pcap文件(仅用于测试的以太网协议):
struct ethernet {
u_char mac1[6];
u_char mac2[6];
u_short protocol;
};
int main() {
pcap_t *pd;
pcap_dumper_t *pdumper;
pd = pcap_open_dead(DLT_EN10MB, 65535);
pdumper = pcap_dump_open(pd, "test.pcap");
struct pcap_pkthdr packet_header;
struct timeval ts;
packet_header.ts = ts;
packet_header.caplen = sizeof(struct ethernet);
packet_header.len = sizeof(struct ethernet);
struct ethernet ethernet;
bzero(ethernet.mac1, 6);
bzero(ethernet.mac2, 6);
ethernet.protocol = 8977; // randomly choose
pcap_dump((u_char*)pdumper, &packet_header, (const u_char*)ðernet);
pcap_close(pd);
pcap_dump_close(pdumper);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是我想尝试不使用pcap函数,所以我开始修饰上面使用的函数。
这是我发现的来源:
pcap_open_dead函数:http ://www.wand.net.nz/trac/libtrace/browser/lib/pcap_open_dead.c?rev=808a478a2459f3cf0e8bf927fcaad371138efb20
pcap_dump_open,pcap_dump等:http : //www.opensource.apple.com/source/libpcap/libpcap-2.1/libpcap/savefile.c
所以,这是我的想法:
pcap_open_dead函数是无用的,只是实例化一个pcap_t结构(我不想在我的代码中使用)并用参数填充其值。
pcap_dump_open返回一个pcap_dumper_t(似乎就像一个FILE *),只是打开文件并在其中写入标题(如果我们不关心错误处理的话)。顺便说一句,似乎它给sf_write_header提供了“ p-> tzoff”作为参数,该参数尚未在我的代码中初始化(并且仍在工作)。关于链接类型,在我们的例子中,它等于1。 …
基本上我想要一个简单的C代码,它说明了在混杂模式下捕获数据包并从中提取出ssid.
EDIT1
我正在编写我编写的代码来执行基本的嗅探.
#include <stdio.h>
#include <pcap.h>
int main(int argc, char *argv[]){
pcap_t *handle;
struct pcap_pkthdr header;
const u_char *packet;
int i;
char *dev, errbuf[PCAP_ERRBUF_SIZE];
// dev = pcap_lookupdev(errbuf);
dev = argv[1];
if( dev == NULL ){
fprintf(stderr, "Couldn't find default device\n");
return 0;
}
printf("Device: %s\n", dev);
handle = pcap_open_live( dev , BUFSIZ , 0 , 1000 , errbuf);
if( handle == NULL ){
fprintf(stderr , "couldn't open device %s: %s\n" , dev , errbuf);
return 0;
}
else{ …Run Code Online (Sandbox Code Playgroud)