这是我的代码:
\n\nimport pcap ,struct\n\npack=pcap.pcap()\npack.setfilter(\'udp\')\nkey=\'\'\nfor recv_time,recv_data in pack:\n recv_len=len(recv_data)\n if recv_len == 102 and recv_data[42]== chr(02) and recv_data[101] == chr(03):\n print struct.unpack(\'>I\',recv_data[49:53])[0]\n print \'\xe7\x99\xbb\xe9\x99\x86\xe4\xba\x86\'\n elif recv_len == 55:\n print struct.unpack(\'>I\',recv_data[49:53])[0]\n print \'\xe7\x99\xbb\xe9\x99\x86\xe4\xba\x86\'\nRun Code Online (Sandbox Code Playgroud)\n\n我用它来安装 pcap : sudo apt-get install python-libpcap,它安装了,
但是当我运行代码时,它显示错误:
\n\nTraceback (most recent call last):\n File "weapon.py", line 2, in <module>\n import pcap ,struct\nImportError: No module named pcap\nRun Code Online (Sandbox Code Playgroud)\n\n我能做些什么 ,
\n\n谢谢
\n我想用c ++写一个程序来读取一个pcap文件并获取数据包的信息,比如len,sourc ip,flags等等.现在我找到了下面的代码,我想它会帮助我获取信息,但是我有一些问题:首先我想知道我应该在程序中添加哪个库,之后是什么是pcap_next,如何从pcap文件中获取句柄?
/* Grab a packet */
packet = pcap_next(handle, &header);
if (packet == NULL) { /* End of file */
break;
}
printf ("Got a packet with length of [%d] \n",
header.len);
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下命令捕获 pcap 文件。
tcpdump -c 25 -i eth0.
我想专门为 Radius 协议捕获数据包。我试过
tcpdump -c 25 -i etho radius,它给出了语法错误。
我有一组 PCAP 文件,我需要检索所有 ip。我找到了这个链接,目前一直在使用这个命令。
tshark_path + " -r " + infile + " -T fields -e ip.dst | sort | uniq
Run Code Online (Sandbox Code Playgroud)
问题是,这似乎是很慢,还时不时返回的东西,看起来像这样:128.219.232.12,10.78.0.131。我的问题是是否有更好的方法来做到这一点,它可以运行得更快、更准确。
同样值得注意的是,我的代码是在 python 中的。
我需要读取 PCAP 文件,修改一些字段(实际上是 IPv4 源和目标以及以太网源和目标)。PCAP 经过预过滤,仅包含以太网上的 IPv4 数据包。
到目前为止,我尝试使用 scapy 来执行此操作,但它存在严重的内存问题。当读取 ~350MB PCAP 文件时,我的 16GB RAM 已完全填满。其实只是读书而已。我还没有对该文件执行任何其他操作。我也找到了这个答案,并且通过这些更改,阅读速度非常快。一旦我开始修改数据包,内存就会再次膨胀。Scapy 实际上在这种情况下不可用
我也考虑过使用其他工具,例如 tcprewrite,但它不能满足我的目的。每个数据包的源 MAC 始终相同,这也可以使用 tcprewrite 来完成。源IP在给定的子网范围内应该是随机的,例如均匀分布在10.0.0.0/16中。不太容易。更复杂的是目标IP,需要根据给定的流量矩阵计算出来。
所以问题是:如何读取 PCAP 文件,使用自定义函数修改四个基本字段(以太网 src+dst、IP src+dst),并将其写回(另一个)PCAP 文件?
实际上,我的框架的其余部分是用Python编写的,所以我更喜欢基于Python的解决方案。但是,由于我可以简单地调用其他脚本,因此这不是强制性的。谢谢你!
免责声明:这是一个家庭作业,但问题不在于作业,只是一般语法怪异.
我试图在一个更大的程序的上下文中使用libpcap,但是当我尝试获取每个数据包的数据包头和数据时,gcc抱怨pcap_next_ex的第三个参数是一个不兼容的指针类型.这是一些示例代码,看看我在说什么:
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
int main()
{
pcap_t *pcap;
char pcapErr[PCAP_ERRBUF_SIZE];
struct pcap_pkthdr *pktHeader;
u_char *pktData;
pcap = pcap_open_offline("somefile.pcap", pcapErr);
if (pcap == NULL)
{
fprintf(stderr, "pcap_open_offline failed: %s\n", pcapErr);
exit(EXIT_FAILURE);
}
while (pcap_next_ex(pcap, &pktHeader, &pktData) == 1)
{
// do things here
}
pcap_close(pcap);
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
手册页指出pcap_next_ex()的原型是:
int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, const u_char **pkt_data)
Run Code Online (Sandbox Code Playgroud)
我传递的是一种不兼容的指针类型到底是怎么回事?谢谢.
我想在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库?
提前致谢
我正在尝试创建一个非常简单的PCAP文件(1条UDP消息)。
使用dpkt(pcap.Writer)尝试过,没有运气,而且文档很少。
任何人都可以发表工作示例吗?
(或其他任何替代方法-我不受dpkt的约束)
我正在尝试编译一个简单的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。 …