【问题标题】:How to get a field value from a packet layer if the field name is a string variable?如果字段名称是字符串变量,如何从数据包层获取字段值?
【发布时间】:2020-07-06 00:43:30
【问题描述】:

我有 layerfield 作为变量。如何获取字段值?

#packet is just a sniff() packet

layer = "IP"
field = "src"

# I need something like
fieldValue = packet[layer].field

# or
fieldValue = packet[layer].getfieldval(field)


print("Layer: ", layer, " Field: ", field, " Value: ", fieldValue)
#Output- Layer: IP Field: src Value: 192.168.1.1

【问题讨论】:

    标签: python layer scapy packet packet-sniffers


    【解决方案1】:

    假设我们正在用 scapy 嗅探数据包,并想查看其中的值。其中大部分是使用scapy documentation 来查找每一层的属性。您也可以在 python/scapy 解释器中使用dir(packet) 执行此操作,以查看它具有哪些属性和方法。例如:

    >>> dir(packet)
    ...
     'show',
     'show2',
     'show_indent',
     'show_summary',
     'sniffed_on',
     'sprintf',
     'src',
    ...
    

    要从数据包中动态获取源属性,我们需要使用getattr function,它可以从对象中获取方法和属性。

    # Required if you are not using the scapy interpreter
    from scapy.all import sniff, IP
    
    layer = "IP"
    field = "src"
    
    # Sniff 4 packets, filtering for packets with an IP layer
    packet_list = sniff(filter="ip", count=4)
    # Choose first packet arbitrarily
    packet0 = packet_list[0]
    # We can get the attribute reflexively because python allows it
    field_value = getattr(packet0[layer], field)
    
    # Print this information
    print("Layer: ", layer, " Field: ", field, " Value: ", field_value)
    ---
    > Layer:  IP  Field:  src  Value:  192.168.1.246
    

    【讨论】:

    • 我犯了一个错误,packet_list 应该是 packet0。我修好了,所以它应该运行。请记住,在 *nix 上,您需要以 sudo 身份运行 python/scapy 来捕获流量。
    • @Cabbo 我看到了你的编辑(并欣赏它),但在我的测试中,似乎没有必要将IP 从 scapy.all 中分离出来。如果修复有更多上下文,请务必修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多