2

だから私は次のようなソケットを持っています:

sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.getprotobyname("icmp"))

そして、RFC4443 ごとにタイプ 128 およびコード 0 (チェックサムも検証済み) で適切に構成された ICMP6 ECHO REQUEST を送信すると、パケットは宛先のスタックによってドロップされます。ヘッダーは RFC ごとに 1 に設定されます (ICMP の場合は #)。

2つのこと:1. socket.getprotobyname("icmp") がソケットICMPをIPv4と互換性があることを知っています(正しいですか?)... 2. WiresharkはパケットをIPv6として読み取りますが、プロトコルはICMPv6ではなくICMPとして読み取ります...

どちらかが protocolbyname("icmpv6") を使用するようにソケットを設定します (これは明らかに無効です。誰かが適切な文字列を知らない限り... "icmp6" "icmpv6" を試しましたが、アンダースコアを使用していくつかの試行が行われる可能性があります) .

または、パケットを 58 に送信する前に「次のヘッダー」バイトを変更します。

LAST RESORT は手動でパケットを作成します。

誰にもアイデアがありますか?もちろん、私は Python の経験が最も豊富というわけではありません。

4

2 に答える 2

4

これはそれを行う必要があります:

socket.getprotobyname('ipv6-icmp')
于 2013-10-04T15:39:02.280 に答える
1

これに遭遇し た場合socket.getprotobyname('<proto>') は、/etc/protocols (Unix) および /c/windows/system32/drivers/etc/protocols (Windows) のフラット ファイルにリストされているプロトコルに対応する整数を返します。それらをチェックしてください!これは、ペイロード内のデータに固有の IP ヘッダー内の唯一のバイトです。Unix マシンのリストには、少なくとも Mac ではすべてのプロトコルが含まれており、Windows には最も一般的なプロトコルのみが含まれています。このファイルも編集できます。

于 2013-10-05T20:23:13.283 に答える