标签: libpcap

监控模式接口上的tcpdump - 没有捕获

我一直在使用tcpdump(版本4.1.1)尝试airmon-ng设置的监控模式界面捕获无线帧.我说"尝试"因为到目前为止还没有发生任何事情.这很奇怪:

tcpdump -i mon0

上面的命令工作正常.我看到所有的信标和探测请求以及屏幕上可以显示的所有其他帧.但是,当我尝试使用输出将输出写入捕获文件时

tcpdump -i mon0 -w captures.cap

绝对没有被捕获,包括包含实际数据的第3层数据包.当我杀死tcpdump时,它给了我

13507 packets captured
13507 packets received by filter
0 packets dropped by kernel

(13507在这种情况下是任意数字)和完全空的捕获文件.

但是,当我在同一界面上使用tshark或wireshark执行捕获时,帧会被捕获到文件而没有任何问题.

我更喜欢使用tcpdump而不是wireshark,因为它没有GUI的开销,它有"-z"选项,它允许我获取捕获文件并将其传递给shell脚本,将其复制到另一台计算机在我的网络上.tshark或wireshark没有类似的功能,我非常希望避免编写程序来检查捕获文件是否存在.

我对tcpdump的工作方式有一个根本的误解,或者这里肯定有什么奇怪的事情发生?是否有更好的方法来做我正在做的事情,或者我将不得不编写自己的基于libpcap的捕获程序?

linux wireless tcpdump wireshark libpcap

5
推荐指数
1
解决办法
7702
查看次数

创建一个pcap文件

我需要将UDP数据包保存到文件中,并希望使用pcap格式重用各种可用工具(wireshark,tcpdump,...).这个帖子中有一些信息,但我找不到如何编写全局文件头'struct pcap_file_header'.

pcap_t* pd = pcap_open_dead(DLT_RAW, 65535);
pcap_dumper_t* pdumper = pcap_dump_open(pd, filename);

struct pcap_file_header file_hdr;
file_hdr.magic_number = 0xa1b2c3d4;
file_hdr.version_major = 2;
file_hdr.version_minor = 4;
file_hdr.thiszone = 0;
file_hdr.sigfigs = 0;
file_hdr.snaplen = 65535;
file_hdr.linktype = 1;

// How do I write file_hdr to m_pdumper?

while( (len = recvmsg(sd, &msg_hdr, 0)) > 0 )
  pcap_dump((u_char*)m_pdumper, &m_pcap_pkthdr, (const u_char*)&data);
Run Code Online (Sandbox Code Playgroud)

我该如何编写全局文件头?如果没有可用的特定pcap函数,如何检索文件描述符以使用write()插入标头?

c linux udp pcap libpcap

5
推荐指数
1
解决办法
2万
查看次数

802.11 FCS(CRC32)

以下代码是否正确计算无线802.11帧的FCS值?
因为以下代码生成的值与wireshark显示的值不匹配.

const uint32_t crctable[] = {
   0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
   0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
   0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
   0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
   0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
   0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
   0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
   0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
   0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
   0x7807c9a2L, …
Run Code Online (Sandbox Code Playgroud)

c crc32 pcap libpcap

5
推荐指数
1
解决办法
3095
查看次数

libpcap:pcap_dispatch 或 pcap_next 的效率是多少

我使用libpcap捕获很多数据包,然后处理/修改这些数据包并将它们发送到另一台主机。

首先,我创建一个 libpcap 处理程序handle并将其设置为非阻塞,并用于pcap_get_selecable_fd(handle)获取相应的文件描述符pcap_fd

然后我将一个事件添加pcap_fd到 libevent 循环中(就像 select() 或 epoll())。

为了避免频繁轮询这个文件描述符,每次有数据包到达事件时,我使用 pcap_dispatch 收集缓冲区的数据包并将它们放入队列中packet_queue,然后调用process_packet处理/修改/发送队列中的每个数据包packet_queue

  pcap_dispatch(handle, -1, collect_pkt, (u_char *)packet_queue);
  process_packet(packet_queue);
Run Code Online (Sandbox Code Playgroud)

我使用 tcpdump 捕获 发送的数据包process_packet(packet_queue),并注意:

  1. 一开始发送数据包的间隔很小
  2. 发送几个数据包后,间隔变为0.055秒左右
  3. 发送20个包后,间隔变为0.031秒,并保持为0.031秒

我仔细检查了我的源代码,没有发现任何可疑的块或逻辑导致如此大的间隔。所以我想知道是否是由于功能的问题pcap_dispatch

pcap_dispatch 或 pcap_next 甚至 libpcap 文件描述符是否存在效率问题?谢谢!

network-programming tcpdump libpcap

5
推荐指数
1
解决办法
1619
查看次数

使用libpcap读取纳秒pcap文件

我有一个纳秒的libpcap(nanosec.pcap)文件,并且可以使用Wireshark显示纳秒时间戳(例如2.123456789).现在我想用C语言打开纳秒级libpcap文件,源代码如下.当我尝试使用pcap_open_offine()打开nanosec.pcap时,它将返回"未知文件格式"错误.此外,通过将nanosec.pcap标头处的幻数更改为普通pcap(0x1A2B3C4D),我从终端(Ubuntu)获得了分段错误.这里的任何专家都可以建议如何使用libpcap显示时间戳的纳秒部分?提前致谢!以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <netinet/in.h>
#include <netinet/ip.h>
#include <net/if.h>
#include <netinet/if_ether.h>

#include <pcap.h>

struct UDP_hdr {
u_short uh_sport;       /* source port */
u_short uh_dport;       /* destination port */
u_short uh_ulen;        /* datagram length */
u_short uh_sum;         /* datagram checksum */
};


/* Some helper functions, which we define at the end of this file. */

/* Returns a string representation of a timestamp. */
const char *timestamp_string(struct timeval ts);

/* Report a problem with dumping the …
Run Code Online (Sandbox Code Playgroud)

c wireshark libpcap

5
推荐指数
1
解决办法
6199
查看次数

Pcap Dropping Packets

// Open the ethernet adapter
handle = pcap_open_live("eth0", 65356, 1, 0, errbuf);

// Make sure it opens correctly
if(handle == NULL)
{
    printf("Couldn't open device : %s\n", errbuf);
    exit(1);
}

// Compile filter
if(pcap_compile(handle, &bpf, "udp", 0, PCAP_NETMASK_UNKNOWN))
{
    printf("pcap_compile(): %s\n", pcap_geterr(handle));
    exit(1);
}

// Set Filter
if(pcap_setfilter(handle, &bpf) < 0)
{
    printf("pcap_setfilter(): %s\n", pcap_geterr(handle));
    exit(1);
}

// Set signals
signal(SIGINT, bailout);
signal(SIGTERM, bailout);
signal(SIGQUIT, bailout);

// Setup callback to process the packet
pcap_loop(handle, -1, process_packet, NULL);
Run Code Online (Sandbox Code Playgroud)

process_packet函数摆脱了标题并对数据进行了一些处理.然而,当它花了太长时间,我认为它正在丢弃数据包.

我如何使用pcap监听udp数据包,并能够在不丢失数据包的情况下对数据进行一些处理?

networking udp packet pcap libpcap

5
推荐指数
1
解决办法
4266
查看次数

为什么pcap_loop()和获取数据包之间有很长的延迟?

我正在使用libpcap编写一个嗅探器.我的问题是,在调用pcap_loop()或pcap_next()并实际获取数据包(调用回调函数)之间有7-10秒的延迟.但是,如果我在同一设备上使用带有相同过滤器的wireshark,则在按下"开始"按钮后没有这样的延迟.为什么我的程序有延迟,有没有办法解决这个问题?

我正在研究atheros wifi芯片.使用设备将设备设置为监控模式

airmon-ng start wlan0
Run Code Online (Sandbox Code Playgroud)

我确信有足够的流量可以收听,因为我可以看到wireshark中的软件包.谢谢.

c linux wifi libpcap

5
推荐指数
1
解决办法
1662
查看次数

libpcap:pcap_breakloop()导致内存泄漏

在使用Linux pthreadlibpcap时,我注意到使用时有些奇怪的行为pcap_breakloop我的目标是: 打开一个新线程,该线程将运行pcap_loop并处理捕获的数据包,而主线程将执行其他操作。收到信号(SIGINT)或退出时,将设置一个全局变量,并且主线程将发出指令pcap_breakloop以结束第二个线程,然后完成自身。

这个想法可能仍然需要一些工作,但是我注意到的奇怪行为是:

当我们创建一个bpf_program结构和编译pcap_compile,以进一步使用它作为在捕获过滤器,一旦我们退出使用循环pcap_breakloop有8个字节(包括内存泄漏pcap_freecodepcap_close被调用)。即使不使用线程也是如此(就像在修改过的sniffex.c libpcap示例中所示)。没有过滤器(没有pcap_compile调用或bpf_program)的相同代码退出而没有内存泄漏

libpcap会发生这种内存泄漏,就像我在其他库上看到的某些内存泄漏一样gtk吗?图书馆以后会处理吗?还是我看不到我的代码有问题?

下面是代码示例:使用pthread和修改后的sniffex示例的示例pcap_breakloop(由于代码很大,但由于实际差异很小,所以我还包括了diff原始sniffex和修改后的示例):

pthreads示例:

#include <pcap.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>

int CLOSE_PROGRAM = 0;
int CAPTURE_SETUP_SUCCESS = 0;
pcap_t *handler;    //pcap_t handler and filter structure are globals …
Run Code Online (Sandbox Code Playgroud)

c memory-leaks pthreads libpcap

5
推荐指数
1
解决办法
791
查看次数

使用 Wireshark 或类似工具分析来自浏览器 webRTC 流的 RTP 数据包

我的观察是否正确,即无法在同一桌面上运行的 Wireshark 中分析来自 webRTC 流的 RTP/RTCP 数据包来分析 RTP 数据包,因为浏览器会使用 DTLS/SRTP 对它们进行加密?

我知道有一些浏览器 API 可以提供帮助,但是还有其他方法吗?libpcap如果用来写一些工具可能也会有同样的问题。

rtp wireshark libpcap webrtc

5
推荐指数
1
解决办法
2910
查看次数

带有 Libpcap(或 WinPcap)的 Wireshark 可移植(无管理员权限)

来自https://www.wireshark.org/download.html的wireshark便携式版本 在我的Windows 10上运行良好,但不包括便携式捕获部落Libpcap或WinPcap。

在 Npcap 页面 https://nmap.org/npcap/上 写道:“Libpcap API:Npcap 使用优秀的 Libpcap 库,使 Windows 应用程序能够使用便携式数据包捕获 API,因此在 Libpcap 库页面上确实如此 :/ /www.tcpdump.org/ 有可移植的 C/C++ Libpcap库。

如何在 Wireshark 中或 Java (pcap4j) 中使用 C/C++ Libpcap库?我下载了它,它主要由 *.h 文件组成。

感谢您的任何建议。

portability wireshark libpcap

5
推荐指数
1
解决办法
9370
查看次数