Dicas para o Trabalho #1


Opção 1: Coloque a placa em modo promíscuo com o comando ifconfig antes
de executar o seu programa

Exemplo:

# ifconfig eth0 promisc
# prog
# ifconfig eth0 -promisc

Dessa forma, você habilita o modo promíscuo antes da execução e o desabilita após a execuação


Opção 2: Coloque a placa em modo promíscuo com o comando ifconfig na execução do seu
programa usando a chamada de sistemas  system

Exemplo:

void main ()
{
      .......
      system("ifconfig eth0 promisc");
      // escreva as funções de captura de tráfego necessárias
      system("ifconfig eth0 -promisc");
      exito(0);
}

Dessa forma, você habilita o modo promíscuo no inicio de seu programa, implementa as funções necessárias
e ao sair restaurao modo de operação normal da placa.


Opção 3: Coloque a placa em modo promíscuo de forma elegante no seu programa em C, usando a chamda de sistema ioctl

Exemplo:

#include <sys/ioctl.h>
#include <net/if.h>

// Atenção este é apenas um trecho de programa que deve ser
// utilizado corretamente dentro de um procedimento em C

struct ifreq ifr;

// descobre o indice da interface
strcpy(ifr.ifr_name,"eth0");
if (ioctl(socketDescriptor,SIOGIFINDEX,&ifr) < 0)
      printf("erro no ioctl!");
// Configura a placa para modo promiscuo
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ioctl(socketDescriptor, SIOCGIFFLAGS, &ifr);
ifr.ifr_flags |= IFF_PROMISC;
ioctl(socketDescriptor, SIOCSIFFLAGS, &ifr);

 

Atenção! Após colocar a placa em modo promíscuo e instaciar o socket RAW é necessário
               associar a interface ao socket com a chamada de sistema setsockopt

Exemplo:

// Atenção este é apenas um trecho de programa que deve ser
// utilizado corretamente dentro de um procedimento em C

struct packet_mreq *pkt;

pkt = (struct packet_mreq *) malloc (sizeof(struct packet_mreq));
bzero((struct packet_mreq *)pkt, sizeof(struct packet_mreq));
pkt->mr_ifindex = ifr.ifr_ifindex;
pkt->mr_type = PACKET_MR_PROMISC;
setsockopt(socketDescriptor,SOL_PACKET,PACKET_MR_PROMISC,(char *)&pkt,sizeof(struct packet_mreq));