3

で ICMP パケットの IP ソース アドレスを検出する簡単なコードを書こうとしていますがscapy、問題はhaslayer関数が何も返さないように見えることです。

from scapy.all import *

while 1:

    pkt = sniff ( iface="eth0" , count = 1 )
    pkt.summary()

    try:
        if pkt.haslayer(IP):
            ipsrc =pkt.getlayer(IP).src
            print ipsrc

    except:
        pass

結果は

Ether / IP / ICMP 10.0.2.15 > 10.0.2.11 echo-request 0 / Raw
Ether / IP / ICMP 10.0.2.15 > 10.0.2.11 echo-request 0 / Raw
Ether / IP / ICMP 10.0.2.15 > 10.0.2.11 echo-request 0 / Raw

そのため、ICMP 要求の IP ソース アドレスを取得できません。何か考えはありますか?

4

2 に答える 2

1

ジェネリックexceptは、コードで発生する可能性のあるエラーをマスクします。特定のエラーを変更passして削除します。raiseたとえば、あなたのコードで最初に遭遇したのは次のとおりです。

socket.error: [Errno 1] Operation not permitted

そして、私が得たように実行した後root

AttributeError: 'list' object has no attribute 'haslayer'

そのため、コードを機能するものに変更しました(として実行root):

from scapy.all import *

while 1:

    pktl = sniff ( iface="eth0" , count = 1 )
    pktl.summary()

    for pkt in pktl:
        try:
            if pkt.haslayer(IP):
                ipsrc =pkt.getlayer(IP).src
                print ipsrc
        except:
            raise

したがって、おそらくtryを削除する方がよいでしょう-完全に除く

于 2013-03-22T17:15:28.200 に答える
1

@Hussam - ループは必要ありませんが、構文 pkt = sniff() を使用すると、配列が返されます。別の書き方は次のようになります。

#!/usr/bin/env python

from scapy.all import *

pkt = sniff(count=1, filter="ip")

if pkt[0].haslayer(IP):
    print pkt[0][IP].src

これは、すべてのパケットが配列ではなくパケットとして関数に渡される sniff() に渡される関数を使用して行うこともできます。例は次のとおりです。

#!/usr/bin/env python

from scapy.all import *

def print_ip_src(pkt):
    if pkt.haslayer(IP):
        print pkt[IP].src

sniff(prn=print_ip_src, filter="ip")

ループや関数からの変数の割り当てがないことに注意してください。これは無期限に実行され、すべてのパケットが含まれている print_ip_src() 関数に送信されます。

PS: IP パケットのみをキャプチャするために BPF フィルターを使用しましたが、安全対策として、とにかく haslayer() 関数を含める必要があります。

于 2014-04-06T23:56:06.893 に答える