2009-08-26 6 views
0

Ich schreibe eine Anwendung, die Pakete mit SharpPcap injiziert.Ermitteln der nächsten Hop-MAC-Adresse in C#

Da ich jedoch die Pakete selbst konstruiere und nur die IP-Adresse des Ziels kenne, muss ich die physikalische Adresse des nächsten Hops bestimmen. Ich kann immer einen Ping an die entfernte IP address senden, schnüffle es und bekomme die MAC address aus dem geschnüffelten Paket. Ich hatte jedoch gehofft, dass es in C# einen weniger komplizierten Weg gibt.

Offensichtlich ist es auch sehr hilfreich, die IP-Adresse des nächsten Hops zu erhalten, da ich dann SendArp verwenden kann, um seine MAC-Adresse zu bestimmen.

Die Routing-Tabelle wird ausreichen. Wie bekomme ich das mit Code?

Antwort

2

Ich hatte einige Probleme mit WMI (es scheint, dass man nicht zwischen einem Interface-Index in Win32_IP4RouteTable mit einem tatsächlichen Gerät korrelieren kann; MSDN-Dokumentation ist falsch, und andere mehr hackish Techniken auf einigen Computern fehlschlagen).

Also wählte ich die unmanaged GetBestRoute, die mir tatsächlich viel Zeit gespart, weil es Windows die Routing-Entscheidung für sich selbst macht und die IP-Adresse des nächsten Hops und die NIC-Kennung zu dieser Adresse zurückgibt. Es ist auch viel schneller als eine Abfrage gegen WMI auszuführen.

Sie können dann die NIC selbst finden, indem Sie nach dieser Kennung in der Liste suchen, die von GetAdaptersInfo zurückgegeben wird.

Hoffe, es hilft ...

0

Physikalische Adressen werden durch die Address Resolution Protocol aufgelöst - senden Sie einfach eine ARP Reuest mit der IP-Adresse zu lösen.

Wenn sich das Ziel nicht im lokalen Netzwerk befindet, muss das Paket an das Standardgateway gesendet werden, und es muss eine ARP-Anforderung für das Standardgateway durchgeführt werden. Das Standardgateway kann mithilfe von Methoden aus dem Namespace System.Net.NetworkInformation abgerufen werden.

NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses 
+0

das wahr ist, wenn die Zielmaschine auf meinem lan ist. Wie würden Sie das erste Gateway (und seine MAC-Adresse) in der Route zu einem Remote-Rechner ermitteln (im Code, ohne Traceroute) – r0u1i

+0

Erhalten Sie einfach das Standard-Gateway des Rechners. Methoden hierfür finden Sie im System.Net.NetworkInformation-Namespace. –

+0

Und was passiert, wenn es einige Netzwerkadressen gibt, die über ein anderes Gateway als das Standardgateway weitergeleitet werden? gibt es eine Möglichkeit, auf die Routing-Tabelle zuzugreifen und sie abzufragen? – r0u1i

0

Der vollständig hackish Weg, es zu tun mit dem Befehl „arp -a“ und liest und analysiert die Ergebnisse des Befehls (mit dem ARP Cache bereits im Besitz von Windows) laufen würde.

Andernfalls müssen Sie ARP in Ihren Protokollstapel einbeziehen. Dies ist, wie Ihr System selbst arbeitet, um herauszufinden, wo Frames gesendet werden. Oder, wenn Sie sich keine Sorgen machen, ineffizient zu sein, können Sie Ihr Ethernet-Ziel wie folgt einstellen: FF: FF: FF: FF: FF: FF und fluten Sie alle im selben LAN wie Sie. Wenn etwas reagiert oder Sie ein Paket erhalten, cachen Sie es selbst, um die richtige Ziel-MAC-Adresse zu haben.

Persönlich, wenn Sie die Flut alle in meinem Netzwerk nähern, würde ich dich verletzen, aber abhängig von Ihrer Situation könnte es ein ziemlich einfacher Hack sein. Das Ausführen einer 100% vollständigen Stackimplementierung ist jedoch ziemlich komplex, da es viele Randfälle gibt, die gut unterstützt werden sollten (wie zum Beispiel das Behandeln von Proxy-ARP, unentgeltliches ARP usw.).

+0

Nehmen wir an, ich nenne "arp -a". Wie ermittle ich die IP-Adresse des nächsten Gateways in der Route zu sagen, 74.125.43.104 (google.com)? – r0u1i

+0

Ich sehe, Sie haben sich eine Lösung, die funktioniert, aber Sie müssen auch auf die Routing-Tabelle für welche Schnittstelle gebunden Sie suchen und herauszufinden, was Sie Standard-Gateway ist. –

+0

Ich denke, dass Standard-Gateways automatisch als Routing-Einträge mit Ziel 0.0.0.0 und Maske 0.0.0.0 hinzugefügt werden, also sollte ich über sie gehen, wenn ich die Routing-Tabelle scanne – r0u1i

Verwandte Themen