我一直在使用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的捕获程序?
我需要将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()插入标头?
以下代码是否正确计算无线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) 我使用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),并注意:
我仔细检查了我的源代码,没有发现任何可疑的块或逻辑导致如此大的间隔。所以我想知道是否是由于功能的问题pcap_dispatch。
pcap_dispatch 或 pcap_next 甚至 libpcap 文件描述符是否存在效率问题?谢谢!
我有一个纳秒的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) // 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数据包,并能够在不丢失数据包的情况下对数据进行一些处理?
我正在使用libpcap编写一个嗅探器.我的问题是,在调用pcap_loop()或pcap_next()并实际获取数据包(调用回调函数)之间有7-10秒的延迟.但是,如果我在同一设备上使用带有相同过滤器的wireshark,则在按下"开始"按钮后没有这样的延迟.为什么我的程序有延迟,有没有办法解决这个问题?
我正在研究atheros wifi芯片.使用设备将设备设置为监控模式
airmon-ng start wlan0
Run Code Online (Sandbox Code Playgroud)
我确信有足够的流量可以收听,因为我可以看到wireshark中的软件包.谢谢.
在使用Linux pthread和libpcap时,我注意到使用时有些奇怪的行为pcap_breakloop。我的目标是:
打开一个新线程,该线程将运行pcap_loop并处理捕获的数据包,而主线程将执行其他操作。收到信号(SIGINT)或退出时,将设置一个全局变量,并且主线程将发出指令pcap_breakloop以结束第二个线程,然后完成自身。
这个想法可能仍然需要一些工作,但是我注意到的奇怪行为是:
当我们创建一个bpf_program结构和编译pcap_compile,以进一步使用它作为在捕获过滤器,一旦我们退出使用循环pcap_breakloop有8个字节(包括内存泄漏pcap_freecode和pcap_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) 我的观察是否正确,即无法在同一桌面上运行的 Wireshark 中分析来自 webRTC 流的 RTP/RTCP 数据包来分析 RTP 数据包,因为浏览器会使用 DTLS/SRTP 对它们进行加密?
我知道有一些浏览器 API 可以提供帮助,但是还有其他方法吗?libpcap如果用来写一些工具可能也会有同样的问题。
来自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 文件组成。
感谢您的任何建议。