2009-08-14 4 views
0

Ich lese die Tutorials und so, aber ich verstehe es nicht. Sie können Pakete senden, aber wie können Sie Wincap mitteilen, wohin diese Pakete gesendet werden sollen? Gibt es einen Header, den ich auf die Pakete setzen sollte, damit er weiß, an welchen ip/Port er weitergeleitet wird? Ich meine. Stellen wir uns vor, ich möchte Daten an meine MSN senden, als hätte ich jemandem auf meiner Liste etwas geschrieben. Ich kann das sendpacket() verwenden, aber es wird nur das packet/byte-Array als Argument nehmen und nicht angeben, welche app/ip/port es so sendet.Winpcap einfache Frage - Wie Pakete an einen bestimmten IP/Port zu senden?

Dank

Antwort

1

Sie Winpcap nicht sagen, wo Pakete zu senden. Sie sagen es, um ein Paket auf den Draht zu legen. Der Netzwerk-Switch sendet das Paket an das richtige Ziel. Der TCP-Stapel am empfangenden Ende sendet das Paket an die richtige Anwendung/den richtigen Dienst. Offensichtlich bedeutet dies, dass die Routing-Information in dem Paket selbst sein muss.

Um Ihr Beispiel zu nehmen, müssen Sie die IP-Adresse und den TCP-Port des entsprechenden MSN-Servers in das Paket einfügen. Wenn Sie dies nicht tun, wird Ihre Netzwerkhardware dieses Paket verwerfen oder falsch leiten.

+0

Ja, 2 Minuten vor mir darüber nachgedacht. Ich erstelle ein Paket, stelle die Informationen dort ein und sende es dann einfach. Danke trotzdem! –

1

So habe ich eine ARP-Anfrage über die Leitung gesendet. 1. Definieren Sie Strukturen für die Protokolle. Wenn Sie ARP-Pakete senden möchten, benötigen Sie eine Struktur, die die Sicherungsschicht (Ethernet-Header) und die Netzwerkschicht (ARP-Header) enthält. Entsprechend, wenn Sie ein TCP-Paket über IP senden möchten, benötigen Sie eine Datenstruktur für den Ethernet-Header, IP-Header und TCP-Header.

  1. , wenn Sie die Strukturen definiert, eine Instanz der Struktur mit Werten initialisieren Sie also wollen, wenn Sie das Paket an alle Maschinen gehen wollen in dem Netzwerk des Ziel-MAC-Wert der Ethernet-Header ff: ff : ff: ff: ff: ff Wenn Sie das Paket mit (IP-Adresse 192.168.0.88) an Rechner X senden wollen, dann setzen Sie die Zieladresse in der IP-Ebene auf diesen Wert.

  2. Sobald Sie fertig sind, müssen Sie ein char * -Array deklarieren und alle Strukturen in das char * -Array kopieren, um eine Byte-Sequenz zu erstellen und über die Leitung zu senden.

// Nur um Sie zu zeigen, was ich durch die Definition von Strukturen bedeuten // nicht für den Rest der Code-Snippets bezieht

typedef struct IP_header 
{ 
    u_char  VersionNInternetHeaderLength;  // Version (4 bits) + Internet header length (4 bits) 
    /*u_char  version:4; 
    u_char  HeaderLength:4;*/ 
    u_char  Type;        // Type of service 
    u_short  TotalLength;      // Total length 
    u_short  Identification;      // Identification 

    u_char  rsv  : 1; 
    u_char  df  : 1; 
    u_char  mf  : 1; 

    u_char  FragmentOffset1 : 5; 
    u_char  FragmentOffset2; 
    //u_short  Flags_fo;       // Flags (3 bits) + Fragment offset (13 bits) 

    u_char  TimeToLive;       // Time to live 
    u_char  Protocol;       // Next level Protocol of the encapsulated payload 
    u_short  Checksum;       // Header checksum 
    IP_address SourceAddress;      // Source address 
    IP_address DestinationAddress;     // Destination address 
    u_int  OptionNPadding;      // Option + Padding 

    IP_header() 
    { 
     mf = 0; 
     rsv = 0; 
     df = 0; 
     FragmentOffset1 = 0; 
     FragmentOffset2 = 0; 

     TimeToLive = 128; 

     TotalLength = sizeof(IP_header); 
     Identification = 0xABCD; 
     Checksum = 0xABCD; 
     OptionNPadding = 0; 
    } 
}IP_header; 


Ethernet_header EthernetHeader;// = (Ethernet_header*)malloc(sizeof(Ethernet_header)); 
     ARP_header ARPHeader ;//= (ARP_header*)malloc(sizeof(ARP_header)); 

     ARPHeader.HardwareType = htons(1); 
     ARPHeader.ProtocolType = htons(0x800); 
     ARPHeader.OPCODE = htons(1); 

     ARPHeader.HeaderLength = 6; 
     ARPHeader.ProtocolLength = 4; 

     ARPHeader.SenderMAC = MY_FAKE_MAC; 
     ARPHeader.SenderIP = MY_IP; 

     ARPHeader.TargetMAC = MAC_address(); 
     ARPHeader.TargetIP = Whose; 

     EthernetHeader.DestinationMAC = BROADCASTMAC; 
     EthernetHeader.SourceMAC = MY_FAKE_MAC; 
     EthernetHeader.EtherType = htons(0x806); 

     u_char* packet = (u_char*)malloc(sizeof(EthernetHeader) + sizeof(ARPHeader)); 

     memcpy(packet, &EthernetHeader, sizeof(EthernetHeader)); 
     memcpy(packet + sizeof(EthernetHeader), &ARPHeader, sizeof(ARPHeader)); 

     SendPacket(packet);