2017-10-07 10 views
0

私はScapyを楽しんでいます。ドキュメントを読んでいる間、それはこのように書き、「単純なループ」のポートスキャン応答の重要な情報を表示する方法について説明します。しかし、Scapyのドキュメントでは、関数のコードが混乱しています

ans.summary(lambda(s,r): r.sprintf("%TCP.sport% \t %TCP.flags%")) 

私は一種の何ラムダ理解することができますどのような旅行私はラムダの後のすべてです。私は(s、r)がsとrをans.summaryによって返されたタプルの "send"パケットと "received"パケットにマッピングしていると仮定します。私はsprintfを探していましたが、それについてはPythonに関するものは何も見つかりませんでした。また、%TCP.sport%はscapy固有の書式文字列であると仮定します。

どういう意味ですか、どのように機能しますか?

+1

行1063:https://github.com/secdev/scapy/blob/40d62678b70480387395876c2efdb6f4f2a944f0/scapy/packet.py常にソースコードを読んでください... – schroeder

+0

これは役に立ちます!ありがとう – Inquisitive

答えて

0

ans.summary()は、(送信されたパックされた受信応答)タプルを表すのに使用されるパラメータとして関数を受け入れます。

機能を指定しない場合は、lambda s, r: "%s ==> %s" % (s.summary(), r.summary())に相当するものが使用されます。

この関数は引数(送信されたパケットと対応する受信された応答)を受け入れ、文字列を返す必要があります。

あなたの場合、関数はlambda(s, r): r.sprintf("%TCP.sport% \t %TCP.flags%")です。 2番目のパラメータ(答え)のみを使用し、Scapy Packetオブジェクト(これはPython標準ではありませんが、これらのオブジェクトに固有のもの)のメソッドである.sprintf()を呼び出します。 .sprintf()の書式設定要素は、レイヤーとフィールドの値に関連しています。ここでは、コールは、TCP送信元ポート(応答パケットから)に続いて「スペースタブスペース」とTCPフラグを含む文字列を返します。

これをTCPスキャンの結果としてsr()に適用すると、ポートが開いている場合は「SA」、閉じている場合は「RA」と表示されます。

関連する問題