我需要将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()插入标头?
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
#define BUFFER_SIZE 65535
char errbuf[PCAP_ERRBUF_SIZE];
int main(int argc, char **argv)
{
int d;
pcap_if_t *alldevsp;
pcap_t *pkt_handle;
if((pcap_findalldevs(&alldevsp,errbuf))==-1)
{
printf("findalldevices: %s\n",errbuf);
exit(1);
}
printf("Availabel network devices are\n");
pcap_if_t *temp = alldevsp;
while((temp)!=NULL)
{
printf("%s: %s\n",(temp)->name,(temp)->description);
(temp)=(temp)->next;
}
pcap_freealldevs(alldevsp);
pkt_handle = pcap_create("wlan1",errbuf);
if(pkt_handle==NULL)
{
printf("create: %s\n",errbuf);
exit(1);
}
if((pcap_set_rfmon(pkt_handle, 1))!=0)
{
printf("Monitor mode could not be set\n");
exit(1);
}
if((pcap_set_buffer_size(pkt_handle, BUFFER_SIZE))!=0)
{
printf("ERROR\n");
exit(1);
}
if((d=(pcap_activate(pkt_handle)))!=0)
{
if(d==PCAP_ERROR_RFMON_NOTSUP)
printf("%d : PCAP_ERROR_RFMON_NOTSUP\n",d);
if(d==PCAP_WARNING)
printf("%d : PCAP_WARNING\n",d); …Run Code Online (Sandbox Code Playgroud) 我最近使用DARPA网络流量包及其在KDD99中用于入侵检测评估的派生版本.
请原谅我在计算机网络领域的有限领域知识,我只能从DARPA数据包头中获得9个功能.而不是KDD99中使用的41个功能.
我打算继续我在UNB ISCX入侵检测评估数据集上的工作.但是,我想从pcap文件中获取KDD99中使用的41个功能并将其保存为CSV格式.有没有快速/简单的方法来实现这一目标?
因为之前已经为KDD99做过,有没有可以为我做这个的库或转换器?如果没有,是否有如何从pcap文件派生这些功能的指南?
// 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数据包,并能够在不丢失数据包的情况下对数据进行一些处理?
是否有一种智能,快速的方法从PCAP文件中获取所有IP地址?我只需要(目标地址,源地址)元组.
目前我正在使用Scapy的rdpcap功能:
from scapy.all import *
pcap = rdpcap('file.pcap')
ips = set([(p[IP].fields['src'], p[IP].fields['dst']) for p in pcap if p.haslayer(IP) == 1])
Run Code Online (Sandbox Code Playgroud)
但是我的机器需要大约两分钟来解析一个70MB的PCAP文件,其中包含370个独特的提取条目......
我正在尝试安装pypcap:https://github.com/dugsong/pypcap/blob/master/INSTALL#L75
我正在尝试在Windows 10 - 64位和python 2.7.11 64位上安装它.我下载了源代码并将其移至c:\pypcap.下载pyrex并安装它.它把wpdpack文件放在c:\wpdpack安装页面中说.创建配置文件并更改了makefile.
我还在mingw他们的网站上安装了基本软件包和g++软件包.
我尝试做:
C:\pypcap> set PATH=%PATH%;c:\MinGW\bin;c:\Python27
C:\pypcap> mingw32-make
Run Code Online (Sandbox Code Playgroud)
它失败了,它得到以下错误:
In file included from C:\Python27\include/Python.h:8:0,
from pcap.c:4:
C:\Python27\include/pyconfig.h:68:16: fatal error: io.h: No such file or directory
#include <io.h>
Run Code Online (Sandbox Code Playgroud)
所以我没有这个io.h文件.我该怎么做才能编译和使用pypcap?
在尝试之前我尝试过
C:\pypcap>pip install pypcap
Collecting pypcap
Using cached pypcap-1.1.4.tar.gz
Complete output from command python setup.py egg_info:
pcap.h not found
----------------------------------------
Command "python setup.py egg_info" failed with error …Run Code Online (Sandbox Code Playgroud) 我有连续生成的pcap文件给我.它想要不断地将它们送到"永远在线"的tshark/wireshark.这是我尝试过的(OSX)
mkfifo tsharkin
tail -f -c +0 tsharkin | tshark -l -i - > tsharkout 2>stderr &
cat file1.pcap > tsharkin
Run Code Online (Sandbox Code Playgroud)
以上工作正常,我从tsharkout中的file1.pcap得到预期的输出
cat file2.pcap > tsharkin
Run Code Online (Sandbox Code Playgroud)
以上不起作用,我在tsharkout中什么都没得到,但是我在stderr中得到"1包丢弃"+"3包捕获"
cat file2.pcap > tsharkin
Run Code Online (Sandbox Code Playgroud)
再次尝试使tail/tshark进程停止/崩溃
我尝试再次这样做,但这次先使用file2.pcap然后再使用file1.pcap.这次file2.pcap处理得很好,file1.pcap使tail/tshark进程停止/崩溃.因此,我将得出结论,两个pcap文件没有任何问题,但似乎tshark不喜欢抛出多个pcap文件.
为了测试它,我尝试首先使用mergecap合并file1.pcap和file2.pcap,然后将其输入到tshark
mergecap -F pcap -w file1_2.pcap file1.pcap file2.pcap
cat file1_2.pcap > tsharkin
Run Code Online (Sandbox Code Playgroud)
这工作正常,我得到tsharkout中file1.pcap和file2.pcap的预期输出
问题是我的pcap文件一路走来,所以我不能在将它们全部合并到tshark之前.我需要能够在pcap文件到达时将其提供给"永远运行"的tshark.我怎样才能做到这一点?
我想使用python/scapy迭代一个pcap文件包.该文件有多个协议.当前迭代是特定于协议的,因此如果下一个数据包来自另一个协议,则迭代会"跳转".我不知道为什么现在这样.无论协议是什么,我都想要数据包.
小例子:
data = 'new.pcap'
zz = rdpcap(data)
sessions = zz.sessions()
for session in sessions:
for packet in sessions[session]:
eth_src = packet[Ether].src
eth_type = packet[Ether].type
if eth_src == "00:22:97:04:06:b9" and eth_type == 0x8100:
# do anything
elif eth_src == "00:22:97:04:06:b9" and eth_type == 0x22f0:
# do anything
else:
# do anything
Run Code Online (Sandbox Code Playgroud)
有谁知道原因?
我用 scapy python 解析 pcap 文件,并且该 pcap 中有 TCP 数据包,我想知道这个 pcaket 的答案是什么,我该怎么做?
例如:客户端和服务器 TCP 流
客户端->服务器:“嗨” 服务器->客户端:“你好吗”
当我收到“hi”数据包(使用 scapy)时,我怎样才能得到“你好吗”?
我有一组pcap包含来自两台主机的 UDP 流量的文件,并且必须定期对此流量执行一些分析。
理想情况下,我希望避免频繁设置具有特定 IP 的本地接口等来重播这些文件。我希望能够简单地在我的环回接口上重播它们,使用tcprewrite更改pcap.
这是它目前的样子:
# Remove mac addresses for loopback interface
# Remove VLAN tags
tcprewrite \
--enet-smac=00:00:00:00:00:00 \
--enet-dmac=00:00:00:00:00:00 \
--enet-vlan=del \
--infile="${INFILE}" \
--outfile="${OUTFILE}.tmp"
# Change source and destination IP to loopback
# Regenerate IP checksums
tcprewrite \
--srcipmap=0.0.0.0/0:127.0.0.1 \
--dstipmap=0.0.0.0/0:127.0.0.1 \
--fixcsum \
--infile="${OUTFILE}.tmp" \
--outfile="${OUTFILE}"
Run Code Online (Sandbox Code Playgroud)
看起来差不多可以工作了。然后我可以简单地使用我的环回重播这些文件,tcpreplay并且我看到数据包使用tcpdumpon lo。尽管如此,似乎任何常规用户空间套接字都看不到环回上的此流量。
据我了解,这似乎与Linux上环回接口处理第2层的方式有关。看来我需要将第 2 层标头 (DLT) 从普通协议重写ethernet为nullBSD 环回使用的协议。
任何有将以太网上捕获的 UDP 流量重放到环回接口的经验的人将不胜感激。pcap我不知道如何使用/来实现这一点,或者是否可行 …