Побег через брандмаузер


Листинг 5 создание сырого сокета (дескриптора) и перевод его в неразборчивый режим - часть 2


// атрибут IP_HDRINCL. дать-то, конечно, можно, но ведь можно и не давать!

// флаг IP_HDRINCL сообщает системе, что аплеуха хочет сама формировать

// IP заголовок отправляемых пакетов, а принятые пакеты ей отдаются с IP

// заголовком в любом случае. подробности в PlatformSDK->TCP/IP Raw Sockets

//if (setsockopt(raw_socket, IPPROTO_IP, IP_HDRINCL, &optval, sizeof(optval))== -1)…

 

// перечисляем все интерфейсы (т.е. адреса IP-адресов всех шлюзов, что

// есть на компьютере. при ppp-подлюкчении к инетернет обычно имеется

// всего один IP-адрес, назначенный DHCP сервером провайдера, однако,

// в локальной сети это не так

if ((zzz = WSAIoctl(raw_socket, SIO_ADDRESS_LIST_QUERY, 0, 0, addrlist,

        sizeof(addrlist), &N, 0, 0)) == SOCKET_ERROR) return -1;

// теперь мы должны сделать bind на все интерфейсы, выделив каждый в свой

// поток (весь сокеты - блокируемые), однако, в данном демонстрационном

// примере слушается лишь IP первого попавшегося под руку интерфейса

addr.sin_family = AF_INET;

addr.sin_addr   = ((struct sockaddr_in*) llist->Address[0].lpSockaddr)->sin_addr;

if (bind(raw_socket, (struct sockaddr*) &addr, sizeof(addr))==SOCKET_ERROR) return -1;

 

#define SIO_RCVALL  0x98000001

 

// сообщаем системе, что мы хотим получать все пакеты, проходящие мимо нее

if (zzz=WSAIoctl(raw_socket,SIO_RCVALL,&optval,sizeof(optval),0,0,&N,0,0)) return –1;

 

// получаем все пакеты, приходящие на данный интерфейс

while(1)

{

       if ((len = recv(raw_socket, buf, sizeof(buf), 0)) < 1) return -1;

       …

}




- Начало -  - Назад -  - Вперед -