Scapy(Python)中ICMP的时间戳
背景
(如果你对Scapy很熟悉,可以跳过这一部分)
我被要求制作一些基本的ICMP包,这些包“看起来不像假包”。所以我开始用Python和Scapy库写一些代码,差不多是这样的:
import scapy.all as scapy
import scapy.layers.inet as inet
import scapy.fields as fields
import sys
import random
import os
import time
'''some other code...'''
def packbuilder(sec, messagechar):
packet = inet.IP(src=configured_ips[0], dst=configured_ips[1])
packet[inet.IP].ttl = 64
packet[inet.IP].id = os.getpid() & 0xFFFF
del packet[inet.IP].chksum
packet = packet/inet.ICMP()
packet[inet.ICMP].id = icmp_id
packet[inet.ICMP].seq = sec
del packet[inet.ICMP].chksum
timestamp = int(time.time() * 10**9)
datatime = scapy.struct.pack('<Q', timestamp)
packet = packet / scapy.Raw(load=datatime + messagechar.encode() + b'\x00')
return packet
问题
大家可能都知道,Scapy中的ICMP包是通过将不同的层叠加在一起构成的,而在这些层里面有一些叫做“字段”的东西。很多ICMP包中都有一个常见的字段就是时间戳。在我借用的代码中,Scapy把日期时间添加到scapy.Raw中,这是Scapy包的最后一层(我不知道这个最后一层是否真的必须有),所以它添加了时间戳……但实际上并没有
于是我开始查看Scapy的库,最终找到了我想要的东西,虽然是因为另一个问题,这也是整个事情的关键:
scapy.layers.inet.ICMPTimeStamp字段
你可能会发现,与scapy.layers.inet.ICMP()不同,scapy.layers.inet.ICMPTimeStampField()不是一个包,而是一个字段,所以你不能像叠加包那样去叠加它。
我一直在阅读Scapy字段简单数据类型,但这似乎是用来制作新类型包的,而我并不想制作新类型的包。我想用scapy.layers.inet.ICMPTimeStampField()来制作一个带时间戳字段的ICMP包,但我不知道该怎么用。也许我得制作一种新类型的包(我知道……),但至少这是为了在ICMP方法中常用。
import scapy.all as scapy
import scapy.layers.inet as inet
import scapy.fields as fields
import sys
import random
import os
import time
'''some other code...'''
def packbuilder(sec, messagechar):
packet = inet.IP(src=configured_ips[0], dst=configured_ips[1])
packet[inet.IP].ttl = 64
packet[inet.IP].id = os.getpid() & 0xFFFF
del packet[inet.IP].chksum
packet = packet/inet.ICMP()
packet[inet.ICMP].id = icmp_id
packet[inet.ICMP].seq = sec
del packet[inet.ICMP].chksum
timestamp = int(time.time() * 10**9)
datatime = scapy.struct.pack('<Q', timestamp)
packet = packet / scapy.Raw(load=datatime + messagechar.encode() + b'\x00')
return packet
我真正需要的是这样的:
1 个回答
暂无回答