5

数日でプロジェクトを完成させる必要があります。これは、基本的なクライアントとサーバーのインターフェイスです。問題は、すべて生のソケットである必要があることです。それを作成することに問題はありません。パケットの送信に固執しています。

最初にインターフェイス「en1」にバインドしようとしましたが、エラーが発生し続けますnodename not known。ローカル IP アドレスにバインドすると、正常に動作します。これを完了した後、すべて 16 進数の raw パケット クラスを作成しました。次に、sendto 呼び出しを実行して、ネットワーク上に送信しました。

問題は、wireshark を使用してパケットをキャプチャすると、ipv4 パケットのペイロードとして表示されることです。ヘッダーを自動的に作成したくありません。とにかく、それが私の生のパケットクラスの目的でした。これらのヘッダーを取り出す方法を知っていますか?

ここに私のコードがあります - 生の関数のみ:

def raw():
    HOST = gethostbyname('192.168.1.10')

    s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
    s.bind((HOST, 0))

    s.setsockopt(IPPROTO_IP, IP_HDRINCL, 0) #no headers - it wont work!!

    pckt = packet("\x68\x65\x6c\x6c\x6f")
    netpacket = pckt.getpacket()

    print "Sending.. "
    print ""

    s.sendto(netpacket, ('192.168.1.1', 80))
    data = s.recv(4096)
    print data

最後にhelloを含むキャプチャされたパケットを次に示します。

007f 2809 6da2 28cf daee 2156 0800 4500 004d 1bfc 0000 4000 db59 c0a8 010a c0a8 0101* 007f     

2809 6da2 28cf daee 2156 0800 4500 0036 2352 4000 4006 0000 c0a8 010a c0a8 0101 15c0 0050 

0000 0000 0000 0000 8010 813b 0000 68656c6c6f -hello

*これ ( 0101) は、パケットの先頭であるはずが、ペイロードの先頭です。また、他のモジュールを使用するつもりはありません。ソケットを使用する必要があります。

4

2 に答える 2

7

この質問に対するコメントのおかげで、サーバーとの接続を確立できました。Linux でアドレス ファミリを af_packet に変更するだけでした。次に、それを nic にバインドして送信しました。出来た。助けてくれてありがとう!ここにいくつかのサンプルコードがあります:

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("en1", 0))
pckt = packet() #my class that initializes the raw hex
data = pckt.getpacket()
s.send(data)
message = s.recv(4096)
print s
print s.decode('hex')

Linux または Debian である必要があります。私の知る限り、mac osx では動作しません。Windowsについてのidk。Macでpycapまたはscapyを使用している場合、それらは正常に機能します。

于 2012-09-03T23:42:37.510 に答える
0

あなたの質問アンドリューへの答えとして、ここに例があります:

この回答は、WoL を機能させるのに役立ちました。この場合、データは次のとおりです。

preamble = bytearray((0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF))
MAC = bytearray((0x00, 0x14, 0x85, 0xa4, 0x73, 0xce))
data = PREAMBLE + 16*MAC
于 2016-10-31T08:52:27.527 に答える