我一直在玩Scapy。在阅读文档时,它解释了如何使用“简单循环”显示端口扫描回复的重要信息,如下所示:
ans.summary( lambda(s,r): r.sprintf("%TCP.sport% \t %TCP.flags%") )
我可以理解lambda的作用,但是让我感到震惊的是lambda之后的一切。我假设(s,r)将s和r映射到ans.summary返回的元组的“send”和“received”数据包。我一直在寻找sprintf,并且找不到与python有关的任何内容。我还假设%TCP.sport%是一个scapy特定格式字符串。
这一切意味着什么,它是如何运作的?
答案 0 :(得分:0)
ans.summary()
接受一个函数作为参数,用于表示每个(已发送打包,已接收响应)元组。
如果未指定任何功能,则使用与lambda s, r: "%s ==> %s" % (s.summary(), r.summary())
等效的内容。
该函数必须接受参数(发送的数据包和相应的接收答案),并返回一个字符串。
在您的情况下,函数为lambda(s, r): r.sprintf("%TCP.sport% \t %TCP.flags%")
。它只使用第二个参数(答案),并调用.sprintf()
,这是一个由Scapy Packet
对象定义的方法(不是Python标准,而是特定于这些对象的东西) 。 .sprintf()
中的格式元素与图层和字段值相关。这里,调用将返回一个包含TCP源端口的字符串(来自应答包),然后是"空格选项卡空间"和TCP标志。
如果将此应用于sr()
结果进行TCP扫描,则会显示每个扫描端口的" SA"如果港口是开放的" RA"如果它关闭了。