3

バイナリ形式の生のIPパケットを含むファイルがあります。ファイル内のデータには、完全なIPヘッダー、TCP \ UDPヘッダー、およびデータが含まれています。このファイルを読み取り、データを行にダンプするために、任意の言語(できればPython)を使用したいと思います。

Linuxでは、一部のデバイスに直接書き込むことができることを知っています(echo "DATA"> / dev / device_handle)。Pythonを使用して/dev/ eth1を開くと、同じ効果が得られます(つまり、echo "DATA"> / dev / eth1を実行できます)

4

2 に答える 2

2

いいえ; デバイスノードはありません/dev/eth1。ネットワークデバイスは、端末やハードドライブなどのキャラクター/ブロックデバイスとは異なる名前空間にあります。AF_PACKET生のIPパケットを送信するためのソケットを作成する必要があります。

于 2012-10-23T23:35:17.597 に答える
2

何かのようなもの:

#!/usr/bin/env python
import socket
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
s.bind(("ethX", 0))

blocksize = 100;
with open('filename.txt') as fh:
    while True:
        block = fh.read(blocksize)
        if block == "": break  #EOF
        s.send(block)

動作するはずですが、テストしていません。

  • ethXインターフェースに変更する必要があります(例eth1、、、eth2などwlan1
  • で遊んでみてblocksizeください。一度に100バイトで十分なはずです。上げることを検討してもかまいませんが、1500バイトのイーサネットPDUより下にとどまります。
  • これにはroot/sudoer権限が必要になる可能性があります。私は生のソケットから読み取るときにそれらを必要としていましたが、単にソケットに書き込んでみたことはありません。
  • これは、文字通りパケット(およびパケットのみ)をファイルにダンプする場合に提供されます。いかなる種類のエンコーディング(16進数など)でもありません。バイトが0x30の場合、テキストファイルでは「0x30」や「30」などではなく「0」にする必要があります。そうでない場合は、whileループを何らかの処理に置き換える必要がありますが、sendそれでも同じです。
  • IPパケットを送信しようとしていることを読んだので、この場合、パケット全体を一度に作成してから、それをソケットにプッシュする必要がある可能性もあります。単純なwhileループでは不十分です。
于 2012-10-23T23:35:27.030 に答える