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?
Funktion für MAC Adresse
Funktion für MAC Adresse
[ jabber ] chimerer@amessage.de
Re: Funktion für MAC Adresse
Welche Funktionen es dafür in C gibt - null Ahnung.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.
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
ernohl
Daran hab ich auch schon gedacht, aber es muss doch noch eine "sauberere" Methode geben.
[ jabber ] chimerer@amessage.de
- pdreker
- Beiträge: 8298
- Registriert: 29.07.2002 21:53:30
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Nürnberg
Hmm, wenn es wirklich keine API gibt (kann ich mir gut vorstellen) fallen mir folgende Moglichkeiten ein:
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
- 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.
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
Jabber: pdreker@debianforum.de
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)
arp_cache ist das Filehandle zu /proc/net/arp.
Der resultierende String mac sieht beispielsweise so aus: "00:00:60:44:6E:66"
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);
Der resultierende String mac sieht beispielsweise so aus: "00:00:60:44:6E:66"
[ jabber ] chimerer@amessage.de
Habs geschafft. Jetzt fehlt nur noch der TCP Aufbau und das Tool ist prinzipiell fertig. So hab ich s gemacht, falls es jemanden interessiert:
Jetzt befindet sich die MAC-Adresse als u_char Array in enet_dst.
char *ptr, *ptr2
int temp, x, y=0
char tac[13]
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';
char *ptr, *ptr2
int temp, x, y=0
char tac[13]
[ jabber ] chimerer@amessage.de