IP-Adresse aus MAC-Adresse ermitteln



  • Hallo,

    wurde gerade vom Telefon-SysAdmin gefragt, ob man programmtechnisch aus der MAC-Adresse eines smon-IP-Telefons seine aktuelle IP-Adresse ermitteln kann.

    Hintergrund: Die Telefone liegen im Netz 192.168.111.x und die Rechner im Netz 192.168.100.x. Wenn ich per ::GetIPNetTable die lokale Table abfrage bekomme ich nur sehr wenige Einträge, die leider nicht die gewünschten Einträge enthalten.

    Wie könnte ich an alle MAC-Adressen in unseren Subnetzen kommen?

    Gruss
    Ludger.



  • An alle Adressen kommst Du, indem Du alle Adressen anpingst.... dazu musst Du nur den Ip-bereich kennen und dann pingen...
    Über "arp -a" oder die entsprechende WinAPI Funktion kommst Du dann an die MAC Adresse...



  • Hier ist sogar schon die fertige Lösung:
    http://www.binarytides.com/get-mac-address-from-ip-in-winsock/

    /*
    Author: Silver Moon
    Find mac address of a given IP address using iphlpapi
    */
    
    #include "winsock2.h"
    #include "iphlpapi.h"	//For SendARP
    #include "stdio.h"
    #include "conio.h"
    
    #pragma comment(lib , "iphlpapi.lib") //For iphlpapi
    #pragma comment(lib , "ws2_32.lib") //For winsock
    
    void GetMacAddress(unsigned char * , struct in_addr );
    
    int main() 
    {
    	unsigned char mac[6];
    	struct in_addr srcip;
    	char ip_address[32];
    
    	WSADATA firstsock;
    
    	if (WSAStartup(MAKEWORD(2,2),&firstsock) != 0) 
    	{
    		printf("\nFailed to initialise winsock.");
    		printf("\nError Code : %d" , WSAGetLastError() );
    		return 1;
    	}
    
    	//Ask user to select the device he wants to use
    	printf("Enter the ip address : ");
    	scanf_s("%s",ip_address);
    	srcip.s_addr = inet_addr(ip_address);
    
    	//Get mac addresses of the ip
    	GetMacAddress(mac , srcip);
    	printf("Selected device has mac address : %.2X-%.2X-%.2X-%.2X-%.2X-%.2X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
    	printf("\n");
    
    	_getch();
    	return 0;
    }
    
    /*
    	Get the mac address of a given ip
    */
    void GetMacAddress(unsigned char *mac , struct in_addr destip)
    {
    	DWORD ret;
    	IPAddr srcip;
    	ULONG MacAddr[2];
    	ULONG PhyAddrLen = 6;  /* default to length of six bytes */
    	int i;
    
    	srcip = 0;
    
    	//Send an arp packet
    	ret = SendARP((IPAddr) destip.S_un.S_addr , srcip , MacAddr , &PhyAddrLen);
    
    	//Prepare the mac address
    	if(PhyAddrLen)
    	{
    		BYTE *bMacAddr = (BYTE *) & MacAddr;
    		for (i = 0; i < (int) PhyAddrLen; i++)
    		{
    			mac[i] = (char)bMacAddr[i];
    		}
    	}
    }
    


  • Jochen Kalmbach schrieb:

    An alle Adressen kommst Du, indem Du alle Adressen anpingst.... dazu musst Du nur den Ip-bereich kennen und dann pingen...
    Über "arp -a" oder die entsprechende WinAPI Funktion kommst Du dann an die MAC Adresse...

    Aber nicht über Netzwerkgrenzen hinweg...



  • MAC Adressen bekommt man immer nur im lokalen Subnetzt... sonst hat man irgendwas nicht richtig verstanden...



  • 👍



  • Hallo Jochen und die anderen,

    antworte wegen einer Mageninfektion erst jetzt.

    Ihr habt mich falsch verstanden.

    Im Code von Jochen steht folgendes:

    /*
    Author: Silver Moon
    Find mac address of a given IP address using iphlpapi
    */
    

    Ich habe aber die MAC-Adresse des Gerätes und will die dynamisch verteilte aktuelle IP-Adresse ermitteln.

    Gruss
    Ludger.



  • Du hast die Antwort falsch verstanden:

    Jochen Kalmbach schrieb:

    An alle Adressen kommst Du, indem Du alle Adressen anpingst.... dazu musst Du nur den Ip-bereich kennen und dann pingen...

    ...um dann zu den gefundenen IP-Adressen die MAC-Adressen zu ermitteln, brauchst Du eine Funktion, die die MAC-Adresse einer IP ermittelt. Und diese vergleichst Du dann mit der bekannten MAC-Adresse, um die eine IP-Adresse zu ermitteln.



  • Um Missverständnissen vorzubeugen: Die MAC Adresse ist pro Gerät definiert und beinhaltet keine Informationen über die (oft dynamische ) IP Adresse.
    Wenn man die IP aus einer MAC Adresse haben will, muss dynamisch abgefragt werden welche IP-Informationen gerade verwendet wird. Diese Informationen werden direkt nur in lokalen Netzen verteilt.

    Natürlich kann man das Gerät mit der aktuellen MAC Adresse ansprechen und fragen ob es Informationen über die IP Adresse hat, aber sowas ist nicht direkt in nicht lokalen Netzen vorgesehen.

    Wie auch? Man hat ja nicht die IP Adresse um das Gerät anzusprechen und zu fragen welche IP Adresse es hat :D. Man kann mit der MAC Adresse alleine im Internet keine Pakete an ein Ziel dirigieren. Und das ganze Internet durchzupingen dürfte etwas dauern 😉



  • Frag deinen lokalen DHCP-Server. Der weiß genau, welchem Gerät er welche IP gegeben hat.



  • Eine MAC-Adresse kann aber auch mehr als eine IP-Adresse haben, insofern kann man allgemein nicht nach "der" IP-Adresse zu einer MAC-Adresse fragen.



  • Danke für euere Antworten,

    da ich den IP-Bereich kenne, teste ich einmal die Lösung mit dem pingen.

    Gruss
    Ludger.


Log in to reply