我喜欢scapy中的函数pkt.sessioins(),我如何在这个表中添加更多列:
x.sessions()
{'TCP 10.0.2.15:32896 > 173.194.34.159:80': <PacketList: TCP:11 UDP:0 ICMP:0 Other:0>,
由于
答案 0 :(得分:0)
要添加更多信息,您需要定义自己的“会话提取器”功能并将其传递给.sessions()
方法。
但您无法添加有关整个会话的信息(如总数据大小),因为只有在读取整个会话时才知道。
例如,添加总数据大小的快捷方法是创建自己的sessions()
函数(改编自原始PacketList.sessions()
方法:
def sessions(plist, session_extractor=None):
if session_extractor is None:
def session_extractor(p):
sess = "Other"
if 'Ether' in p:
if 'IP' in p:
if 'TCP' in p:
sess = p.sprintf("TCP %IP.src%:%r,TCP.sport% > %IP.dst%:%r,TCP.dport%")
elif 'UDP' in p:
sess = p.sprintf("UDP %IP.src%:%r,UDP.sport% > %IP.dst%:%r,UDP.dport%")
elif 'ICMP' in p:
sess = p.sprintf("ICMP %IP.src% > %IP.dst% type=%r,ICMP.type% code=%r,ICMP.code% id=%ICMP.id%")
else:
sess = p.sprintf("IP %IP.src% > %IP.dst% proto=%IP.proto%")
elif 'ARP' in p:
sess = p.sprintf("ARP %ARP.psrc% > %ARP.pdst%")
else:
sess = p.sprintf("Ethernet type=%04xr,Ether.type%")
return sess
sessions = defaultdict(lambda: [plist.__class__(), 0])
for p in plist.res:
sess = session_extractor(plist._elt2pkt(p))
sessions[sess][0].append(p)
sessions[sess][1] += len(p)
return dict(sessions)
结果dict
中的每个值(键不会更改)是两个元素list
,第一个是PacketList
{1}}对象,与.sessions()
方法一样,第二个是会话的总数据大小。