2011-11-19 4 views
1

を経由して注入するために、パケットを再構築する状況です:私のシナリオでは、私が持っている、3台のコンピュータは、A、BおよびCのここPCAP

コンピュータAは、PCAPでこれらのパケットをキャプチャするコンピュータBコンピュータBにデータを送信しますCの観点から見ると、データはコンピュータBから送られてきます。

私の問題は次のとおりです。キャプチャされたパケットを解析するTCPDUMPのチュートリアルの後、私はオフセットを計算し、typecastingを使ってethernet、ip、およびtcpヘッダ構造を取得する方法を学びました。そうすることの方法を以下に示します。

ethernet = (struct sniff_ethernet*)(packet); 
ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); 
size_ip = IP_HL(ip)*4; 
if (size_ip < 20) { 
    printf(" * Invalid IP header length: %u bytes\n", size_ip); 
    return; 
} 
tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip); 
size_tcp = TH_OFF(tcp)*4; 
if (size_tcp < 20) { 
    printf(" * Invalid TCP header length: %u bytes\n", size_tcp); 
    return; 
} 
payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp); 

私はコンピュータCにコンピュータBからそれを送信するためにキャプチャしたパケットを注入したいので、私は送信元/送信先情報の一部を変更する必要がありますし、ときに私のチェックサムを再計算しますやりました。しかし、私の問題は、このデータがイーサネットヘッダー、IPヘッダー、TCPヘッダーの構造に分離されているからです。に戻すにはどのようにすればいいですか?pcap_injectは使えますか?

ここで何らかの連結を行うことはできますか?

答えて

1

ここからわかるように、実際にはlibpcapがキャプチャしたメモリを解剖しているわけではありません。それぞれのキャスト操作は、ポインタから始まるバイトをどのように扱うか、つまりそれらのオブジェクトのサイズ、どのデータを見つけるか、どのくらいの長さのものを見つけるか、コンパイラに伝えるだけです。

これらのポインタを使用してこのメ​​モリを変更すると、そのメモリの1つだけがプロセスメモリに変更されました。また、「より基本的な」ポインタの一部を使用してメモリブロック全体をsendmsg(2)データを再構成する必要なしに何かを実行することができます。

更新

バックあなたはraw(7)ソケットタイプを使用する必要があるネットワーク上のパケットを注入します。 IPPROTO_RAWソケットオプションは、raw(7)ソケットを介してTCPパケットを送信する必要があります。そうでない場合は、すべて TCPパケットは開かれたraw(7)ソケットに転送されます。

raw(7)ソケットがあなたのためにいくつかの再計算タスクを実行します。

A protocol of IPPROTO_RAW implies enabled IP_HDRINCL and is 
    able to send any IP protocol that is specified in the passed 
    header. Receiving of all IP protocols via IPPROTO_RAW is not 
    possible using raw sockets. 

      ┌───────────────────────────────────────────────────┐ 
      │IP Header fields modified on sending by IP_HDRINCL │ 
      ├──────────────────────┬────────────────────────────┤ 
      │IP Checksum   │Always filled in.   │ 
      ├──────────────────────┼────────────────────────────┤ 
      │Source Address  │Filled in when zero.  │ 
      ├──────────────────────┼────────────────────────────┤ 
      │Packet Id    │Filled in when zero.  │ 
      ├──────────────────────┼────────────────────────────┤ 
      │Total Length   │Always filled in.   │ 
      └──────────────────────+────────────────────────────┘ 

    If IP_HDRINCL is specified and the IP header has a nonzero 
    destination address then the destination address of the 
    socket is used to route the packet. When MSG_DONTROUTE is 
    specified, the destination address should refer to a local 
    interface, otherwise a routing table lookup is done anyway 
    but gatewayed routes are ignored. 

    If IP_HDRINCL isn't set, then IP header options can be set on 
    raw sockets with setsockopt(2); see ip(7) for more 
    information. 

あなたのために行うには喜んで何でもカーネルの再計算をしてみましょう。

+0

チュートリアルのスニペットのみをコピーしました。このチュートリアルはhttp://www.tcpdump.org/pcap.htmlで、コードはここにあります:http://www.tcpdump.org/sniffex.c どうにかしているように見えるのは、型のキャストを行うことによって各タイプのヘッダーの構造体。そこで、パケットを再構築してインジェクタ機能に与えることができる簡単な逆プロセスがあるかどうか疑問に思っていました。 申し訳ありませんが、私が聞いていることが間違っているようです。私はEEのシニアデザインプロジェクトでこれをやっています。 CSとコード関連のものは、実際に私が拾っているものです。 – maoshouse

+0

ああ。そこには_変更はありませんが、実際にデータのコピーを作成したようなコードも見られませんでした。 – sarnold

+0

私はenterを押して誤って早めに投稿しました。私はより多くのもののためのスペースを作るためにコメントを編集していました。 – maoshouse