如何在scapy中向会话功能添加更多列

时间:2013-12-09 11:41:29

标签: scapy

我喜欢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>,

由于

1 个答案:

答案 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()方法一样,第二个是会话的总数据大小。

相关问题