从 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)
我正在构建的工具中以非交互方式(即作为库)使用 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)