2017-08-22 10 views
0

HTTPトラフィックをこのリストから自動的に送信する作業デバイスを選択する方法はありますか?PcapDotNetで自動的にデバイスを選択しますか?

List<NetworkInterface> Interfaces = new List<NetworkInterface>(); 
foreach (var nic in NetworkInterface.GetAllNetworkInterfaces()) 
{ 
    if (nic.OperationalStatus == OperationalStatus.Up) 
    { 
     Interfaces.Add(nic); 
    } 
} 

また、IPの代わりにURLをスニッフィングする方法はありますか?私はPcapDotNetを初めて使いました。

private static void PacketHandler(Packet packet) 
{ 
    // print timestamp and length of the packet 
    Console.WriteLine(packet.Timestamp.ToString("yyyy-MM-dd hh:mm:ss.fff") + " length:" + packet.Length); 

    IpV4Datagram ip = packet.Ethernet.IpV4; 
    UdpDatagram udp = ip.Udp; 

    // print ip addresses and udp ports 
    Console.WriteLine(ip.Source + ":" + udp.SourcePort + " -> " + ip.Destination + ":" + udp.DestinationPort); 
} 

答えて

1

特定のNICに関する詳細情報を検索しようとしていますか? 1つのインターフェイスからトラフィックを分離しようとする場合は、まずそれがどれであるかを調べます。あなたはDNSパケットを見て持ってしようとしているURLを盗聴しようとしている場合、また

var nics = from NetworkInterface a 
        in NetworkInterface.GetAllNetworkInterfaces() 
        where a.NetworkInterfaceType == NetworkInterfaceType.Ethernet && 
        a.Supports(NetworkInterfaceComponent.IPv4) 
        select a; 

    if (nics.Any()) 
    { 
     var nic = nics.First(); 
     adapter = new NetworkAdapter(); 
     adapter.Name = nic.Name; 
     adapter.Description = nic.Description; 
     adapter.Id = nic.Id; 
     var props = nic.GetIPProperties(); 


     var ipAddresses = from UnicastIPAddressInformation info 
          in props.UnicastAddresses 
          where info.PrefixOrigin == PrefixOrigin.Manual 
          select info; 

     adapter.GatewayAddressList = nic.GetIPProperties().GatewayAddresses; 

     adapter.Available = (nic.OperationalStatus == OperationalStatus.Up); 
    } 

:以下のコードを使用すると、利用可能なインタフェースを列挙するのに役立ちます。 DNSは、URLをIPに変換するのに役立ちます。 DNSをチェックしてください。 DNS検索は、接続の前に行われます。

編集:ここで私は、アダプターIDを列挙するために使用するユーティリティメソッドは次のとおりです。

DLL int GetAvailableAdapters() 
{ 
    pcap_if_t *alldevs; 
    pcap_if_t *devs; 
    char msgBuffer[LOG_SIZE]; 
    int index = 0; 
    char* fullname; 
    int namePtr; 
    char* shortname; 
    struct in_addr ip; 


// Retrieve the device list on the local machine 
if (-1 == pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, msgBuffer)) 
{ 
    //error 
    return 0; 
} 

// Cycle List, and make sure adapters are available/visable 
for(devs = alldevs; devs != NULL; devs = devs->next) 
{ 
    ++index; 

    // 
    // Print adapter description 
    // 
    sprintf(msgBuffer, " [%d]: %s", index, devs->description); 
    gblLog(INFO, msgBuffer); 

    // 
    // Parse and Print adapters network info in dot-decimal notation 
    // 
    /*ip = ((struct sockaddr_in *)(devs->addresses->addr))->sin_addr; 
    sprintf(msgBuffer, "  IPAddr: %s ", inet_ntoa(ip)); 
    gblLog(INFO, msgBuffer); 
    */ 

    // 
    // Print the Registry Key Value from the substring of adapter name 
    // 
    fullname = devs->name; 
    namePtr = strlen(fullname); 
    shortname = fullname + namePtr; 

    while(0 < namePtr && fullname[--namePtr] != '_'); 
    if(fullname[namePtr] == '_') 
    { 
     // Key is the string after "_" char, get the substring starting at that index. 
     shortname = fullname + namePtr + 1; 
     fullname[namePtr] = '\0'; 

     sprintf(msgBuffer, "  KeyVal: %s\n", shortname); 
     gblLog(INFO, msgBuffer); 
    }  
    else 
    { 
     // Print full name if the "_" char was not found (odd formating...) 
     sprintf(msgBuffer, "  KeyVal: %s\n", fullname); 
     gblLog(INFO, msgBuffer); 
    } 
} 

if(index == 0) 
{ 
    gblLog(INFO, "FindAllDevs() returned null devices. No network adapters found!"); 
} 

return index; // Total num of adapters enum 
} 

この方法を使用するには、のNetworkInterfaceと一緒に、あなたはそのREGを経由して、インデックスとアダプターを関連付けることができるはずですキー。適切なアダプタが見つかったら、そのインデックスを使用してpcapデバイスを開きます。

if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) 
    { 
     return -1; // error 
    } 

    // Cycle the devs until we reach the appropriate index 
    for(d = alldevs, i = 0; (i < (index- 1)); d = d->next, i++);  

    // Open the device 
    if ((adhandle= pcap_open(d->name,    // HW name of the network device. 
           65536,    // Portion of the packet to capture. 65536 max packet 
           adapterFlags,   // See adapterFlags above 
           1000,     // 1sec timeout on idle. (We check for exit at this interval) 
           NULL,     // No authentication, 
           errbuf    // Error buffer 
          )) == NULL) 
    { 
     //error opening 
     pcap_freealldevs(alldevs); // Free the device list 
     return -1; 
    } 
+0

NetworkAdapterの参考資料はありますか? –

+0

@ m.qayyum通常、アダプタのレジストリキーです。私はまた、アダプタの "与えられた"名前を信じています...上記のコードで各NICのNetworkAdapterクラスの情報をすべて印刷すると、探しているアダプタに接続する情報が見つかりますつかいます。あなたのために存在するかもしれない多くのネットワーク構成のために私が与えることができるまっすぐな参照はありません。がんばろう!より多くの助けが必要な場合は、より専門的な回答を得るために一般的なネットワーク情報を教えてください。 –

+0

@ m.qayyum編集された回答を参照してください。うまくいけば正しい方向に向けることができるいくつかのユーティリティメソッドを提供しました...コード内にすべてのかわいいプリントが必要なのではなく、可視性のためにそこにあります。 –

関連する問題