Tag: libpcap

ohrwurm如何使用libpcap和arpspoof来破坏RTP流量?

我正在尝试评估名为ohrwurm的工具,该工具声称能够破坏两个SIP端点之间的RTP流量。 通过阅读其源代码,我不相信它有效,并且在我尝试之前想要其他人的意见。 它的前提很简单: 假设端点A的IP地址为192.168.0.11,端点B的IP地址为192.168.0.22。 在与A和B相同的子网上的第三个盒子C上,在两个SSH会话中执行以下命令: arpspoof 192.168.0.11 arpspoof 192.168.0.22 执行ohrwurm。 看一下ohrwurm的源代码,它执行以下操作: 将/ proc / sys / net / ipv4 / ip_forward设置为1。 在混杂模式下使用libpcap拦截上面两个框之间的所有IP数据包。 对于那些SIP的数据包,请抓取RTP端口号。 对于那些UDP以及之前抓取的两个RTP端口之间的数据包,请对RTP内容进行模糊处理。 这是我没有得到的。 我接受arpspoof’ing将导致A和B之间的所有IP流量通过C.然后,通过将/ proc / sys / net / ipv4 / ip_forward设置为1,我们正在让内核正确转发此IP流量我们。 但我认为libpcap是只读的? 如何修改我们在原地混杂模式中嗅探的数据包? 您会注意到ohrwurm.c第401行 ,我们甚至试图丢弃RTCP数据包! 这可能吗? 我对libpcap一无所知,我很想知道更多! 请教育我。 谢谢。

如何使用winpcap分配内存以发送高性能的大型pcap文件(大小大于可用内存)?

我使用了winpcap示例中的代码发送pcap文件(来自此链接的 winpcap文档的原始代码) 它可以很好地发送一个小的pcap文件,但如果我试图发送一个大的pcap文件(大于可用内存大小说2 Gb)它肯定会失败。 此代码用于在内存中分配文件的大小,以便稍后发送 caplen= ftell(capfile)- sizeof(struct pcap_file_header); … /* Allocate a send queue */ squeue = pcap_sendqueue_alloc(caplen); 问题是如何使这个工作适用于大型文件(Gb或大于可用于分配的最大内存空间)? 我应该只分配100 Mb,然后发送队列然后接下来的100Mb? 如果是,什么是适当的缓冲区大小? 怎么做? 这里一个重要的问题是发送此文件的性能需要尽可能快地完成(我正在发送video数据包)。 总之如何管理内存来实现这一目标? 有人会有适当的解决方案或建议吗? 示例代码中的代码段(此问题的不必要代码替换为…) … #include #include … void main(int argc, char **argv) { pcap_t *indesc,*outdesc; … FILE *capfile; int caplen, sync; … pcap_send_queue *squeue; struct pcap_pkthdr *pktheader; u_char *pktdata; … […]

读取savefiles时,linktype 1上不支持入站/出站

从pcap文件获取传入数据包。 我在pcap_compile()中设置了“入站”filter,这里是部分代码。 pcap = pcap_open_offline(“test.pcap”, errbuf); if (pcap == NULL) { fprintf(stderr, “error reading pcap file: %s\n”, errbuf); exit(1); } char filter_exp[] = “inbound”; struct bpf_program pgm; if (pcap_compile(pcap, &pgm, filter_exp, 0, PCAP_NETMASK_UNKNOWN) == -1) { printf(“Bad filter – %s\n”, pcap_geterr(pcap)); return 1; } if (pcap_setfilter(pcap, &pgm) == -1) { printf(“Error setting filter – %s\n”, […]

在libpcap pcap_loop()回调上传递一个参数

因为我想用libpcap和一个小的C程序进行一些测试,我试图将一个结构从main()传递给got_packet()。 阅读libpcap教程后,我发现了这个: pcap_loop()的原型如下: int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 最后一个参数在某些应用程序中很有用,但很多时候只是设置为NULL。 假设我们有自己的参数,我们希望发送到我们的回调函数,以及pcap_loop()发送的参数。 这就是我们这样做的地方。 显然,你必须对u_char指针进行类型转换,以确保结果正确地存在; 正如我们稍后将看到的,pcap使用了一些非常有趣的方法来以u_char指针的forms传递信息。 因此,根据这个,可以使用pcap_loop()的参数号4在got_packet()中发送结构。 但经过尝试,我得到一个错误。 这是我的(错误的)代码: int main(int argc, char **argv) { /* some line of code, not important */ /* def. of the structure: */ typedef struct _configuration Configuration; struct _configuration { int id; char title[255]; }; /* init. of […]

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, […]

使用pcap从802.11帧处理不正确的mac地址

我正在通过pcap和无线工作。 根据我之前的问题回复发布的示例,我试图从无线帧中提取mac地址。 我已经为radiotap头和基本管理框架创建了结构。 出于某种原因,当涉及到尝试输出mac地址时,我打印出错误的数据。 当我与wireshark比较时,我不明白为什么无线电分接数据正确打印出来但mac地址却没有。 当我查看数据包并比较我捕获的数据包时,我看不到wireshark显示的hex转储中的任何额外填充。 我有点熟悉c而不是专家所以也许我没有正确使用指针和结构有人可以帮助告诉我我做错了什么? 谢谢,昆汀 // main.c // MacSniffer // #include #include #include #define MAXBYTES2CAPTURE 65535 #ifdef WORDS_BIGENDIAN typedef struct frame_control { unsigned int subtype:4; /*frame subtype field*/ unsigned int protoVer:2; /*frame type field*/ unsigned int version:2; /*protocol version*/ unsigned int order:1; unsigned int protected:1; unsigned int moreDate:1; unsigned int power_management:1; unsigned […]

libpcap – packet ip header length是带有loopback tcp请求的零字节

我试图使用libpcap查看TCP有效负载信息。 为此,我需要在内存中找到有效负载的位置。 我正在使用此Programming With Pcap指南来确定请求有效负载的位置。 嗅探源自与服务(环回适配器)位于同一台机器上的客户端的数据包时,IP标头长度为0.我无法成功找到请求有效负载的位置。 听循环适配器时会出现这种情况吗? 我正在使用MacOSx 10.8系统监听适配器’lo0’。 这是我正在尝试的: //this callback is called when a packet is found void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet){ ethernet = (struct sniff_ethernet*)(packet); ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); <– the result is 0 size_ip = IP_HL(ip)*4; if (size_ip < 20) { printf(" * Invalid […]

为什么pcap_datalink()总是返回1(以太网),即使在无线设备上也是如此?

我遇到的问题是pcap_datalink()总是返回1 。 根据我的理解,这是LINKTYPE_ETHERNET 。 但是,我使用的设备是无线网卡,在我的情况下是en0 。 这使我无法将卡置于监控模式,并阻止我的WLANfilter工作。 我试图在OSX和Linux上运行它,结果相同。 我也是以root身份运行的。 这是我的代码中导致问题的部分。 例如,假设dev设置为en0 (Mac上的无线设备)。 #include #include #include int main(int argc, char *argv[]) { pcap_t *pcap_h; char *dev, errbuf[PCAP_ERRBUF_SIZE]; struct bpf_program fp; struct pcap_pkthdr header; const u_char *packet; if(argc < 2) { printf("Usage: %s device\n", argv[0]); exit(EXIT_FAILURE); } dev = argv[1]; if((pcap_h = pcap_create(dev, errbuf)) == NULL) { […]

我可以使用pcap库接收ipv6数据包吗?

我正在尝试将hping3转换为hping6。 hping3使用Pcap库接收IPv4数据包。 但我需要接收IPv6数据包。

如何在c 使用pcap执行扫描附近的wifi ap

基本上我想要一个简单的C代码,它说明了在混杂模式下捕获数据包并从中提取出ssid。 EDIT1 我正在编写我编写的代码来执行基本的嗅探。 #include #include 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 , […]