Professional Documents
Culture Documents
nsontt@yahoo.com.br
30 de Abril de 2006.
Abstract
Most Unix systems provide a set of system calls that allow applications to interact with
the network directly. These primitives are useful for example in packet capture
applications, which need to grab the data flowing through the network without any
further processing from the kernel. WinPcap is a newly proposed architecture that adds
these functionalities to Win32 operating systems. WinPcap includes a set of innovative
features (such as packet monitoring and packet injection) that are not available in
previous systems. This paper presents the details of the architecture and it shows its
excellent performance.
Resumo
A maioria dos sistemas de Unix fornecem um conjunto de chamadas ao sistema que
permitem que as aplicações interajam com a rede diretamente. Estes primitivos são
úteis para o exemplo nas aplicações da captura de pacotes, que necessitam capturar os
dados que correm através da rede sem processar adicionalmente o kernel.. WinPcap é
uma arquitetura recentemente que oferece estas funcionalidades aos sistemas
operacionais Win32 .WinPcap inclui um conjunto de características inovadoras (tais
como a monitoração do pacote e a injeção do pacote) que não estão disponíveis em
sistemas precedentes. Este papel apresenta os detalhes da arquitetura e mostra seu
desempenho excelente.
2
Lista de Siglas
3
Sumário
1 WinPcap .................................................................................................05
3 Exemplos ................................................................................................09
3.1. SMP..........................................................................................................................09
3.2.Kdump.......................................................................................................................11
4 Ferramentas ...........................................................................................13
4.1. Ethereal.....................................................................................................................13
4.2. IM Sniffer.................................................................................................................13
5 Referências .............................................................................................14
4
1. WinPcap
WinPcap é uma biblioteca de código aberto para captura de pacotes e análise de rede
para a plataforma Win32.
WinPcap pode ser usada por diferentes tipos de aplicação de análise de rede,
pesquisando falhas na segurança e monitorando-a.
b) monitores de rede;
c) loggers de tráfego;
d) geradores de tráfego;
g) “varredores” da rede;
h) ferramentas de segurança.
5
São duas as bibliotecas responsáveis pelo filtro de pacotes, sendo a de nível mais
baixo (packet.dll) responsável pela ligação dinâmica, ou seja, pode ser usada para
acessar diretamente as funções do driver com uma programação de interface
independente do sistema operacional Windows e uma de alto nível independente do
adaptador de rede e do sistema operacional (wpcap.dll).
2. Arquitetura do WinPcap
Desde que o BPF foi provado sendo uma arquitetura poderosa e estável, a estrutura
básica de WinPcap (mostrado em figura 3.1) retém os módulos os mais importantes do
BPF: uma máquina filtrando, dois buffers (kernel e usuário) e um par de bibliotecas no
nível de usuário. Entretanto, WinPcap tem algumas diferenças substanciais na estrutura
e no comportamento da pilha da captação, e pode ser visto como a evolução do BPF.
O buffer inteiro do kernell é copiado geralmente por meio de um único read(), assim
diminuindo o número de chamadas do sistema e conseqüentemente o número de
interrupções de contexto entre o usuário e a modalidade do kernel. Desde que um
interruptor de contexto requeira conservar o estado da tarefa (o descritor e a tarefa do
processador central indicam o segmento, os bytes de aproximadamente algumas
centenas), transferências grandes diminuem as despesas gerais do processo. Entretanto
um buffer demasiado grande do usuário não traz nenhuma vantagem porque as despesas
gerais do interruptor de contexto se tornam insignificantes quando a memória alocada
aumentar linearmente.
6
O buffer do kernel do WinPcap é maior (1MB) do que o do BPF. Um buffer
pequeno penaliza a captura de processo especialmente nos casos em que a aplicação não
pode ler tão rapidamente quanto as captações do driver em um intervalo limitado de
tempo. Tal situação é comum quando os dados têm que ser transferidos ao disco ou
quando a rede tem o tráfego de rajadas. E vice-versa, o buffer de usuário é menor e seu
valor default é de 256KB. Ambos kernel e buffer de usuário podem ser mudado em
tempo de execução. O tamanho do buffer de usuário é muito importante porque
determina a quantidade máxima de dados que podem ser copiados do espaço do kernel
ao espaço do usuário dentro de uma única chamada ao sistema. No outro handle, nós
observamos que também a quantidade mínima de dados que podem ser copiada em uma
única chamada é extremamente importante. Na presença de um valor grande para esta
variável, o kernell espera a chegada de diversos pacotes antes de copiar os dados ao
usuário. Isto garante um número baixo de chamadas ao sistema, baixo o uso do
processador, que é um ajuste bom para aplicações como sniffers. No outro handle, um
valor pequeno significa que o kernel copa os pacotes assim que a aplicação estiver
pronta para os receber. Isto é excelente para aplicações de tempo real (como, para o
exemplo, um redirecionador ARP) que necessita de melhor segurança do kernel. A
maioria dos drivers de captura existentes tem um comportamento de estática que
privilegia um dos dois aspectos. No outro handle, NPF é completamente configurável e
permite que os usuários escolham entre a melhor eficiência e a melhor segurança (ou
algum comportamento intermediário). WinPcap inclui um par de chamadas ao sistema
que podem ser usadas para ajustar ambos os intervalos de parada depois que a leitura
expirar e a quantidade mínima de dados que podem ser transferidos à aplicação. Os
pacotes são copiados quando a quantidade mínima de dados está disponível ou o
intervalo de parada lido expirou. Por default, o intervalo de parada é 1 segundo e a
quantidade mínima de dados é 16K. Esta potencialidade é chamada frequentemente
"delayed write”.
Na memória geral as cópias têm que ser mantidas o mais baixo por causa de suas
despesas gerais. WinPcap tem as mesmas despesas gerais da cópia do libpcap/BPF
original e os pacotes são copiados duas vezes (do driver da rede ao kernel, então ao
espaço do usuário). Além disso, o filtramento é executado quando o pacote está ainda
na memória do driver de rede, assim evitando toda a cópia de pacotes não conformantes
em uma maneira similar como a função do bpf_tap() do DEB .
7
Figura 2.1 – Arquitetura do Winpcap
8
3. Exemplos
Abaixo exemplos de dois pequenos programas que utilizam as funcionalidades da
biblioteca WinPcap:
3.1 . SMP
#include <stdlib.h>
#include <stdio.h>
#include <pcap.h>
char a[11];
if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}
9
scanf("%d", &inum);
old.ts.tv_sec=0;
old.ts.tv_usec=0;
if(res == 0)
continue;
old=*header;
if(res == -1){
printf("Error reading the packets: %s\n", pcap_geterr(fp));
return -1;
}
scanf("%s",a);
return 0;
}
10
3.2 . Kdump
#include <stdlib.h>
#include <stdio.h>
#include <pcap.h>
#error At the moment the kernel dump feature is not supported in the driver
printf("kdump: saves the network traffic to file using WinPcap kernel-level dump faeature.\n");
printf("\t Usage: %s [adapter] | dump_file_name max_size max_packs\n", argv[0]);
printf("\t Where: max_size is the maximum size that the dump file will reach (0 means no
limit)\n");
printf("\t Where: max_packs is the maximum number of packets that will be saved (0 means no
limit)\n\n");
/* The user didn't provide a packet source: Retrieve the device list */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}
if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}
11
{
printf("\nInterface number out of range.\n");
/* Free the device list */
return -1;
}
/* Wait until the dump finishes, i.e. when max_size or max_packs is reached*/
pcap_live_dump_ended(fp, TRUE);
12
4. Ferramentas
4.1. Ethereal
4.2. IM Sniffer
13
5. Referências
[1] Fulvio Risso, Loris Degioanni, An Architecture for High Performance Network
Analysis, Proceedings of the 6th IEEE Symposium on Computers and Communications
(ISCC 2001), Hammamet, Tunisia, July 2001.
[2] Loris Degioanni, Development of an Architecture for Packet Capture and Network
Traffic Analysis, Graduation Thesis, Politecnico Di Torino (Turin, Italy, Mar. 2000).
[3] TANEMBAUM, A.S. Redes de Computadores. 4 edição. Editora
Campus.2003.
[4] WinPcap. Disponível por www em http://www.winpcap.com
(28/04/06).
14