在python中解析PCAP文件

时间:2016-01-04 04:48:09

标签: python parsing pcap packets dpkt

我正在尝试解析python中的Pcap文件。当我运行此代码时

location /nothingtosee {
    auth_basic "Admin Login";
    auth_basic_user_file /etc/nginx/pma_pass;
}

location ~ /favicon.ico {
    access_log off;
    log_not_found off;
}

location ~ \.php$ {
    try_files $uri /index.php;
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}
access_log  /var/log/nginx/$host-access.log;
error_log   /var/log/nginx/wpms-error.log;
}

我得到垃圾值而不是获得以下输出:

  

以太网(src ='\ x00 \ x1a \ xa0kUf',dst ='\ x00 \ x13I \ xae \ x84,',   data = IP(src ='\ xc0 \ xa8 \ n \ n',off = 16384,dst ='C \ x17 \ x030',sum = 25129,   len = 52,p = 6,id = 51105,data = TCP(seq = 9632694,off_x2 = 128,   ack = 3382015884,win = 54,sum = 65372,flags = 17,dport = 80,sport = 56145)))

任何人都可以告诉我如何获得以上输出?

3 个答案:

答案 0 :(得分:1)

请确保已打开文件以将其读取为二进制文件。

https://stackoverflow.com/a/15746971

f = open(pcapfile, 'rb')
pcap = dpkt.pcap.Reader(f)

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    print(eth)

答案 1 :(得分:0)

如果文件的链路层头类型不是以太网,如果您尝试将数据包解析为以太网数据包,则无法获得有用的信息。 dpkt文档并不是很好,但是有一些方法可以获得链接层头类型;在任何程序读取pcap文件之前,任何尝试从原始数据包数据中获取任何必须确定文件中的链接层标题类型,以及它从link-layer header type上的原始数据包数据中提取信息的方式(如果文件没有链接层标题类型,则退出)解析)。

(并随意告诉Oberheide先生,他的代码已被破坏,因为它没有检查链路层标头类型!)

答案 2 :(得分:0)

您尝试做的只能在python REPL shell中运行。当你想要它从python脚本工作时,你需要像这样调用repr方法:

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    print repr(eth)  # this is key
  

以太网(src ='\ x00 \ x1a \ xa0kUf',dst ='\ x00 \ x13I \ xae \ x84,',data = IP(src ='\ xc0 \ xa8 \ n \ n',off = 16384 ,dst ='C \ x17 \ x030',sum = 25129,   len = 52,p = 6,id = 51105,data = TCP(seq = 9632694,off_x2 = 128,   ack = 3382015884,win = 54,sum = 65372,flags = 17,dport = 80,sport = 56145)))

我假设您有一个具有正确以太网数据包的pcap,并且您已经检查过像链路层一样。