Поскажите, возможно ли блокировать запрос браузера путем моментального скармливания ему фальшивого ответа "как бы от сервера" с помощью WinPCap? Насколько это надежно? Вообще мне нужно не пропускать пакеты, содержащие GET-запросу к неугодным сайтам. Но, поскольку WinPCap не позволяет "проглатывать" пакеты с этими запросами, а написание TDI фильтра для меня скорее всего растянется на несколько месяцев (бесплатных готовых фильтрующих библиотек я не смог найти), появилась идея просто возвратить браузеру HTTP 200 OK с текстом "Доступ запрещен", как только мое приложение ловит исходящий GET-запрос. Благо WinPcap позволяет генерировать "сырые" пакеты и инжектировать из в ядро. Опыт в программировании сетей у меня не большой. Какие проблемы могут возникнуть с таким вот подходом? Спасибо
Если нужен запрет по именам - вбиваешь в файл hosts эти имена и несуществующий IP, типа 127.0.0.2 Или подними сервер простенький по этому адресу у себя и отвечай то, что тебе нужно.
по-моему, тебе подходит только инжект длл и установка хуков на send/recv; а лучшее срадство - pf на шлюзе.
The purpose of WinPcap is to give this kind of access to Win32 applications; it provides facilities to: capture raw packets, both the ones destined to the machine where it's running and the ones exchanged by other hosts (on shared media) filter the packets according to user-specified rules before dispatching them to the application transmit raw packets to the network gather statistical information on the network traffic если я не ошибаюсь, winpcap совмещает обе юниксовые libpcap и libnet
позвольте, вот вам арп сканер на winpcap (писал для своих нужд) но чтоб не пылился - выкладываю. http://www.sendspace.com/file/x9vuhd Код (Text): ///////////////////////////////////////////////////////////////////////// // Module: main.cpp // Purpose: General issues // Project: SubnetStealth v 0.1a // Author: sn0w ////////////////////////////////////////////////////////////////////////// #include <winsock2.h> #include <process.h> #include <stdio.h> #include <conio.h> #include "pcap.h" #include "headers.h" #include "misc.h" #include "opmode.h" #include "hostlist.h" #include "scan.h" ULONG g_nRealIPv4, g_nFakeIPv4; ULONG g_nRealNetmask; char STEALTH_MAC[6]; ////////////////////////////////////////////////////////////////////////// // Function: NPF_thread // Purpose: Low level traffic dispatching due to selected operation ////////////////////////////////////////////////////////////////////////// void __cdecl NPF_thread(void *param) { int rc; pcap_pkthdr *header; u_char *packet; ULONG current_op; pcap_t* cap_if = (pcap_t*)param; while((rc = pcap_next_ex(cap_if, &header, (const u_char**)&packet)) >= 0) { if(rc == 0) continue; // timeout current_op = QUERY_NPF_OPERATION(); if(current_op == OP_IDLE) { continue; } if(current_op & OP_END_TASK) { break; } if(current_op & OP_PARSE_ARP_RESPONSE) { ProcessARPReply((pether_packet_arp) packet); } if(current_op & OP_PRINT_SOME_IDLE) { PrintTCPPacketIdle((pether_packet_tcpip) packet); } } if(rc == -1) { printf("\t[-] Error reading the packets: %s\n", pcap_geterr(cap_if)); } pcap_close(cap_if); printf("\n\n\t<NPF session is terminated>\n"); } ////////////////////////////////////////////////////////////////////////// // Function: select_iface() // Purpose: Provides ethernet adapter selection through console interface ////////////////////////////////////////////////////////////////////////// pcap_t* select_iface() { char errbuf[PCAP_ERRBUF_SIZE+1]; pcap_addr_t *a; pcap_if_t *alldevs, *current_if; pcap_t *fp = NULL; int idx = 0 , nsel; if(pcap_findalldevs(&alldevs, errbuf) == -1) { printf("\t[-] Error in pcap_findalldevs: %s\n", errbuf); return NULL; } for(current_if = alldevs; current_if != NULL; current_if = current_if->next) { printf("\t [%d] %s\n", ++idx, current_if->description); for(a = current_if->addresses; a != NULL; a = a->next) if(a->addr->sa_family == AF_INET) { if (a->addr) printf("\t\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr)); if (a->netmask) printf("\t\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr)); } printf("\n"); } printf("\n\tSelect the adapter to use:\n\t> "); scanf("%d", &nsel); printf("\n"); if(!nsel || nsel > idx) { printf("\t[-] Invalid adapter id selected\n"); goto endsub; } for(current_if = alldevs, idx = 1; nsel != idx ; current_if = current_if->next, idx++); for(a = current_if->addresses; a != NULL; a = a->next) if(a->addr->sa_family == AF_INET) { if (a->addr) { memcpy(&g_nFakeIPv4, &((struct sockaddr_in *)a->addr)->sin_addr.s_addr, 4); g_nRealIPv4 = g_nFakeIPv4; } if (a->netmask) memcpy(&g_nRealNetmask, &((struct sockaddr_in *)a->netmask)->sin_addr.s_addr, 4); } if((fp = pcap_open_live(current_if->name, 0xffff, TRUE, 10, errbuf)) != NULL) { if(pcap_datalink(fp) != DLT_EN10MB) { printf("\t[-] Only ethernet networks are supported.\n"); pcap_close(fp); fp = NULL; } } else { printf("\t[-] Error opening adapter.\n"); } endsub: pcap_freealldevs(alldevs); return fp; } ////////////////////////////////////////////////////////////////////////// // Function: main() // Purpose: Entry point, flow control ////////////////////////////////////////////////////////////////////////// int main() { pcap_t* cap_if; printf("\n\t--------------------------------------\n"); printf("\tSubnetStealth Scanner ver 0.1a by sn0w\n"); printf("\t--------------------------------------\n\n"); // // Phase0 initialization // if((cap_if = select_iface()) == NULL) { printf("\t[-] Initialization failed\n"); return -1; } printf("\t[+] Preparing...\n"); // // Phase1 initialization // HostListInitialize(); RandomMAC(); OP_INIT(); _beginthread(NPF_thread, 0, (void*)cap_if); printf("\t[+] General initialization completed\n"); // // Scan setup // char spoof_input_ip[64]; printf("\n\t NOTE: due to stealth mode, your MAC should be spoofed.\n"); printf("\t But also you should specify the stealth IP address,\n"); printf("\t from which the TCP SYN scan will be performed.\n"); printf("\t I recommend the address that is known that is dead.\n\n"); printf("\t WARNING: SETTING A STEALTH IP THE SAME AS YOUR GATEWAY\n"); printf("\t WILL CAUSE A PERMANENT DDOS FOR ENTIRE SUBNET!\n\n"); printf("\t Current stealth MAC: %s\n", mactos((LPBYTE)STEALTH_MAC)); printf("\t Current IP: %s/%d (%d hosts)\n", iptos(g_nFakeIPv4), NetGetCIDRValue(g_nRealNetmask), NetNumHosts(g_nFakeIPv4, g_nRealNetmask)); printf("\n\t Enter a stealth IP: "); scanf("%64s", spoof_input_ip); g_nFakeIPv4 = inet_addr(spoof_input_ip); if(g_nFakeIPv4 == INADDR_NONE) { printf("\n\n\t[-] The address you have entered is not valid!"); SET_NPF_OPERATION(OP_END_TASK); getch(); return -2; } printf("\n\n\t[+] Performing hardware scan...\n"); // ARP SCAN BLOCK SET_NPF_OPERATION(OP_PARSE_ARP_RESPONSE); QueryHardwareSubnet(cap_if, htonl(NetFirstHost(g_nRealIPv4, g_nRealNetmask)), htonl(NetLastHost(g_nRealIPv4, g_nRealNetmask)), g_nFakeIPv4, 2, 500); Sleep(250); FLUSH_NPF_OPERATION(); // END OF SCAN BLOCK ParseHWScanResults(); HostListClear(); printf("\t[+] Hardware scan completed\n"); while(!kbhit()) { } return 0; }
Как бы можно, дело в том, что WinPCap слушает пакеты, но не имеет возможность изменить или заблокировать их. С другой стороны, да вы можете создать свой собственный пакет. И получается половина работы. Ведь запрос в нет ушел, а раз ушел, то значит на запрос, который послал браузер в нет придет еще ответ от реального сервера, который требуется заблокировать. Таким образом резюмируя, вам потребуется еще и фильтр траффика. Думаю это нужно сажать на Tcp стек. Теоретически. Простейший фильтр хуком, винда предоставляет, но только одному клиенту. Т.е. если кто-то уже юзает его вам придется фильтрить на тсп. А раз так, то получается уж лучше сразу делать фильтр трафика изначально и не заморачиваться с WinPCap. Потому что по факту вам нужен функционал фаервола. Могу предложить следующее решение, устанавливаете какой-нибудь фаервол и запрещаете ходить на на определенный сайт. Но запрос winpcap все равно будет видеть, тут уж формируете ответ на этот запрос и отсылаете его браузеру.