Скрин-сэйвер «Нюхач» Николай «GorluM» Андреев Хакер, номер #077, стр. 077-112-3 Сразу после блока switch можно приступать к ловле пакетов и выводу их на экран. Я решил выводить всю информацию на консоль, растянутую на весь экран. Смотрится обалденно, особенно, если раскрасить пакеты в разные цвета. Ну, а как получать пакеты я сейчас покажу. Сложного в этом ничего нет, техника известная и, возможно, мы о ней уже писали. [кодим сниффер] Для того чтобы иметь возможность слушать трафик в windows, не обязательно писать хитрые драйверы-фильтры или учиться работать с WinPCap. Сниффер можно написать на базе самых обычных виндовых сокетов. Достаточно всего лишь создать RAW-сокет и перевести сетевую карточку в неразборчивый режим. После этого, туда будут валиться все пакеты, которые летают через твою карточку. У меня, кстати, в роли сетевухи выступила WiFi-карточка и ничего, сниффер разницы не почувствовал. После активации библиотеки WinSock с помощью функции WSAStartup сырой сокет можно создать вот так: s = socket(AF_INET, SOCK_RAW, IPPROTO_IP); gethostname(name, sizeof(name)); phe = gethostbyname( name ); ZeroMemory( &sa, sizeof(sa) ); sa.sin_family = AF_INET; sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr; bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR)); Затем нам надо перевести карточку применительно к нашему сокету в неразборчивый режим вот такой строчкой кода: ioctlsocket(s, SIO_RCVALL, &flag). Сокет s после этого будет использоваться всякий раз, когда мы захотим получить пакет, проходящий через сетевуху. После всех этих манипуляций можно считать, что сниффер готов к работе. А значит, нам остается до последней капли крови, а точнее до первого движения мышкой, принимать с помощью функции recv все пакеты в буфер, а буфер выводить на экран. [консоль консоли рознь] Чтобы вывести полученный с помощью recv пакет на консоль, мы должны вначале ее создать. Ведь мы делали обычное приложение, а не консольное (и, кстати, правильно делали, консольное – сплошные тормоза). Чтобы в приложении создать консоль надо воспользоваться функцией AllocConsole. А так как у нас она должна быть активным окном, а не где-нибудь на бэкграунде, нам надо переместить фокус на нее с помощью функции SetActiveWindows в связке с GetConsoleWindow. Возможно, у тебя возникнет вопрос, как пользоваться подобной консолью, как выводить на нее текст? На самом деле очень просто. hStdout = GetStdHandle(STD_OUTPUT_HANDLE); Достаточно получить хэндл стандартного вывода. А с этим хэндлом обращаться как с файлом. К примеру, вывести на экран текст можно той же функцией, которую ты используешь обычно для записи на диск – WriteFile. Подобный вывод несколько сложнее, чем обычные printf или cout, но в разы быстрее. Это будет заметно, если через карточку полетит много пакетов. Чтобы вывести пакет, который отнюдь не обязательно содержит текст, я написал небольшую функцию, которая преобразует любой буфер в три колонки, с адресом, с шестнадцатеричными и с символьными представлениями. Все это дело неплохо смотрится на экране и напоминает какой-нибудь HEX-вьювер. Функция работает очень просто, она манипулирует wsprintf с форматированным выводом “%02X”, ты без проблем с ней разберешься. |