Using Raw Sockets
Using Raw Sockets
P. Bakowski
raw socket
eth0, wlan0
Ethernet frame
P. Bakowski
P. Bakowski
10
P. Bakowski
11
P. Bakowski
12
13
P. Bakowski
14
P. Bakowski
// source port
// destination port
// udp length
// udp header checksum
16
P. Bakowski
17
P. Bakowski
18
P. Bakowski
19
20
P. Bakowski
21
P. Bakowski
22
P. Bakowski
23
P. Bakowski
24
P. Bakowski
25
My IP packet send
#include "mypackage.h
"mypackage.h""
#define SA "172.19.64.142"
#define DA "172.19.71.255"
#define ETHER_TYPE 0x0800
#define SRC_ETHER_ADDR
"aa:aa:aa:aa:aa:aa"
aa:aa:aa:aa:aa:aa"
#define DST_ETHER_ADDR
"ff:ff:ff:ff:ff:ff"
ff:ff:ff:ff:ff:ff"
main(int c, char **a)
{
unsigned char message[128];
int sd,
sd, ret, ncar=128;
ncar=128; // 20 bytes - IP packet header
unsigned char *eth; unsigned char *ip
*ip;;
unsigned char packet[1000]; unsigned int i=0;
int pn=0;
pn=0; char v=0;
if(c==1)
if(c==1) { printf("Usage:
printf("Usage: mypacetheripsend [eth0, wlan0] packet_number \n"); exit(1);}
pn=
pn= atoi(a[2]);
sd = create_rawsocket(ETH_P_ALL);
create_rawsocket(ETH_P_ALL);
ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
if(ret<0)
if(ret<0) { printf("Can't bind to %s\
%s\n",a[1]); exit(2);}
eth = (unsigned char *) create_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPE);
create_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPE);
memcpy(packet,eth,ETHER_HDR_LEN);
memcpy(packet,eth,ETHER_HDR_LEN);
ip = (unsigned char *)create_iphdr(0x45,0,htons(128),htons(2010),0,128,6,0,inet_addr(SA),inet_addr(DA));
*)create_iphdr(0x45,0,htons(128),htons(2010),0,128,6,0,inet_addr(SA),inet_addr(DA));
memcpy(packet+ETHER_HDR_LEN,ip,
memcpy(packet+ETHER_HDR_LEN,ip, IP_HDR_LEN);
while(i<
while(i<pn)
pn)
{ send_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+ncar);
send_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+ncar);
i++; sleep(1);
}
}
P. Bakowski
26
My IP packet receive
#include "mypackage.h
"mypackage.h""
main(int c, char **a)
{
unsigned char message[128];
int sd,
sd, ret,ncar=128;
ret,ncar=128; // 28 bytes - ARP packet, 20 bytes - IP packet
unsigned char *eth; unsigned char abuf[6];
unsigned char packet[1000]; unsigned int i=0;
int ethtype=0;
pn=0;
=0; char v=0;
ethtype=0; int iptype=0,
iptype=0,pn
if(c==1)
if(c==1) { printf("Usage:
printf("Usage: mypacetheriprecv [eth0, wlan0] packet_number [d,p]\
d,p]\n"); exit(1);}
sd = create_rawsocket(ETH_P_ALL);
create_rawsocket(ETH_P_ALL);
ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
pn=
pn= atoi(a[2]); if(c>3)
if(c>3) v=*a[3];
while(i<
while(i<pn)
pn)
{
recv_rawpacket(sd,packet,ETHER_HDR_LEN+ncar);
recv_rawpacket(sd,packet,ETHER_HDR_LEN+ncar);
ethtype=
ethtype= type_ethhdr(packet);
type_ethhdr(packet);
if(ethtype==1)
if(ethtype==1)
{
iptype=type_iphdr(packet+14);
iptype=type_iphdr(packet+14);
if(iptype==1)
if(iptype==1) printf("\
printf("\n -------- IMCP packet --------\
--------\n");
if(iptype==2)
if(iptype==2) printf("\
printf("\n -------- TCP packet --------\
--------\n");
if(iptype==3)
if(iptype==3) printf("\
printf("\n -------- UDP packet --------\
--------\n");
if(v=='p')
if(v=='p') print_iphdr(packet+14);
if(v=='d')
if(v=='d') hex_dump(packet+14,64);
}
i++;
}
}
P. Bakowski
27
P. Bakowski
28
P. Bakowski
29
P. Bakowski
30
while(i<
while(i<pn)
pn)
{
recv_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+UDP_HDR_LEN+ncar
);
recv_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+UDP_HDR_LEN+ncar);
ethtype=
ethtype= type_ethhdr(packet);
type_ethhdr(packet);
if(ethtype==1)
if(ethtype==1)
{
iptype=
iptype=type_iphdr(packet+ETHER_HDR_LEN);
type_iphdr(packet+ETHER_HDR_LEN);
if(iptype==17)
if(iptype==17)
{
printf("\
printf("\n---- UDP packet ----\
----\n");
if(v=='p')
if(v=='p')
{
print_iphdr(packet+ETHER_HDR_LEN);
print_iphdr(packet+ETHER_HDR_LEN);
print_udphdr(packet+ETHER_HDR_LEN+IP_HDR_LEN);
print_udphdr(packet+ETHER_HDR_LEN+IP_HDR_LEN);
}
if(v=='d')
if(v=='d') hex_dump(packet,64);
}
}
i++;
}
}
P. Bakowski
31
P. Bakowski
32
P. Bakowski
33
P. Bakowski
34
while(i<
while(i<pn)
pn)
{
recv_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+TCP_HDR_LEN+ncar
);
recv_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+TCP_HDR_LEN+ncar);
ethtype=
ethtype= type_ethhdr(packet);
type_ethhdr(packet);
if(ethtype==1)
if(ethtype==1)
{
iptype=
iptype=type_iphdr(packet+ETHER_HDR_LEN);
type_iphdr(packet+ETHER_HDR_LEN);
if(iptype==6)
if(iptype==6)
{
printf("\
printf("\n---- TCP packet ----\
----\n");
if(v=='p')
if(v=='p')
{
print_iphdr(packet+ETHER_HDR_LEN);
print_iphdr(packet+ETHER_HDR_LEN);
print_tcphdr(packet+ETHER_HDR_LEN+IP_HDR_LEN);
print_tcphdr(packet+ETHER_HDR_LEN+IP_HDR_LEN);
}
if(v=='d')
if(v=='d') hex_dump(packet,64);
}
} i++;
}
}
P. Bakowski
35
Summary
Creating and Binding raw sockets
Creating
Creating
Creating
Creating
and
and
and
and
Displaying
Displaying
Displaying
Displaying
Sending
Sending
Sending
Sending
and
and
and
and
Receiving
Receiving
Receiving
Receiving
P. Bakowski
Ethernet frames
IP packets
UDP packets
TCP packets
Ethernet frames
IP packets
UDP packets
TCP packets
36