Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #77, МАЙ 2005 г.

Скрин-сэйвер «Нюхач»

Николай «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”, ты без проблем с ней разберешься.

Назад на стр. 077-112-2  Содержание  Вперед на стр. 077-112-4