Laden...

Fehler beim auslesen der Mac Adresse über ARP

Erstellt von DennisM vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.877 Views
D
DennisM Themenstarter:in
30 Beiträge seit 2009
vor 15 Jahren
Fehler beim auslesen der Mac Adresse über ARP

Hallo zusammen,

ich versuche anhand des Hostnamen die IP Adresse auszulesen - das klappt auch wunderbar.
Dann möchte ich mit Hilfe dieser IP Adresse die Mac Adresse auslesen, hier bekomme ich als Wert allerdings immer nur 00-00-00-00-00-00.
Lasse ich das Feld Hostname leer bekomme ich allerdings irgendeine IP und die dazugehörige Mac Adresse richtig ausgelesen..

Kann mir einer kurz nen Tipp geben, wo der Fehler liegt?

Danke und viele Grüße
Dennis

public partial class Form1 : Form
    {

        [DllImport("Ws2_32.dll")]
        private static extern Int32 inet_addr(string ip);

        [DllImport("iphlpapi.dll", ExactSpelling = true)]
        public static extern int SendARP(int DestIP, int SrcIP, [Out] byte[] pMacAddr, ref int PhyAddrLen);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            try
            {
                //IP Adresse anhand des Hostnamen herausfinden
                String DnsName;
                DnsName = TXT_Computername.Text;
                System.Net.IPHostEntry IHE = System.Net.Dns.Resolve(DnsName);
                string[] IP = new string[IHE.AddressList.Length];
                for (int i = 0; i < IHE.AddressList.Length; i++)
                    IP[i] = IHE.AddressList[i].ToString();
                TXT_IP.Text = IP.GetValue(0).ToString();

                //Mac Adresse anhand der IP herausfinden
                IPAddress ip = IPAddress.Parse(IP.GetValue(0).ToString());
            
                byte[] ab = new byte[6];
                int len = ab.Length;

                int r = SendARP((int)ip.Address, 0, ab, ref len);
                string mac = BitConverter.ToString(ab, 0, 6);

                TXT_Mac.Text = mac;
            }
            catch (Exception)
            {
                TXT_IP.Text = "";
                TXT_Mac.Text = "Host not available";
            }
        }

D
7 Beiträge seit 2009
vor 15 Jahren

Kann es sein, dass ipv6 bei dir aktiviert ist?

D
DennisM Themenstarter:in
30 Beiträge seit 2009
vor 15 Jahren

EDIT: Funktioniert nur teilweise nicht, ARP ist nicht Routingfähig so wie ich gelesen habe. Gibt es eine Alternative dazu?

J
26 Beiträge seit 2009
vor 15 Jahren
ARP nicht routingfähig

Hi,

ARP ist nicht routingfähig. Der MAC Header wird bei jedem HOP über einen Router durch dessen MAC Header überschrieben. D.h. Wenn Du Hosts außerhalb Deines Netzes kontaktierst, steht im MAC Header der Datenpakete im Idealfall die MAC-Adresse des Routers über den Du gehst. Die MAC Adresse anderer Systeme kannst Du somit nicht eindeutig ermitteln. OK ich denke, Du könntest die MAC Adresse von Windows clients z.B. über WMI ermitteln, oder so...aber das hilft dir nicht was ?

D
DennisM Themenstarter:in
30 Beiträge seit 2009
vor 15 Jahren

Hi,

danke für die Erklärung.

An WMI hatte ich auch schon gedacht, aber was würde man mit Linux Maschinen machen?

D.h. ich müsste noch eine Unterscheidung reinbringen ob es eine Linux oder Windows Maschine ist... (:

Viele Grüße
Dennis

J
26 Beiträge seit 2009
vor 15 Jahren

Wofür benötigst du die mac adresse denn genau? Vielleicht gibt's ja noch eine andere Lösung.

Die Adresse wäre nicht das beste wenn du eine eindeutige indentifizierung eines systems neben der ip suchst. Denn nicht alle windows clients antworten auf wmi Anfragen wenn wmi z.B deaktiviert ist. Derartige Möglichkeiten gibt's auch unter linux, aber auch nur wenn die entsprechenden services laufen und erreichbar sind, was optional ist. Du kannst also die mac nur über Umwege ermitteln, die unter Umständen nicht zur verfügung stehen.

D
DennisM Themenstarter:in
30 Beiträge seit 2009
vor 15 Jahren

Hi,

ich programmiere ein Administrationsprogramm, das Funktionalitäten von Look@Lan und anderen Programmen beinhalten soll. (Als Übungsprojekt)

Ich weiß, dass die Mac Adressen in den ARP Tabellen der Router zu sehen sind,
aber mein Ausbilder erlaubt mir nicht die da auszulesen.

Eine Möglichkeit wäre noch in jedem Subnetz eine Art "Sender" aufzustellen,
der dann den ARP Broadcast sendet, aber das würde bedeuten, dass ich nur bei uns im Firmennetzwerk per Knopfdruck die Mac Adressen auslesen kann.
Sobald ich mit dem Tool zum Kunden fahren würde, würde es da dann nicht mehr ohne weiteres funktionieren, zumindest nicht, ohne dass ich dort wieder die "Sender" aufgestellt hätte.

S
167 Beiträge seit 2008
vor 15 Jahren

Hi,
Ich weiß, dass die Mac Adressen in den ARP Tabellen der Router zu sehen sind,
aber mein Ausbilder erlaubt mir nicht die da auszulesen.

Aber auch nur die der Hosts in direkt angeschlossenen Netzen.

X
1.177 Beiträge seit 2006
vor 15 Jahren

huhu,

schick selbst ein ARP Paket mit deinem Programm ins Netz und lausch auf die Antworten. Damit hast Du zwar deinen Sender, aber ein ARP-Broadcast ist in jedem Netz erlaubt.
iphlpapi.dll hilft dir unter Linux leider auch nichts.
Evtl. mit WinPCap einfach das Netzwerk abhören.

.Net kann zwar viel, ist aber durch die gekapselte Umgebung auch beschränkt - und ARP gehört eigentlich eher zu Treibern denn zu Programmen.

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

J
26 Beiträge seit 2009
vor 15 Jahren
MAC Adressen

Hi,

...dann kannst Du das Projekt nicht lösen. Um wirklich an die alle MAC-Adressen aus einem Netz zu kommen gibt es nur ein paar Möglichkeiten die stabil wären, und für diesen Zweck viel zu aufwändig sind.

  1. Die clients sind alle so konfiguriert, daß Sie mit Bordmitteln die MAC "auslesen" lassen (siehe z.B. WMI)
  2. Alle Clients führen ein Programm aus was deren MAC überträgt
  3. In jedem Netz ist ein client, der ein Programm ausführt, welches alles scannt (z.B. mit Deinem Snippet oben)
  4. Du stellst eine Probe(ein Computer der den Datenverkehr mitbekommt) an einem Span/Mirror- Port eines jeden Switches auf. Hier z.B. WinPCap unter win oder libpcap unter linux.
  5. Du liest den Arp-Cache aller Router aus, wie Du schon sagst. Dies machst Du schon von außen mit snmp. für die ARP-Caches gibt es eine Norm SNMP OID, die bei namhaften Herstellern implementiert sind (z.B. Cisco,Foundry)