Laden...

Pakete decodieren

Erstellt von Ploetzi vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.770 Views
Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren
Pakete decodieren

Hallo,
ich habe ein Programm geschrieben,auf Basis von SharppCap und PacketDotNet, und dieses liest mir Pakete aus dem Netzwerk ein,
nun würde ich gerne HTTP Requests auslesen,,.,..


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SharpPcap;
using PacketDotNet;

namespace FBListener2
{
    class Program
    {
        static void Main(string[] args)
        {
            string ver = SharpPcap.Version.VersionString;
Console.WriteLine("SharpPcap {0}, Example1.IfList.cs", ver);

// Retrieve the device list
LivePcapDeviceList devices = LivePcapDeviceList.Instance;

// If no devices were found print an error
if(devices.Count < 1)
{
    Console.WriteLine("No devices were found on this machine");
    return;
}
 
Console.WriteLine("\nThe following devices are available on this machine:");
Console.WriteLine("----------------------------------------------------\n");


// Print out the available network devices 
foreach(LivePcapDevice dev in devices)
    Console.WriteLine("{0}\n", dev.ToString());

// Extract a device from the list 
PcapDevice device = devices[0];

// Register our handler function to the 
// 'packet arrival' event 
device.OnPacketArrival +=
  new SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);
            // Open the device for capturing 
int readTimeoutMilliseconds = 1000;
device.Open();
device.Mode = CaptureMode.Packets;
device.Filter = "tcp";
Console.WriteLine(
    "-- Listening on {0}, hit 'Enter' to stop...",
    device.Description);

// Start the capturing process 
device.StartCapture();

// Wait for 'Enter' from the user. 
Console.ReadLine();

// Stop the capturing process 
device.StopCapture();

// Close the pcap device
device.Close();
Console.WriteLine("Fertig");
// Wait for 'Enter' from the user. 
Console.ReadLine();
// Wait for 'Enter' from the user. 
Console.ReadLine();

        }

        private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
        {
            //     DateTime time = packet.Packet.Timeval.Date;
       //     byte[] xx = packet.Packet.Data;
           
            
            var packet = PacketDotNet.Packet.ParsePacket(e.Packet);
            System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
                //    packetneu.ToString
                    Console.WriteLine("\nTCP:\n" + enc.GetString(e.Packet.Data));
          
        }
   

    }
}

Hat jemand eine Idee wie ich das machen kann

Hinweis von gfoidl vor 13 Jahren

Den Code bitte direkt im Beitrag einfügen und nicht als Link.

E
180 Beiträge seit 2010
vor 13 Jahren

Hi, dazu musst du die Pakete filtern nach dem Zielport, in dem Fall also TCP/IP Port 80. Die Requests findest du dann im Optimal fall im Inhalt des Paketes. Im schlimmsten Falle jedoch werden die Pakete fragmentiert und du musst mehrere Paket zusammenschustern (basierend auf der Sequenznummer) um das ganze Paket inhaltlich haben zu können.

In dem Fall hilfts ein wenig mal mit Wireshark sich anzugucken, wie http request bzw. allgemein TCP/IP Pakete aufgebaut und übertragen werden.

Gruß

T
156 Beiträge seit 2010
vor 13 Jahren

Weiß nicht, ob es das ist, was Du suchst:


private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
{
   var packet = PacketDotNet.Packet.ParsePacket(e.Packet);
   if (packet is TcpPacket)
   { 
      //lese Informationen aus              
   }
}

1.130 Beiträge seit 2007
vor 13 Jahren

Du kannst mal bei mir reinschauen. Bei tcp decodieren gibt es einiges zu beachten: die pakete kommen nicht unbedingt in der richtigen reihenfolge an (ist eine häufige folge von packetdrops als geschwindigkeitsregulierung)

HTTPSaver (der quellcode ist ganz unten auf der verlinkten seite)

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!