/***************************************** Exemplo - Socket RAW para envio de frames *****************************************/ #include #include #include #include #include #include #include #include #include //O próximo include é necessário para utilização da estrutura ifreq #include #include #include #include #include unsigned char buff[1500]; int main(int argc,char *argv[]) { int sock, i; struct ifreq ifr; struct sockaddr_ll to; socklen_t len; memset(&ifr, 0, sizeof(ifr)); //O socket pode ser criado utilizado o exemplo abaixo // Se utilizado este socket os pacotes enviados devem ser construidos // a partir do frame ethernet // este tipo de socket pode ser usado tanto para envio quanto para a // captura de pacotes da rede if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) { perror("Erro na criacao do socket"); exit(0); } //A estrutura "to" e utilizada para descrever o enderecamento do destino //Assim esta sendo "setada" com informacoes sovbre tipo de protocolo a ser enviado // e o indice da interface pela qual os pacotes serao enviados to.sll_protocol= htons(ETH_P_ALL); to.sll_ifindex = 2; //Monta o pacote para ser enviado monta_pacote(); // O proximo comando copia para a estrutura que descreve o endereco do // destino o endereco MAC da maquina para quem o pacotes sera enviado. memcpy (to.sll_addr, arp.Mac_dest, 6); len = sizeof(struct sockaddr_ll); if(sendto(sock, (char *) buff, sizeof(buff), 0, (struct sockaddr*) &to, len)<0) perror("sendto maquina B"); } void monta_pacote() { //as struct estao descritas nos seus arquivos .h // por exemplo a ether_header esta no net/ether.h // a struct ip esta descrita no netinet/ip.h // a struct icmp esta descrita no ntinet/ipicmp.h struct ether_header *eth; struct ip *ip; struct icmp *icmp; // coloca o ponteiro do header ethernet apontando para a 1a. posição do buffer // onde inicia o header do ethernet eth = (char *)&buff[0]; //Montagem do pacote Ethernet //Endereco Mac Destino eth.ether_dhost[0] = 0X00; eth.ether_dhost[1] = 0X06; eth.ether_dhost[2] = 0X5B; eth.ether_dhost[3] = 0X28; eth.ether_dhost[4] = 0XAE; eth.ether_dhost[5] = 0X73; //Endereco Mac Origem eth.ether_shost[0] = 0X00; eth.ether_shost[1] = 0X08; eth.ether_shost[2] = 0X74; eth.ether_shost[3] = 0XB5; eth.ether_shost[4] = 0XB5; eth.ether_shost[5] = 0X8E; //Tipo do protocolo 0x800 (IP) eth.ether_type = htons(0X800); //A seguir deve ser montado o pacote IP e ICMP a ser enviado //coloca o ponteiro do header IP apontando para 15a. posicao do buffer, pois //o header ethernet tem 14 bytes ip = (char *)&buff[14]; // de acordo com o pacotes IP construido deve ser criado o header do ICMP }