/* For educational purposes only!!!
* Works only in a LAN, ofcorse.
* Under the GPL
*/
#include <iostream>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <usi++/usi++.h>
const char *datfile = "../data/ethercodes.dat";
int decodeHW(char *, char *);
int main(int argc, char **argv)
{
if (argc < 2) {
cout<<"Usage: "<<argv[0]<<" host\n";
exit(1);
}
srand(time(NULL));
int r = rand() % 31337;
char buf[100];
ICMP icmp(argv[1]);
cout<<"HardSpy v 0.1 by S. Krahmer\n"
<<"Pinging host "<<argv[1]<<" ... \n";
#ifdef linux
icmp.init_device("eth0", 1, 100);
#else
icmp.init_device("ed0", 1, 500);
#endif
icmp.set_type(ICMP_ECHO);
icmp.set_icmpId(r);
icmp.sendpack("Hi, this is hardSpy!");
icmp.set_icmpId(0);
while (icmp.get_icmpId() != r || icmp.get_type() != ICMP_ECHOREPLY) {
icmp.sniffpack(buf, 100);
}
cout<<"Btw, the reply was: "<<buf<<endl;
char mac[100];
decodeHW(argv[1], icmp.get_hwsrc(mac, 100));
return 0;
}
int decodeHW(char *host, char *mac)
{
FILE *f;
char s[10];
char rbuf[1000];
unsigned char c[3];
memset(s, 0, 10);
cout<<"The MAC of "<<host<<" is '"<<mac<<"'\n";
if ((f = fopen(datfile, "r")) == NULL) {
perror("fopen");
exit(errno);
}
mac[8] = 0;
sscanf(mac, "%02x:%02x:%02x", c, &c[1], &c[2]);
sprintf(s, "%x:%x:%x%c", c[0], c[1], c[2], 0x09);
bool found = false;
memset(rbuf, 0, 1000);
while (fgets(rbuf, 1000-1, f) != NULL) {
if (strncmp(rbuf, s, strlen(s)) == 0) {
cout<<"That is -> "<<rbuf<<endl;
found = true;
}
memset(rbuf, 0, 1000);
}
if (!found) {
cout<<"Sorry, can't find "<<s<<" in my database.\n";
}
fclose(f);
return 0;
}