Сказ о том как я ARP Monitor написал

Сегодня я хочу рассказать Вам как была написана мною программа ARP Monitor. Из названия понятно, что программа выполняет мониторинг ARP таблицы. Это действительно так, и, помимо мониторинга, она еще умеет выполнять функцию обнаружения подмены MAC адреса шлюза. Сообщение о подмене выводится на экран для администратора и записывается информация о вторжении в логи программы.
Эта разработка была выполнена в рамках моей научной практической работы в университете и является моей дипломной работой в настоящий момент. Это, собственно, был главный побуждающий фактор для меня, чтобы написать программу. Поскольку аналогичных продуктов Интернет предлагает большое количество, было принято решение сделать ARP Monitor доступным пользователям как Winows, так и Linux ОС. Плюс ко всему в программе предполагается GUI, что делает использование гораздо удобнее.

Так выглядит интерфейс программы ARP Monitor в Windows. Для Linux ОС GUI аналогичен. По кнопке Set IP of AP происходит добавление IP адреса точки доступа. Таким образом мы задаем дефолтный адрес, который не должен изменяться. То же самое происходит с MAC адресом по кнопке Set as default MAC.
Сразуже, как мы задали MAC адресустройства, ARP Monitor начинает циклично запрашивать результат ARP таблицы и сравнивать заданные значения с теми, что есть по факту при получении ответа на запрос.

Для демонстрации работы программы я не стал выполнять атаку arp spoofing на свою точку доступа, а просто в качестве дефолтного МАС адреса указал настоящий с измененной на конце двойкой на единицу. Работать программа в этом случае все равно будет правильно и сравнит наш "настоящий" МАС с тем, что получит из arp запроса. В итоге реакция монитора такая:
Для демонстрации работы программы я не стал выполнять атаку arp spoofing на свою точку доступа, а просто в качестве дефолтного МАС адреса указал настоящий с измененной на конце двойкой на единицу. Работать программа в этом случае все равно будет правильно и сравнит наш "настоящий" МАС с тем, что получит из arp запроса. В итоге реакция монитора такая:

В этом окне видна информация о МАС адресе, который заменил заданный нами адрес, а также имя устройства в сети, в данном случае это Dlink. При обнаружении различий в arp таблице выскакивает еще одно окошко с предупреждением.

Теперь немного о том, как все это реализовано. Для разработки использовалась среда NetBeans и язык Java. Поскольку, исполняемый файл один на обе системы, то в начале происходит проверка ОС, на которой запускается программа. делается это так:
public static void main(String[] args) throws IOException, InterruptedException {
if(isWindows()){
WinFrame wf = new WinFrame();
wf.show();
}else if(isMac()){
System.out.println("This is Macintosh");
System.out.println("It's version is: " + getOSVerion());
System.out.println("Couldn't to be run on your system. Sorry!");
}else if(isUnix ()){
LinFrame lm = new LinFrame();
ArrayList<String> urip= lm.runShellScript("ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | cut -d: -f2 | awk '{printf $1\"\\n\"}'");
String res = null;
for (int i=0; i < 1; i++) {
res = res + urip.get(i);
}
int w = res.lastIndexOf(".");
res = res.substring(4, w+1)+"0/24";
String z = lm.runLinuxCommand("nmap -sn "+res);
z = z + "\n\r" + lm.runLinuxCommand("arp -av");
lm.setCommand(z);
lm.show();
}else{
System.out.println("This is unknown OS");
}
}
Здесь видно, что на каждую ОС заведен свой класс для выполнения (кроме Macintosh, для нее пока нет интерфейса). После того, как ARP Monitor определился с операционкой, в окно вывода загружается ответ на запрос arp таблицы. Далее все действия заключаются в постоянном обращении к ОС за таблицей arp и сравнении данных. Все это реализовано через подачу системе команды из ее командной оболочки. Например, как здесь:
try {
s = runWinCommand("arp -a " + ip);
} catch (IOException ex) {
Logger.getLogger(WinFrame.class.getName()).log(Level.SEVERE, null, ex);
}
int h = 0;
int j = 0;
h = s.lastIndexOf("-");
try {
ipe = runWinCommand("arp -a");
} catch (IOException ex) {
Logger.getLogger(WinFrame.class.getName()).log(Level.SEVERE, null, ex);
}
runWinCommand в этом примере отвечает за передачу системе команды arp -a. Для Linux ОС реализация аналогичная.
Вот и все, что я хотел рассказать Вам про ARP Monitor собственной разработки. По всем вопросам оставляем пметки в комментариях к посту.