MAC-Adresse ermitteln

T

tim081

Grünschnabel
Hallo Zusammen,

ich bin relativ unerfahren im Umgang mit Linux und muss für die Arbeit ein kleines Konsolentool schreiben, welches die MAC-Adresse ausliest. Da man die unter Linux ja einfach ändern kann, soll einmal die verwendete Adresse ausgegeben werden (erhalte ich ja mit ifconfig), aber auch die "echte" MAC-Adresse aus dem Rom der Netzwerkkarte. Gibt es dafür eine Möglichkeit?

Schon mal danke im Voraus.
Tim
 
Darf ich mal fragen weshalb man die Adresse ändern kann wenn die in einem ROM steht?
 
ich glaube er meint damit das spoofen der mac adresse und dem system eine andere mac vorgaukelt
 
Wenn keine "alternative" MAC gesetzt ist bekommst du mit ifconfig die "echte" MAC.

Temporär ändern lässt sich die MAC via ifconfig <Interface Name> hw ether <mac-adresse>

HTH
 
Erstmal Danke für die Antworten:
Genau so eine temporäre Änderung meine ich. Wenn man jetzt mittels ifconfig <interface> hw ether die MAC geändert hat, hat man danach noch eine Möglichkeit die "echte" MAC-Adresse, die der Karte normal zugeordnet ist, abzufragen oder ist sie bis zu einem Neustart nicht mehr ermittelbar.
 
Nach meinem Wissenstand ist die ursprüngliche MAC dann nicht mehr ermittelbar, erst nach einen Neustart o.ä.
 
Ja dann vielen Dank für die Info. Dachte vielleicht irgendwo in /proc könnte man die herausbekommen. Aber habe bis jetzt auch nichts gefunden.
 
Hallo!

Ich habe mal mit strace geschaut wo ifconfig die Hardware-Adresse her bekommt. Dabei stieß ich auf die Funktion ioctl() und den Parameter SIOCGIFHWADDR. Nach einer kurzen Suche fand ich folgenden Beispiel-Code (von mir etwas abgeändert, war im Original bei mir nicht lauffähig):
Code:
#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <netinet/in.h>
#include <sys/ioctl.h>

int main(int argc, char **argv) {
	int sd;
	struct ifreq ifr;
	unsigned char *a;

	if (argc != 2) {
		fprintf(stderr, "Usage: ifname\n");
		return 2;
	}
	sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
	if (sd < 0) {
		perror("socket");
		return 1;
	}
	strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
	if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) {
		perror("ioctl SIOCGIFHWADDR");
		return 1;
	}
	a = (unsigned char *) &ifr.ifr_hwaddr.sa_data;
	printf("%02x:%02x:%02x:%02x:%02x:%02x\n", a[0],a[1],a[2],a[3],a[4],a[5]); 

	return 0;
}
Quelle: http://outflux.net/software/shorts/c/hw_get.c

Ein weiteres Beispiel ist hier zu finden: http://cboard.cprogramming.com/showthread.php?t=43261.

Allerdings habe ich keinen Hinweis auf eine Möglichkeit gefunden die MAC-Adresse direkt aus dem ROM der Netzwerkkarte auszulesen.

Gruß,
Philip
 
Hallo,

erstmal herzlichen Dank. Habe leider im Moment keine Zeit mehr es auszuprobieren. Werde es aber morgen vormittag mal versuchen und dann schreiben wie es geklappt hat.

Gruß
Tim
 
Hallo,

habe den Code von Philip mal ausprobiert. Nur leider wird nach der Änderung der Mac-Adresse mit "ifconfig hw ether" auch die geänderte ausgegeben und nicht die ursprüngliche "echte" Adresse der Karte. Werde wohl noch ein bisschen weiter suchen müssen.
 
Für alle, die an der Lösung interessiert sind.

Es gibt ein kleines Konsolentool "hwinfo", welches man einfach unter Linux installieren kann und das alle möglichen Hardwareinformationen (auch die korrekte MAC-Adresse) ausgibt.

Gruß Tim
 
Ah, Danke. Hast du mal geschaut woher hwinfo seine Daten nimmt, insbesondere eben die MAC?
 
Habe mir den Quelltext mal angeschaut. Aber nicht das meiste verstanden. Ich glaube das macht es zusammen mit den Treibermodulen u. greift wohl somit auf die Hardware zu. Aber genau sagen kann ich es leider nicht.
 
Hallo!

1) Ich habe herausgefunden das die MAC-Adresse in /sys zu finden ist und zwar in
Code:
/sys/class/net/eth0/address
. Wenn man das in einem Skript verwenden will ist es leichter als über den von mir erwähnten Systemcall ioctl. Allerdings ist das immer noch nicht die Adresse aus dem ROM.

2) Habe mir hwinfo angeschaut. Bei mir hat es nach Änderung der MAC-Adresse auch diese angezeigt und nicht die korrekte (00:c0:9f:31:11:3d):
Code:
# hwinfo --network
25: None 00.0: 10701 Ethernet
  [Created at net.119]
[COLOR="Red"]  UDI: /org/freedesktop/Hal/devices/net_00_c0_9f_31_11_3d[/COLOR]
  Unique ID: usDW.ndpeucax6V1
  Parent ID: rBUF.uE+1Gsq0aS2
  SysFS ID: /class/net/eth0
  SysFS Device Link: /devices/pci0000:00/0000:00:1e.0/0000:02:02.0
  Hardware Class: network interface
  Model: "Ethernet network interface"
  Driver: "b44"
  Driver Modules: "b44"
  Device File: eth0
  HW Address: 00:c0:9f:31:11:3f
  Link detected: yes
  Config Status: cfg=new, avail=yes, need=no, active=unknown
  Attached to: #14 (Ethernet controller)

Was mich verwundert hat ist die rot markierte Zeile in der die richtige MAC-Adresse ja als Teil einer Pfad-Angabe drin steht. Nach etwas suchen bin ich darauf gekommen das diese "UDI" von HAL verwendet wird. Mit dem Programm "lshal" kann man sich HAL-Informationen anzeigen lassen und ich staunte nicht schlecht als ich dort meine korrekte MAC-Adresse entdeckte:
Code:
udi = '/org/freedesktop/Hal/devices/net_00_c0_9f_31_11_3d'
  info.udi = '/org/freedesktop/Hal/devices/net_00_c0_9f_31_11_3d'  (string)
  linux.subsystem = 'net'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  net.80203.mac_address = 827304513853  (0xc09f31113d)  (uint64)
  info.product = 'Networking Interface'  (string)
  net.arp_proto_hw_id = 1  (0x1)  (int)
  net.linux.ifindex = 2  (0x2)  (int)
  [COLOR="Red"]net.address = '00:c0:9f:31:11:3d'  (string)[/COLOR]
  net.interface = 'eth0'  (string)
  net.physical_device = '/org/freedesktop/Hal/devices/pci_14e4_4401'  (string)
  info.capabilities = {'net', 'net.80203'} (string list)
  info.category = 'net.80203'  (string)
  info.parent = '/org/freedesktop/Hal/devices/pci_14e4_4401'  (string)
  linux.sysfs_path = '/sys/class/net/eth0'  (string)

Mich würde noch interessieren ob das bei euch auch klappt.

Nachtrag: Habe gerade durch einen kurzen Blick in den hald Quellcode (sucht in hald/linux/device.c nach "net.address") herausgefunden das HAL die MAC-Adresse auch nur aus /sys holt. Der Trick dabei ist das hald die Informationen beim Systemstart sammelt und sich merkt. Deswegen wurde mir noch die alte (korrekte) Adresse ausgegeben. Nachdem ich hald neugestartet habe, hat auch dieser die neue (manipulierte) MAC wiedergegeben.

D.h. wir haben immer noch keinen verlässlichen Weg die reale MAC-Adresse herauszufinden.

Gruß,
Philip
 
Zuletzt bearbeitet:
Hallo,
gibt es schon eine sichere Möglichkeit die originale MAC auszulesen?
Gruß
 
Wow, einen 5 Jahre alten Thread auszugraben schafft auch nicht Jeder.
 
Hallo,

folgendes habe ich noch herausgefunden: mit der Software ethtool kann man den EEPROM der Netzwerkkarte auslesen. Allerdings funktioniert das nicht mit allen NICs und muss im entsprechenden Kernel-Treiber vorgesehen sein. Siehe ethtool man page und Setting the MAC Address from Linux.

Außerdem steht die MAC-Adresse nicht bei jeder Netzwerkkarte an der gleichen Stelle, sodass man vorher nachschauen muss wo sie steht. Ich weiß von zwei Fällen wo die MAC-Adresse direkt in den ersten 6 Bytes des EEPROM stand (siehe Red Hat Thread Find MAC address stored in NIC firmware).

Gruß,
Philip
 
Zuletzt bearbeitet:

Ähnliche Themen

So, das wars nun endgültig mit Centos und Linux

MAC Adresse eines entfernten ausgeschalteten Geräts im Netzwerk ermitteln

Debian Gateway

Netzwerkkarte wird nicht erkannt/identifiziert

Alle MAC-Adressen mit Hostnamen im Netzwerk ermitteln

Zurück
Oben