Si por "secuestrar" que quería decir oler los paquetes a continuación, lo que debe hacer para hacerlo con WinPcap es la siguiente:
Encuentre el dispositivo que desea utilizar - See WinPcap tutorial.
Abrir un dispositivo que utiliza pcap_open
// Open the device
char errorBuffer[PCAP_ERRBUF_SIZE];
pcap_t *pcapDescriptor = pcap_open(source, // name of the device
snapshotLength, // portion of the packet to capture
// 65536 guarantees that the whole packet will be captured on all the link layers
attributes, // 0 for no flags, 1 for promiscuous
readTimeout, // read timeout
NULL, // authentication on the remote machine
errorBuffer); // error buffer
utilizar una función que lee los paquetes desde el descriptor como pcap_loop
int result = pcap_loop(pcapDescriptor, count, functionPointer, NULL);
Este bucle hasta que algo malo ha sucedido o el bucle se rompió usando una llamada a un método especial. Llamará al puntero de función para cada paquete.
En la función señaló poner en práctica algo que analiza los paquetes, debe verse como un pcap_handler
:
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
const u_char *);
Ahora todo lo que queda es para analizar los paquetes que su memoria intermedia se encuentra en el const u_char*
y su la longitud está en el campo pcap_pkthdr
estructura caplen
.
suponiendo que tiene GET HTTP a través de TCP sobre IPv4 sobre los paquetes de Ethernet, puede:
- Saltar 14 bytes de la cabecera Ethernet.
- Omita 20 bytes del encabezado IPv4 (suponiendo que no hay opciones de IPv4, si sospecha que las opciones IPv4 son posibles, puede leer los 5-8 bits del encabezado IPv4, multiplique eso por 4 y este sería el número de bytes toma el encabezado IPv4).
- Omita 20 bytes del encabezado TCP (suponiendo que no hay opciones TCP, si sospecha que las opciones TCP son posibles, puede leer los 96-99 bits del encabezado TCP, multiplique eso por 4 y este sería el número de bytes toma el encabezado TCP).
El resto del paquete debe ser el texto HTTP. El texto entre el primer y el segundo espacio debe ser el URI. Si es demasiado largo, es posible que deba realizar alguna reconstrucción de TCP, pero la mayoría de los URI son lo suficientemente pequeños como para caber en un paquete.
ACTUALIZACIÓN: En el código se vería así (lo escribí sin probarlo):
int tcp_len, url_length;
uchar *url, *end_url, *final_url, *tcp_payload;
... /* code in http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html */
/* retireve the position of the tcp header */
ip_len = (ih->ver_ihl & 0xf) * 4;
/* retireve the position of the tcp payload */
tcp_len = (((uchar*)ih)[ip_len + 12] >> 4) * 4;
tcpPayload = (uchar*)ih + ip_len + tcp_len;
/* start of url - skip "GET " */
url = tcpPayload + 4;
/* length of url - lookfor space */
end_url = strchr((char*)url, ' ');
url_length = end_url - url;
/* copy the url to a null terminated c string */
final_url = (uchar*)malloc(url_length + 1);
strncpy((char*)final_url, (char*)url, url_length);
final_url[url_length] = '\0';
También puede filtrar sólo el tráfico HTTP mediante la creación y el establecimiento de una BPF. See WinPcap tutorial. Probablemente deberías usar el filtro "tcp and dst port 80"
que solo te daría la solicitud que tu computadora envía al servidor.
Si no le molesta usar C#, puede intentar usar Pcap.Net, lo cual haría mucho más fácil para usted, incluido el análisis de las partes Ethernet, IPv4 y TCP del paquete.
No necesita escribir ningún software para hacer esto. Use un [proxy] (http://www.squid-cache.org/) que tenga [logging] (http://www.squid-cache.org/Doc/config/access_log/). –
Tenga en cuenta que las respuestas proporcionadas le permiten registrar o monitorear las URL, pero ciertamente no secuestrar: "Cambiar la configuración del software sin el conocimiento del usuario para obligar a ese usuario a visitar un determinado sitio web" (wiktionary). Es posible que haya utilizado mal el término o haya querido decir otro. –
Lamento disputarle a Matt, pero el calamar efectivamente "secuestra". Con eso quiero decir que le permite sustituir una url diferente por la que el usuario ingresó (si eso es lo que quiere hacer como programador). La función principal es almacenar cosas en caché, pero puede hacer más que si lo desea. – Hotei