7

Scapy では、パケットを対応する ICMP 時間超過メッセージと手動で照合したいと考えています。

私は一致する必要があります:

  • ICMP パケットの IP-in-ICMP フィールド
  • IP ヘッダーとデータ パケットの最初の 8 バイト ICMP パケットは問題ありません。

    icmpPayload = str(icmpPacket[ICMP].ペイロード)

データ パケットの最初の 8 バイトについては、次のことを行う必要があります。

str(myPacket[IP].payload)[:8]

の IP ヘッダーだけを取得する方法がわかりませんmyPacket。ここで行うことは、パケット全体のペイロードを最初の 8 バイトに置き換えることだけです。この検索と置換を何千ものパケットに適用すると、時間がかかりすぎる可能性があります。

 strOfMyPacket = str(myPacket[IP])
 strOfMyPacket.replace(str(myPacket[IP].payload),str(myPacket[IP].payload)[:8],1)

次のことを簡単に実行できる、より高速な方法はありますか?

 partOfPayload = str(myPacket[IP].payload)[:8]
 fullHeader = _______
 stringToCompare = fullHeader + partOfPayload
4

2 に答える 2

5
str(myPacket)[:(myPacket[IP].ihl * 4)]

IP ヘッダーの長さはフィールドihl(インターネット ヘッダーの長さ) にあります。これは、ヘッダーが使用する 32 ビット ワードの数として表されます。(ヘッダーの「オプション」セクションのために可変です)。したがって、そのフィールドに 32 を掛けてから 8 (または * 4) で割ると、オプションがあるかどうかに関係なく、ヘッダーが埋めるバイト数が得られます。

下位層なしで IP ヘッダーのみを返す方法 (私が見つけることができた) がないことに驚いています。

http://en.wikipedia.org/wiki/IPv4_header#ヘッダー

于 2012-08-24T14:50:08.770 に答える
4

他の誰かがこの質問にぶつかった場合に備えて、Packet クラス (IP によって継承) の remove_payload() 関数を使用できると思います。これはヘッダーを残すだけです。私はscapyを初めて使用しますが、インタープリターで試してみるとうまくいくようです。

>>> ip = IP(dst='10.0.0.1', src='10.0.0.14', ttl=255)/ICMP()
>>> hexdump(ip)
0000   45 00 00 1C 00 01 00 00  FF 01 A7 D1 0A 00 00 0E   E...............
0010   0A 00 00 01 **08 00 F7 FF  00 00 00 00**               ............
>>> ip.remove_payload()
>>> hexdump(ip)
0000   45 00 00 14 00 01 00 00  FF 00 A7 DA 0A 00 00 0E   E...............
0010   0A 00 00 01                                        ....
>>> 
于 2015-02-08T07:17:34.493 に答える