|
С/C++ - Самопальный снифер под Linux kas1e Xakep, номер #050, стр. 050-082-4 выводить: */ arp = (struct my_arp *)(buffer+14); printf ("arp hardware type :%.04x\n",arp->arp_hardware_type); /* и так далее со всем остальным. Полный пример идет бонусом к статье. */ } В итоге у нас получился простейший "анализатор пакетов", который и является снифером. POP3-снифер Для выискивания каких-то данных мы рассмотрим pop3-снифер. Он выбирает из буфера все строки, в которых есть слова "user " и "pass ". Затем выводит эти данные вместе с IP-адресами в лог-файл. Здесь нет ничего сложного, зато ярко демонстрируется незащищенность стандартного pop3-протокола. Вначале описываются необходимые переменные, а после этого делается функция, дабы читать код было проще: void print_ips() // делаем функцию { struct my_ip *ip; // описали нашей структурой struct in_addr need; // для необходимости при преобразовании ip = (struct my_ip *)(buffer+14); // показали, где в буфере лежит IP need.s_addr = ip->ip_source; // нужное поле fprintf (fd,"IP source :%s\n",inet_ntoa(need)); // вывод need.s_addr = ip->ip_dest; // нужное поле fprintf (fd,"IP dest :%s\n",inet_ntoa(need)); // вывод }; Функция просто выводит в файл IP-адреса, взятые с наших структур. Для преобразования используется структура in_addr и макрос inet_ntoa. Далее мы, как и выше, сначала поднимаем сокет, а потом делаем цикл, в котором будем читать в буфер данные с сокета. После этого начинаем искать в буфере нужные нам данные: memmem (buffer,bytes_recieved,"user ",5); Этой строчкой мы ищем 5 нужных байт в буфере. Используем memmem, чтобы не встала проблема встречи с нулями (конец строки). Если нашли данные, то ищем далее \x0d (конец строки) и вставляем туда 0 (для упрощения при выводе), если нет - наш цикл продолжится. И так же повторяем процедуру при поиске "pass " фразы. Вот пример обработки "user ": /* user */ p = memmem (buffer,bytes_recieved,"user ",5); // ищем в буфере "user " if (p==0) {} // если не нашли - ничего, else { d = memmem (p,50,"\x0d",1); // если нашли, то ищем 0d if (d==0) {} // если не нашли - ничего, else { // если нашли - открываем fd = fopen ("sniff_logs","a+"); // файл, суем нуль в конец print_ips(); // строки и выводим все memset ((char *)d,'\0',1); // это в файл fprintf (fd,"%s\n",p); // после чего файл close fclose (fd); }; }; И аналогично делается для "pass ". Работоспособные примеры можно скачать с www.xakep.ru или на диске ][. Заключение Вот, в принципе, и все. В заключение я хотел бы поблагодарить товарищей Сивухина и Синюхина. Фамилии, естественно, вымышленные, а сами товарищи в глубоком подполье :). И еще. Используй полученные знания в позитивных целях. |