Стоит задача перехватывать входящий/исходящий трафик на раб. станции. В целях мониторинга и аудита. Вопрос: с чего начать, что изучить, какие способы наиболее правильные и удобные? (Возможно ли воспользоваться статьями МС-РЕМа по перехвату АПИ ? (часть 1.. еще стоит разобраться со второй)) Для примера: требуется перехвать letnet-сессию. Спасибо за ссылки, советы, названия книжек. ПС: пишу на делфе, АСМ почти не знаю.. Можно С++ примеры, разберусь.
WSAConnect Function и тому подобные? Потомчнее? Поискал мсдм по функциям ZwListenPort ZwConnectPort и нифига не нашлось... Я думал что они по аналогии - базовые
Перехватываю в юзермод, хочу сделать так же, как это делал МС-РЕМ в своей первой статье по перехвату. Да, дизасмить я не умею.. Думал что внятно про АСМ написал.
Народ, тема все еще актуальна.. Только теперь мне интересно, как хватать трафик в драйвере.. (уже почти готов аналог файлового монитора, ведется перехват ntOpenfile и тд.. ) А какие функции хватать чтобы перехватывать трафик? Для примера надо перехватить сеант FTP или SMTP C чего начать изучение?
На этом сайте есть исходник драйвера, работающего с ipfilter (кажется так) винды, но только под NT. Очень давно писал считалку трафика с пом. него. edited http://www.wasm.ru/search/search.php?stpos=0&query=ipfilter&stype=AND
как здесь уже писали, юзай LSP...это просто, дешево и сердито вняиный пример и описание технологии здесь http://www.komodia.com/index.php?page=lsp.html, как альтернативный вариант можно реализовать NDIS драйвер, у Хоглунда неплохо написано по теме, а с перехватом здесь лучше не заморачиваться имхо
может пригодится Код (Text): #include <stdafx.h> #include <winsock2.h> #include <mstcpip.h> // Буфер для приёма данных #define MAX_PACKET_SIZE 65535 static BYTE Buffer[MAX_PACKET_SIZE]; int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsadata; // Инициализация WinSock. SOCKET RawSocket; // Cлущающий сокет. unsigned long flag = 1; // Флаг PROMISC Вкл/выкл. // Инициализация WS2_32 WSAStartup(MAKEWORD(2,2), &wsadata); // Создание RAW-сокета RawSocket = socket( AF_INET, SOCK_RAW, IPPROTO_IP ); // Определение имени хоста char HostName[256]; gethostname(HostName, sizeof(HostName)); printf("HostName = %s \n", HostName); // Определение информации по имени хоста PHOSTENT pLocalHostEnt; pLocalHostEnt = gethostbyname(HostName); // Подготовка структуры SockAddr с адресом хоста SOCKADDR_IN SockAddr; ZeroMemory(&SockAddr, sizeof(SockAddr)); SockAddr.sin_family = AF_INET; SockAddr.sin_addr.s_addr = ((in_addr *)pLocalHostEnt->h_addr_list[0])->s_addr; // Привязка bind(RawSocket, (SOCKADDR *)&SockAddr, sizeof(SOCKADDR)); // Переключение сетевой карты в "promiscuous mode" для захвата всех пакетов ioctlsocket(RawSocket, SIO_RCVALL, &flag); // Приём IP-пакетов. while( true ) { int count; count = recv( RawSocket, (char *)Buffer, sizeof(Buffer), 0 ); printf("Len = %d \n", count); // --- код для обработки и записи захваченного IP-пакета --- } closesocket(RawSocket); WSACleanup(); }