0

mvc 4 を使用して asp.net プログラムを実行しました。iis サーバーに localhost としてデプロイしました。HTTP パケットを追跡したいので、SharpPcap を使用しました。

これが完全なコードです...

 namespace CaseStudy
 {
 class Program
 {
    static void Main(string[] args)
    {
        var parmenter = SharpPcap.CaptureDeviceList.Instance;

        /*If no device exists, print error */
        if (parmenter.Count < 1)
        {
            Console.WriteLine("No device found on this machine");
            return;
        }

        int i = 0;
        Console.WriteLine("Choose Your Devices :");
        Console.WriteLine("----------------------");
        foreach (PcapDevice dev in parmenter)
        {
            /* Device Description */
            Console.WriteLine("{0}] {1} [MAC:{2}]", i, dev.Interface.FriendlyName, dev.Interface.MacAddress);
            i++;
        }
        Console.WriteLine("----------------------");
        //Extract a device from the list
        int deviceIndex = -1;
        do
        {
            Console.WriteLine("Enter Your Choice :");
            deviceIndex = int.Parse(Console.ReadLine());
        } while (!(deviceIndex < parmenter.Count && deviceIndex >= -1));

        ICaptureDevice device = parmenter[deviceIndex];
        //Register our handler function to the 'packet arrival' event
        //device.PcapOnPacketArrival += new SharpPcap.PacketArrivalEventHandler();
        device.OnPacketArrival += new SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);
        //Open the device for capturing
        //true -- means promiscuous mode
        //1000 -- means a read wait of 1000ms
        device.Open(DeviceMode.Promiscuous, 1000);
        device.Filter = "ip and tcp";
        Console.WriteLine("-- Listenning on {0}, hit 'Enter' to stop...", device.MacAddress);
        //Start the capturing process
        device.StartCapture();
        //Wait for 'Enter' from the user.
        Console.ReadLine();
        //Stop the capturing process
        device.StopCapture();
        //Close the capturing device
        device.Close();
    }
    private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
    {
        DateTime time = e.Packet.Timeval.Date;
        int len = e.Packet.Data.Length;
        byte[] data = e.Packet.Data;
        //var packet = TcpPacket.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
        //Console.WriteLine(e.Packet.LinkLayerType.ToString());
        Packet pack = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
        if (pack is PacketDotNet.EthernetPacket)
        {
            var eth = pack.Extract(typeof(EthernetPacket)) as EthernetPacket;
            if (len > 100)
            {
                Console.WriteLine("ETHERNET/INTERNET/HTTP PACKET");
                //Console.WriteLine(HttpServerUtility.UrlTokenEncode(eth.Bytes));
                Console.WriteLine("{0}-{1}" , eth.DestinationHwAddress, eth.SourceHwAddress);
                //Console.WriteLine(eth.PayloadPacket.PayloadPacket.PrintHex());
                Console.WriteLine(System.Text.Encoding.UTF8.GetString(eth.Bytes));
            }
        }
        if (pack is PacketDotNet.TcpPacket) { 
            var tcp = pack.Extract (typeof(TcpPacket)) as TcpPacket;
            if (len > 100)
            {
                //Console.WriteLine("[{0}:{1}:{2}:{3}][{4}][{5}]",
                    //time.Hour, time.Minute, time.Second, time.Millisecond,
                    //len, Stringfy.RawPacketToHex(data));
                Console.WriteLine("TCP PACKET");
                Console.WriteLine(tcp.PrintHex());
                //Console.WriteLine(arp.SenderHardwareAddress);
            }
        }
        if (pack is PacketDotNet.InternetPacket)
        {
            var inet = pack.Extract(typeof(InternetPacket)) as InternetPacket;
            if (len > 100)
            {
                //Console.WriteLine("[{0}:{1}:{2}:{3}][{4}][{5}]",
                //time.Hour, time.Minute, time.Second, time.Millisecond,
                //len, Stringfy.RawPacketToHex(data));
                Console.WriteLine("INTERNET PACKET");
                Console.WriteLine(inet.PrintHex());
                //Console.WriteLine(arp.SenderHardwareAddress);
            }
        }
        if (pack is PacketDotNet.IpPacket)
        {
            var ip = pack.Extract(typeof(IpPacket)) as IpPacket;
            if (len > 100)
            {
                //Console.WriteLine("[{0}:{1}:{2}:{3}][{4}][{5}]",
                //time.Hour, time.Minute, time.Second, time.Millisecond,
                //len, Stringfy.RawPacketToHex(data));
                Console.WriteLine("IP PACKET");
                Console.WriteLine(ip.PrintHex());
                //Console.WriteLine(arp.SenderHardwareAddress);
              }
          }
      }
  }
}

Google、stackoverflow、facebook などのリモート サーバーの http パケットをキャプチャするこのコードは、私のシステムと通信します。

ただし、システムをローカルホストとしてのみ使用してパケットを追跡したい。

ここに画像の説明を入力

使用してここに画像の説明を入力

誰でも助けることができますか?お願いします...

4

1 に答える 1

0

それは不可能だ。

なんで?SharpPcap は WinPcap を使用し、WinPcap はシステム ドライバーを拡張してパケットをキャプチャします。WinPcap faq Question 13によると、loopbackdevice aka localhost をキャプチャすることはできません。これは WinPcap ではなく Windows の制限です。

于 2015-03-18T18:46:02.537 に答える