16
A
回答
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)]
>>>
21
我也试图避免show2(),因为它打印数据包。 我在源中找到一个更好的解决方案:
del packet.chksum
packet = packet.__class__(str(packet))
该代码再生与无任何打印校验正确的数据包,实际上是什么show2()在打印之前在后台运行。然后
+ 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()
:
0
加入这个补丁Scapy的/ packet.py。 (记得先做del pkt[IP].chksum
和del pkt[UDP].chksum
等)如前面的答案所示。
此功能应该更快,并保持沉默。 (可能还需要修改其他内容;我一起对此代码进行了黑名单操作,并且只进行了测试,以确保它在正确的校验和下保持沉默。)
相关问题
- 1. 校验和计算
- 2. 如何计算TCP校验
- 3. 当我们使用tcpdump捕获我们发送的数据包时,TCP的校验和是如何计算的
- 4. 如何计算二进制校验和?
- 5. 如何计算CRC32校验和?
- 6. OVS:如何计算ICMPV6校验和?
- 7. 计算校验
- 8. UDP校验和计算
- 9. exFAT校验和的计算
- 10. 计算点数的校验和
- 11. 什么校验和技术会让我从它的部件的校验和中计算整个校验和?
- 12. libtrace的函数来计算包校验和
- 13. 如何计算校验和的合理位数?
- 14. 如何计算结构数组的CRC(校验和)?
- 15. 读取MP3音频数据或计算其校验和
- 16. WebHdfs中的校验和计算
- 17. 在meteor.js中计算sha-512校验和
- 18. Sqlite中的校验和计算表
- 19. 错误的TCP校验和计算Scapy
- 20. 在Python中计算IP校验和
- 21. 从NSData计算iPhone上的校验和
- 22. 上传文件时计算校验和
- 23. Python字符串校验和计算器
- 24. UDP校验和计算蟒蛇
- 25. 校验和的十六进制计算
- 26. ISBN校验位计算题
- 27. 计算ISBN的校验位
- 28. 我如何猜测校验和算法?
- 29. 什么会导致UDP数据报不能计算IP头校验和?
- 30. 如何用scapy重新计算IP校验和?
谢谢。 我发现另一个选项 - 将数据包转换为字符串,并使用该字符串重新创建它。 – 2011-05-24 18:55:06
@Dima,感谢您的建议。我想避免'show2()',因为所有的输出都是不必要的。也许应该有一个'recalc'数据包功能。 – 2011-07-21 12:58:17
@Mr。 Shickadance,通过重新分配'stdout',你可以轻松地静默一下......即stdout,null = sys.stdout,open('/ dev/null','w'); sys.stdout = null'。当你完成重新分配'sys.stdout = stdout' – 2011-07-21 17:40:02