6

どの方向に進むべきですか (ライブラリドキュメント)?

アップデート

誰かが winpcap を使用して仕事をする方法を説明できますか?

更新 2

パケットが HTTP かどうかを確認するにはどうすればよいですか?

4

4 に答える 4

15

「ハイジャック」がパケットのスニッフィングを意味する場合、WinPcap でそれを行うには次のことを行う必要があります。

  1. 使用するデバイスを見つけます - WinPcap チュートリアル を参照してください

  2. を使用してデバイスを開く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
    
  3. 次のような記述子からパケットを読み取る関数を使用しますpcap_loop

    int result = pcap_loop(pcapDescriptor, count, functionPointer, NULL);
    

    これは、何か問題が発生するか、特別なメソッド呼び出しを使用してループが壊れるまでループします。各パケットに対して functionPointer を呼び出します。

  4. パケットを解析する何かを実装することを指す関数では、次のようになりますpcap_handler

    typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
             const u_char *);
    
  5. あとは、パケットのバッファが にあり、パケットconst u_char*の長さがpcap_pkthdr構造体caplenフィールドにあるパケットを解析するだけです。

    HTTP GET over TCP over IPv4 over Ethernet パケットがあると仮定すると、次のことができます。

    • イーサネット ヘッダーの 14 バイトをスキップします。
    • IPv4 ヘッダーの 20 バイトをスキップします (IPv4 オプションがないと仮定して、IPv4 オプションが可能であると思われる場合は、IPv4 ヘッダーの 5 ~ 8 ビットを読み取り、それを 4 倍すると、これがバイト数になります。 IPv4 ヘッダーがかかります)。
    • TCP ヘッダーの 20 バイトをスキップします (TCP オプションがないと仮定して、TCP オプションが可能であると思われる場合は、TCP ヘッダーの 96 ~ 99 ビットを読み取り、それを 4 倍すると、これがバイト数になります。 TCP ヘッダーがかかります)。
    • パケットの残りは 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 部分の解析を含め、すべての作業がはるかに簡単になります。

于 2010-05-04T20:26:34.777 に答える
2

やり過ぎのように聞こえるかもしれませんが、Web プロキシ/キャッシュ サーバーの Squid はまさにそれを行います。数年前、私の会社はそれを使用していましたが、特定の URL にアクセスしたときに特別な警告を表示するようにローカルでコードを微調整する必要があったため、必要なことができることがわかりました。必要なコードを見つけて、プロジェクト用に引き出すだけです。私はバージョン 2.X を使用していましたが、現在は 3.X になっているようですが、コードの側面は内部的にあまり変更されていないと思われます。

Windows が「要件」なのか「好み」なのかはわかりませんでしたが、サイトによると、 http ://www.squid-cache.org/は両方を実行できます。

于 2010-05-03T17:37:49.433 に答える
1

http://www.winpcap.org/を試してください

于 2010-04-24T04:39:55.543 に答える
0

のソース コードをtcpdump見て、どのように動作するかを確認することをお勧めします。 tcpdumpは、ネットワーク アクティビティを監視および出力する Linux コマンド ライン ユーティリティです。ただし、それを使用するには、マシンへのルート アクセスが必要です。

于 2010-04-24T04:41:07.723 に答える