どの方向に進むべきですか (ライブラリ、ドキュメント)?
アップデート
誰かが winpcap を使用して仕事をする方法を説明できますか?
更新 2
パケットが HTTP かどうかを確認するにはどうすればよいですか?
「ハイジャック」がパケットのスニッフィングを意味する場合、WinPcap でそれを行うには次のことを行う必要があります。
使用するデバイスを見つけます - WinPcap チュートリアル を参照してください。
を使用してデバイスを開くpcap_open
// Open the device
char errorBuffer[PCAP_ERRBUF_SIZE];
pcap_t *pcapDescriptor = pcap_open(source, // name of the device
snapshotLength, // portion of the packet to capture
// 65536 guarantees that the whole packet will be captured on all the link layers
attributes, // 0 for no flags, 1 for promiscuous
readTimeout, // read timeout
NULL, // authentication on the remote machine
errorBuffer); // error buffer
次のような記述子からパケットを読み取る関数を使用しますpcap_loop
int result = pcap_loop(pcapDescriptor, count, functionPointer, NULL);
これは、何か問題が発生するか、特別なメソッド呼び出しを使用してループが壊れるまでループします。各パケットに対して functionPointer を呼び出します。
パケットを解析する何かを実装することを指す関数では、次のようになりますpcap_handler
。
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
const u_char *);
あとは、パケットのバッファが にあり、パケットconst u_char*
の長さがpcap_pkthdr
構造体caplen
フィールドにあるパケットを解析するだけです。
HTTP GET over TCP over IPv4 over Ethernet パケットがあると仮定すると、次のことができます。
パケットの残りは HTTP テキストである必要があります。最初のスペースと 2 番目のスペースの間のテキストは URI である必要があります。長すぎる場合は、TCP の再構築が必要になる場合がありますが、ほとんどの URI は 1 つのパケットに収まるほど小さいです。
更新:コードでは、これは次のようになります(テストせずに書きました):
int tcp_len, url_length;
uchar *url, *end_url, *final_url, *tcp_payload;
... /* code in http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html */
/* retireve the position of the tcp header */
ip_len = (ih->ver_ihl & 0xf) * 4;
/* retireve the position of the tcp payload */
tcp_len = (((uchar*)ih)[ip_len + 12] >> 4) * 4;
tcpPayload = (uchar*)ih + ip_len + tcp_len;
/* start of url - skip "GET " */
url = tcpPayload + 4;
/* length of url - lookfor space */
end_url = strchr((char*)url, ' ');
url_length = end_url - url;
/* copy the url to a null terminated c string */
final_url = (uchar*)malloc(url_length + 1);
strncpy((char*)final_url, (char*)url, url_length);
final_url[url_length] = '\0';
BPF の作成と設定を使用して、HTTP トラフィックのみをフィルタリングすることもできます。WinPcap チュートリアル を参照してください。おそらく"tcp and dst port 80"
、コンピューターがサーバーに送信する要求のみを提供するフィルターを使用する必要があります。
C# の使用を気にしない場合は、Pcap.Netを使用してみてください。これにより、パケットのイーサネット、IPv4、および TCP 部分の解析を含め、すべての作業がはるかに簡単になります。
やり過ぎのように聞こえるかもしれませんが、Web プロキシ/キャッシュ サーバーの Squid はまさにそれを行います。数年前、私の会社はそれを使用していましたが、特定の URL にアクセスしたときに特別な警告を表示するようにローカルでコードを微調整する必要があったため、必要なことができることがわかりました。必要なコードを見つけて、プロジェクト用に引き出すだけです。私はバージョン 2.X を使用していましたが、現在は 3.X になっているようですが、コードの側面は内部的にあまり変更されていないと思われます。
Windows が「要件」なのか「好み」なのかはわかりませんでしたが、サイトによると、 http ://www.squid-cache.org/は両方を実行できます。
http://www.winpcap.org/を試してください
のソース コードをtcpdump
見て、どのように動作するかを確認することをお勧めします。 tcpdump
は、ネットワーク アクティビティを監視および出力する Linux コマンド ライン ユーティリティです。ただし、それを使用するには、マシンへのルート アクセスが必要です。