0

Pythonでsocket.recvから抽出イーサネット、IP ヘッダー、TCP、およびペイロードを抽出するにはどうすればよいですか?現在、 socket.recvfrom()を使用して上記の情報を取得できます。

    packet = s.recvfrom(NETWORK_MAX_SIZE)
    packet = packet[0] 
    #parse ethernet header
    eth_length = 14
    eth_header = packet[:eth_length]
    eth = unpack('!6s6sH' , eth_header)
    eth_protocol = socket.ntohs(eth[2])
    t = iph_length + eth_length
    tcp_header = packet[t:t+20]
    #now unpack them :)
    tcph = unpack('!HHLLBBHHH' , tcp_header)
    source_port = tcph[0]
    dest_port = tcph[1]
    sequence = tcph[2]
    acknowledgement = tcph[3]
    doff_reserved = tcph[4]
    tcph_length = doff_reserved >> 4
    h_size = eth_length + iph_length + tcph_length * 4
    data_size = len(packet) - h_size
    #get data from the packet
    data = packet[h_size:] 

参照: http://www.binarytides.com/python-packet-sniffer-code-linux/

フラグメント化された TCP パケットで同じ関数を使用し、socket.recv()を呼び出すと、tcpheader のアンパック時にエラーが発生します。

ありがとう

4

1 に答える 1

1

ありがとう、socket.recv() が str 型を返し、socket.recvfrom() がタプル型を返すことを認識したのでsocket.recv () については、packet = packet[0] を省略しました。TCP ヘッダーを変数として処理するようにコードを更新します。

于 2013-11-13T22:54:07.780 に答える