Winpcap einfache Frage - wie Pakete zu einem IP / Port senden?
-
16-09-2019 - |
Frage
Ich habe die Tutorials und so, aber ich bin immer es nicht. Es ist können Sie Pakete senden, aber wie kann man Winpcap sagen, wo diese Pakete senden? Gibt es einen Kopf ich auf den Paketen setzen sollte, damit es weiß, wird die IP / Port das es zu übermitteln? Ich meine. Stellen wir uns vor Ich möchte ein paar Daten zu meinem MSN senden, als ob ich jemandem etwas auf meiner Liste geschrieben hatte. Ich kann den Sendpacket () verwenden, aber es wird das Paket / Byte-Array als Argument nur nehmen, specifing nicht auf den app / ip / port es so senden.
Danke
Lösung
Sie nicht sagen, wo Winpcap Pakete zu senden. Sie sagen, dass es ein Paket auf dem Draht zu setzen. Der Netzwerk-Switch wird das Paket an das richtige Ziel senden. Der TCP-Stack auf dem empfangenden Ende wird das Paket an den richtigen Anwendung / Dienst senden. Offensichtlich ist dies bedeutet, dass die Routing-Informationen im Paket sein muss selbst.
Ihr Beispiel nehmen, sollten Sie die IP-Adresse und TCP-Port des entsprechenden MSN-Server in das Paket legen müssen. Wenn Sie dies nicht tun, wird Ihre Netzwerkhardware verwerfen oder dieses Paket fehlleiten.
Andere Tipps
Dies ist, wie ich eine ARP-Anfrage über das Netzwerk gesendet. 1. Definieren Sie Strukturen für die Protokolle heißt, wenn Sie wollen ARP-Pakete senden Sie eine Struktur benötigen, die die Datenverbindungsschicht (Ethernet-Header) und Netzwerk-Layer (ARP Header) enthalten wird. Entsprechend, wenn Sie ein TCP-Paket senden möchten over IP Sie eine Datenstruktur für den Ethernet-Header, IP-Header und TCP-Header müssen.
-
, wenn Sie die Strukturen definiert, eine Instanz der Struktur mit Werten Sie also wollen initialisieren, 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 mit (IP-Adresse 192.168.0.88), um das Paket zu Maschine X senden dann die Zieladresse in der IP-Schicht auf diesen Wert.
-
Nun können Sie eine char * Array deklarieren müssen und kopieren Sie alle Strukturen auf dem char * Array eine Byte-Sequenz zu erstellen und über den Draht senden.
// Nur um Sie zu zeigen, was ich meine Strukturen durch die Definition // nicht für den Rest der Code-Snippets beziehen
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);