Funktion für MAC Adresse

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

Funktion für MAC Adresse

Beitrag von Chimerer » 09.04.2003 18:42:34

Bin gerade dabei mir ein kleines ARP-Poisoning Tool in C zu coden, allerdings weiß ich nicht wie ich die MAC-Adresse eines anderen Hosts herausbekomme, die eigene ist ja kein Problem.

Kennt jemand ne Funktion dafür?

ernohl
Beiträge: 1248
Registriert: 04.07.2002 08:11:56
Wohnort: HL

Re: Funktion für MAC Adresse

Beitrag von ernohl » 09.04.2003 19:49:48

Chimerer hat geschrieben:Bin gerade dabei mir ein kleines ARP-Poisoning Tool in C zu coden, allerdings weiß ich nicht wie ich die MAC-Adresse eines anderen Hosts herausbekomme, die eigene ist ja kein Problem.
Welche Funktionen es dafür in C gibt - null Ahnung. :cry:
Aber grundsätzlich von hinten durch die Brust kannst du folgendes machen:
Dafür sorgen, dass der andere Rechner in den arp-cache kommt, z. B. mit ping. Danach den arp-cache auslesen. In der bash:

Code: Alles auswählen

arp -a
Gruß
ernohl

Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

Beitrag von Chimerer » 09.04.2003 20:06:51

Daran hab ich auch schon gedacht, aber es muss doch noch eine "sauberere" Methode geben. :roll:

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 10.04.2003 15:41:14

Hmm, wenn es wirklich keine API gibt (kann ich mir gut vorstellen) fallen mir folgende Moglichkeiten ein:
  • eine TCP Verbindung zu dem entsprechenden Host aufbauen (ist egal, ob die wirklich zustande kommt oder nicht). Danach sollte die MAC Adresse des remote Host im ARP Cache der lokalen Maschine zu finden sein. Wie man den ausliest, sollte man im Source des arp Tools herausfinden können. Kann gut sein, dass die Infos in /proc zu finden sind.
  • die "zu Fuss" Methode... Du fakest mittels Raw Sockets das entsprechende APR who-has oder who-is Kommando, und fängst die is-at Antwort ab.
Die erste Methode erscheint mir deutlich sauberer.

Da du eh' schon mit solchen Sachen herumspielst setze ich 'mal voraus, dass Du Dich einigermassen auskennst. Allerdings trotzdem der "ich-glaube-zwar-dass-es-Dir-klar-ist-aber-ich-will-nur-sicher-gehen-Hinweis":
ARP funktioniert natürlich nur in einem lokalen Ethernet und die MAC Adresse ist auch nur innerhalb des selben überhaupt zu bekommen... ;-)

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

Beitrag von Chimerer » 10.04.2003 22:15:36

Ja die Daten stehen in /proc/net/arp. :)

Ok so weit so gut. Bis jetzt wird die Hardware-Adresse einer übergebenen IP in einem String abgespeichert, das ganze noch ohne vorherigen TCP Aufbau. Jetzt stellt sich aber noch das Problem, diesen String in ein u_char Array umzuwandeln. Jemand ne Idee? Der Codeabschnitt sieht bis jetzt so aus: (quick & dirty)

Code: Alles auswählen

while(fgets(buffer, 500, arp_cache))
{    
  if (mac = strstr(buffer, "10.10.0.2"))  break;  
} 
    
if (mac)
 {
  while (*(mac++))
   {
    if (*mac == ':') break;      
   }
   mac -= 2;
   *(mac+17) = '\0';
   printf("%s", mac);   
 }
else printf("Unbekannte IP");
    
fclose(arp_cache);
arp_cache ist das Filehandle zu /proc/net/arp.
Der resultierende String mac sieht beispielsweise so aus: "00:00:60:44:6E:66"

Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

Beitrag von Chimerer » 12.04.2003 17:00:16

Habs geschafft. :D Jetzt fehlt nur noch der TCP Aufbau und das Tool ist prinzipiell fertig. So hab ich s gemacht, falls es jemanden interessiert:

Code: Alles auswählen


...code aus meinem letzten post einfügen...

int hextoint(char c) {
c = toupper(c);
return (c > '9' ? c - 'A' + 10 : c - '0');
}

for (x=0; x < 17; x++)
 {
 if (mac[x] != ':')  
  {
   tac[y] = mac[x];
   y++;
  }
 }
 
tac[12] = '\0'; 
     
for (ptr = tac, ptr2 = enet_dst; *ptr; ptr+=2, ptr2++) 
{
temp = (hextoint(*ptr) << 4) + hextoint(*(ptr+1));
*ptr2 = (char)temp;
}
*ptr2 = '\0';
Jetzt befindet sich die MAC-Adresse als u_char Array in enet_dst.

char *ptr, *ptr2
int temp, x, y=0
char tac[13]

Antworten