从 scapy 数据包中获取信息字符串

Get info string from scapy packet

我正在构建的工具中以非交互方式(即作为库)使用 scapy 2.3.1-dev。我想获得有关数据包的一串人类可读的信息,例如您从 scapy.all.Packet.show() 获得的信息。我已经尝试使用提供信息的所有三种方法(packet.show()packet.show2()packet.display()),但是 none 这些 return 任何东西,而不是它们打印出我想要的信息。

此外,packet.__repr__() 提供的 return 信息还不够。

是否有任何 functions/methods 可以 return 格式良好的文本,例如packet.show() 打印它们?如果没有,在输出到控制台之前,是否有某种方法 capturing/intercepting show() 的输出?

我知道我可以使用 packet.fields 中的信息进行自己的字符串格式化,但我正在努力避免必须这样做。

一种可能的方法是将 packet.show() 函数的输出重定向到变量 capture。下面的代码提供了一个示例:

import sys
from StringIO import StringIO
from scapy.layers import inet
from scapy.all import *

#Create scapy packet
pack=inet.Ether()/inet.IP()/inet.TCP()

#Redirect output of print to variable 'capture'
capture = StringIO()
save_stdout = sys.stdout
sys.stdout = capture
pack.show()
sys.stdout = save_stdout

#capture.getvalue() is a string with the output of 'pack.show()' 
print capture.getvalue()

#Verify that capture.getvalue() is a string
print isinstance(capture.getvalue(), basestring)

程序的输出是:

###[ Ethernet ]###
  dst       = ff:ff:ff:ff:ff:ff
  src       = 00:00:00:00:00:00
  type      = 0x800
###[ IP ]###
     version   = 4
     ihl       = None
     tos       = 0x0
     len       = None
     id        = 1
     flags     = 
     frag      = 0
     ttl       = 64
     proto     = tcp
     chksum    = None
     src       = 127.0.0.1
     dst       = 127.0.0.1
     \options   \
###[ TCP ]###
        sport     = ftp_data
        dport     = http
        seq       = 0
        ack       = 0
        dataofs   = None
        reserved  = 0
        flags     = S
        window    = 8192
        chksum    = None
        urgptr    = 0
        options   = {}

True

你可以通过show(dump=True)使用show()方法,然后它会return串给你。 为什么我知道,因为我阅读了 show() 方法的代码。

代码如下:

def main():
    packet = scapy.rdpcap('1.pcap')
    for p in packet:
        a = p.show(dump=True)
        print type(a)
        print a
        exit(0)