Hi all,
I want to send Ethernet Frames over a RAW sockets
(socket(PF_PACKET,...........)), but it doesn't work. I send the frame
to a web server on another host, it arrives but the server ignores it.
That's what i've done so far...
payload = malloc(sizeof(char)*51);
memset((char*)payload, '\0', sizeof(char)*51);
strncpy(payload, "GET /~marco/www/private_resource.html
HTTP/1.1\r\n\r\n",50);
char packet1[ sizeof(struct ethhdr) + sizeof(struct iphdr) +
sizeof(struct tcphdr) + strlen(payload)];
strcpy( (packet1 + sizeof(struct ethhdr) + sizeof(struct iphdr) +
sizeof(struct tcphdr)), payload);
unsigned char src_mac[6]; /*our MAC address*/
unsigned char dst_mac[6]={0xXX,0xXX,0xXX,0xXX,0xXX,0xXX};
/*destination 192.168.0.4
MAC address*/
struct ifreq ifr;
struct sockaddr_ll socket_address;
int ifindex = 0; /*Ethernet Interface index*/
int i;
int length; /*length of received packet*/
int sent, s, r;
struct sockaddr_ll sa;
/*open socket*/
s = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
if (s == -1) {
perror("socket():");
exit(1);
}
printf("Successfully opened socket: %i\n", s);
/*retrieve ethernet interface index*/
strncpy(ifr.ifr_name, DEVICE, IFNAMSIZ);
if (ioctl(s, SIOCGIFINDEX, &ifr) == -1) {
perror("SIOCGIFINDEX");
exit(1);
}
ifindex = ifr.ifr_ifindex;
printf("Successfully got interface index: %i\n", ifindex);
/*retrieve corresponding MAC*/
if (ioctl(s, SIOCGIFHWADDR, &ifr) == -1) {
perror("SIOCGIFINDEX");
exit(1);
}
for (i = 0; i < 6; i++) {
src_mac[i] = ifr.ifr_hwaddr.sa_data[i];
}
printf("Successfully got our MAC address:
%02X:%02X:%02X:%02X:%02X:%02X\n",
src_mac[0],src_mac[1],src_mac[2],src_mac[3],src_mac[4],src_mac[5]);
eth = (struct ethhdr *)packet1;
eth_gen((char*)eth, dst_mac, src_mac);
/*prepare sockaddr_ll*/
socket_address.sll_family = PF_PACKET;
socket_address.sll_protocol = htons(ETH_P_IP);
socket_address.sll_ifindex = ifindex;
socket_address.sll_hatype = ARPHRD_ETHER;
socket_address.sll_pkttype = PACKET_OTHERHOST;
socket_address.sll_halen = ETH_ALEN;
memcpy(socket_address.sll_addr, src_mac, ETH_ALEN);
r = bind(s,(struct sockaddr *) &socket_address,
sizeof(socket_address));
if ( r < 0 )
{
perror("bind");
close(s);
return -1;
}
printf(" strlen(payload)=%d\n", strlen(payload));
printf(" sizeof(packet1)= %d\n", sizeof(packet1));
ip = (struct iphdr *)(packet1 + sizeof(struct ethhdr));
frag_off = 0x4000;
ip_gen((char*)ip,IPPROTO_TCP,saddr,daddr,sizeof(pa cket1),id,
frag_off);
tcp = (struct tcphdr *)(packet1 + sizeof(struct ethhdr) +
sizeof(struct iphdr));
fin=0;
syn=0;
ack=1;
psh=0;
urg=0;
tcp_gen((char *)tcp,sport,dport,seq,ack_seq, fin, syn, psh, ack, urg
);
tcp->check = trans_check(IPPROTO_TCP,(char *)tcp, sizeof(struct
tcphdr) + strlen(payload), saddr, daddr);
sent = sendto(s,&packet1,sizeof(packet1), 0x0,(struct sockaddr
*)&socket_address, sizeof(socket_address));
if (sent != sizeof(packet1)){
perror("sendto");
exit(1);
}
free(payload);
Can you help me, please?
Thanks!