Scapy文档使用令人困惑的函数代码

时间:2017-10-07 13:06:49

标签: python

我一直在玩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特定格式字符串。

这一切意味着什么,它是如何运作的?

1 个答案:

答案 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"如果它关闭了。