我正在使用scapy,我想创建一个数据包并计算其'校验和而不发送它。有办法吗?
感谢。
答案 0 :(得分:29)
我也试图避免使用show2(),因为它会打印数据包。 我在源代码中找到了一个更好的解决方案:
del packet.chksum
packet = packet.__class__(str(packet))
此代码使用正确的校验和重新生成数据包而不进行任何打印,实际上是show2()在打印前在后台运行。
答案 1 :(得分:12)
创建后,您需要从数据包中删除.chksum
值;然后拨打.show2()
>>> from scapy.layers.inet import IP
>>> from scapy.layers.inet import ICMP
>>> from scapy.layers.inet import TCP
>>> target = "10.9.8.7"
>>> ttl = 64
>>> id = 32711
>>> sport = 2927
>>> dport = 80
>>> pak = IP(dst=target, src = "100.99.98.97", ttl=ttl, flags="DF", id=id, len=1200, chksum = 0)/TCP(flags="S", sport=sport, dport=int(dport), options=[('Timestamp',(0,0))], chksum = 0)
>>> del pak[IP].chksum
>>> del pak[TCP].chksum
>>> pak.show2()
###[ IP ]###
version = 4L
ihl = 5L
tos = 0x0
len = 1200
id = 32711
flags = DF
frag = 0L
ttl = 64
proto = tcp
chksum = 0x9afd
src = 100.99.98.97
dst = 10.9.8.7
\options \
###[ TCP ]###
sport = 2927
dport = www
seq = 0
ack = 0
dataofs = 8L
reserved = 0L
flags = S
window = 8192
chksum = 0x2c0e
urgptr = 0
options = [('Timestamp', (0, 0)), ('EOL', None)]
>>>
答案 2 :(得分:1)
将此补丁添加到scapy / packet.py:
+ def checksum_silent(self):
+ """
+ Internal method that recalcs checksum without the annoying prints
+ **AFTER old checksums are deleted.**
+ """
+
+ for f in self.fields_desc:
+ if isinstance(f, ConditionalField) and not f._evalcond(self):
+ continue
+ fvalue = self.getfieldval(f.name)
+ if isinstance(fvalue, Packet) or (f.islist and f.holds_packets and type(fvalue) is list):
+ fvalue_gen = SetGen(fvalue,_iterpacket=0)
+ for fvalue in fvalue_gen:
+ fvalue.checksum_silent()
+ if self.payload:
+ self.payload.checksum_silent()
然后调用此函数,而不是调用pkt.show2()
pkt.checksum_silent()
。 (请记住首先执行del pkt[IP].chksum
和del pkt[UDP].chksum
等),如上一个答案中所示。
此功能应该更快并且保持沉默。 (可能还有其他的东西需要修剪;我将这些代码一起攻击并且只进行了测试,以确保它是正确的校验和。)
答案 3 :(得分:0)
实际上,show2()
函数为您计算校验和,但是一旦完成工作,它也会打印数据包的内容。但是,show2()
有一个有用的小参数,名为dump
。原始资料描述如下:
:param dump:确定是打印还是返回字符串值
因此,通过设置dump=True
,可以避免该函数默认提供的令人讨厌的输出,并且仍然可以获取所需的计算结果。
答案 4 :(得分:0)
您还可以使用packet.build()
返回具有正确校验和的原始字节。然后将字节转换为数据包。
>>> import scapy.all as sp
>>> packet = sp.IP(src='127.0.0.1', dst='8.8.8.8')
>>> packet
<IP src=127.0.0.1 dst=8.8.8.8 |>
>>> sp.IP(packet.build())
<IP version=4 ihl=5 tos=0x0 len=20 id=1 flags= frag=0 ttl=64
proto=hopopt chksum=0xebd8 src=127.0.0.1 dst=8.8.8.8 |>