1

libpcapにpcapファイルを読み取らせ、ユーザーにパケットを選択させ、libnetを使用してそのパケットを書き込もうとしています.

ファイル部分からの読み取りが完了しました。libpcap は、そのパケットを const unsigned char に入れます。以前に libnet を使用したことがありますが、libnet の高度な機能を使用したことはありません。libnet のビルド関数を使用してパケットを作成し、それをそのままにしておきます。libnet_adv_write_link()libnet コンテキスト、inject(const uint8_t) へのパケットへのポインタ、およびパケットのサイズを取得する関数があることに気付きました。libpcap から取得した「パケット」を渡そうとしたところ、エラーなくコンパイルおよび実行されました。ただし、wireshark には何も表示されません。

これはこの問題に取り組む正しい方法ですか、それとも libpcap から読み取って、libpcap が読み取ったものに基づいて libnet で別のパケットを作成する必要がありますか?

編集:問題をある程度解決したと思います。libpcap でパケットを読み取ります。16 番目のバイト以降のすべてのバイトを別の uchar に入れ、それをワイヤに書き込みました。libnet_adv_write_raw_ipv4() を使用して、LIBNET_RAW4_ADV で初期化された libnet。おそらくドライバーのせいで、私はETHレイヤーに対してあまり力を持っていないと思います。したがって、基本的にはこのように自動的に書き込まれるようにし、新しい uchar パケットは、元のパケットの ETH レイヤーの後に残っているものです。これまでのところ正常に動作します。

4

2 に答える 2

4

私は現在の libnet メンテナーです。

パケットを書き込むには libnet_write_link() を呼び出す必要があります。表示されない場合は、正しいデバイスを開いていない可能性があり、権限が不足している可能性があります (libnet_write_link の戻り値を確認したことを願っています)。また、挿入されたパケットが無効であった可能性もあります。

パケットを作成する必要がない場合は、pcap を使用してパケットを送信する必要があるように思えますが、http: //www.tcpdump.org/manpages/pcap_inject.3pcap.html を参照してください。

また、「Libpcap はそのパケットを const unsigned char に入れる」というステートメントは奇妙です。パケットは単一の文字に収まりません。pcap が行うことは、API に応じて、パケット データにポインターを返すことです。データからパケットを取得する方法と、それを libnet に渡す方法を示すコードのスニペットを含める価値があります。ポインタを正しく使用していない可能性があります。

于 2014-08-19T17:30:20.910 に答える
0
  1. を使用している場合は、 を使用してパケットを送信してlibpcapみませんか? libpcapいいえ、あまり知られていませんが、はい、機能します。関数を参照してくださいpcap_sendpacket

  2. 返されるパケットlibpcapは単なるバイト配列です。バイトの配列を取るもの (イーサネット フレームを含む) はすべて動作するはずです。ただし、OS やハードウェアによって、送信元 MAC アドレスが正しくない、または形式が正しくないパケットの送信が停止される場合があることに注意してください。

于 2014-08-18T19:21:50.240 に答える