3

IPパケットをスニッフィングするためのソケットを作成する例をいくつか見てきました。たとえば、次の例を使用します。

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

私が達成しようとしているのは、イーサネットフレームをスニッフィングし、Windowsで受信したデータを分析することです。私が興味を持っているパケットは、IPを含まないPPPoEフレームです。

Linux(Pythonを使用)では、次を使用してこれを実現できました:

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(3))
s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, struct.pack("%ds"%(len("eth0")+1,),"eth0"))
while condition:
    pkt = s.recvfrom(1500)
    addToQueue(filter(pkt))

LinuxソケットとWinSock2APIの違いにより、次の互換性の問題が発生しています。

  • Windows用のINパッケージはありません。これは、SO_BINDTODEVICEが存在しないことを意味します。eth0インターフェースで発生するすべてのものをスニッフィングするにはどうすればよいですか?
  • IPPROTO_IPに制限したくないので、socket()コンストラクターのプロトコルオプションには何を使用すればよいですか。

誰かが私を正しい方向に向けることができますか?私は同様の質問をしましたが、それらはすべてIPパケットのスニッフィングに関係していたため、実際には私の問題を解決しませんでした。

注:Scapyのようなライブラリがスニッフィングに使用できることは知っていますが、複雑なフィルタリングを実行しようとすると(またはprn関数を使用しようとすると)パケットが失われ、実行しようとしていることに適合しません。生のソケットは私のニーズに完全に適合します。

4

2 に答える 2

2

Windowsボックスがないとこれを確認できませんが、必要なのは...

HOST = socket.gethostbyname(socket.gethostname())
s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
s.bind((HOST, 0))
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
while condition:
    pkt = s.recvfrom(1500)
    addToQueue(filter(pkt))

さらに、代わりに pypcap (または別の libpcap ラッパー) などを使用することを検討することをお勧めします。

于 2011-06-03T18:38:30.720 に答える