Upload
nguyenhuong
View
222
Download
1
Embed Size (px)
Citation preview
Using Raw SocketsUsing Raw Socketswith Internet Protocols
P. BakowskiP. Bakowski
[email protected]@ieee.org
P. Bakowski 2
WhatWhat is is RawRaw Socket ?Socket ?
Most socket Most socket application programming interfacesapplication programming interfaces
(APIs), especially those based on (APIs), especially those based on Berkeley socketsBerkeley sockets, ,
support raw sockets.support raw sockets.
Usually raw sockets receive packets inclusive of the Usually raw sockets receive packets inclusive of the
header, as opposed to standard sockets which header, as opposed to standard sockets which
receive just the packet receive just the packet payloadpayload without headers. without headers.
When transmitting packets, the automatic addition When transmitting packets, the automatic addition
of a header may be a configurable option of the of a header may be a configurable option of the
socket.socket.
P. Bakowski 3
WhatWhat is is RawRaw Socket ?Socket ?
raw socketraw socket
Ethernet frame
eth0, wlan0eth0, wlan0
P. Bakowski 4
CreatingCreating rawraw socketsocket
intint create_rawsocket(intcreate_rawsocket(int protocol_to_sniffprotocol_to_sniff) )
{ {
intint rawsockrawsock; ;
if((rawsockif((rawsock = = socket(PF_PACKETsocket(PF_PACKET, SOCK_RAW, , SOCK_RAW,
htons(protocol_to_sniffhtons(protocol_to_sniff)))== )))== --1) 1)
{ {
perror("Errorperror("Error creating raw socket: "); creating raw socket: ");
exit(exit(--1); 1);
} }
return return rawsockrawsock; ;
}}
P. Bakowski 5
BindingBinding rawraw socketsocket
intint bind_rawsocket(charbind_rawsocket(char *device, *device, intint rawsockrawsock, , intint protocol) protocol)
{ {
structstruct sockaddr_llsockaddr_ll sllsll; ;
structstruct ifreqifreq ifrifr; ;
bzero(&sllbzero(&sll, , sizeof(structsizeof(struct sockaddr_llsockaddr_ll)); ));
bzero(&ifrbzero(&ifr, , sizeof(structsizeof(struct ifreqifreq)); ));
/* First Get the Interface Index */ /* First Get the Interface Index */
strncpy((charstrncpy((char *)*)ifr.ifr_nameifr.ifr_name, device, IFNAMSIZ); , device, IFNAMSIZ);
if((ioctl(rawsockif((ioctl(rawsock, , SIOCGIFINDEXSIOCGIFINDEX, &, &ifrifr)) == )) == --1) 1)
{ {
printf("Errorprintf("Error getting Interface index !getting Interface index !\\n"); exit(n"); exit(--1); 1);
} }
P. Bakowski 6
BindingBinding rawraw socketsocket
……
/* Bind our raw socket to this interface */ /* Bind our raw socket to this interface */
sll.sll_familysll.sll_family = AF_PACKET; = AF_PACKET;
sll.sll_ifindexsll.sll_ifindex = = ifr.ifr_ifindexifr.ifr_ifindex; ;
sll.sll_protocolsll.sll_protocol = = htons(protocolhtons(protocol); );
if((bind(rawsockif((bind(rawsock, (, (structstruct sockaddrsockaddr *)&*)&sllsll, , sizeof(sllsizeof(sll)))== )))== --1) 1)
{ {
perror("Errorperror("Error binding raw socket to interfacebinding raw socket to interface\\n"); n");
exit(exit(--1); 1);
} }
return 1; return 1;
}}
P. Bakowski 7
SendSend rawraw packetpacket on lineon line
intint send_rawpacket(intsend_rawpacket(int rawsockrawsock, unsigned char *, unsigned char *pktpkt, ,
intint pkt_lenpkt_len) )
{ {
intint sent= 0; sent= 0;
if((sentif((sent==writewrite(rawsock(rawsock, , pktpkt, , pkt_lenpkt_len)) != )) != pkt_lenpkt_len) )
{ {
printf("Couldprintf("Could only send %d bytes of packet of length only send %d bytes of packet of length
%%dd\\nn", sent, ", sent, pkt_lenpkt_len); );
return 0; return 0;
} }
return 1; return 1;
}}
P. Bakowski 8
ReceiveReceive rawraw packetpacket from linefrom line
intint recv_rawpacket(intrecv_rawpacket(int rawsockrawsock, unsigned char *, unsigned char *pktpkt, ,
intint pkt_lenpkt_len) )
{ {
intint recvrecv= 0; = 0;
recvrecv = = readread(rawsock(rawsock, , pktpkt, , pkt_lenpkt_len); );
return return recvrecv; ;
}}
P. Bakowski 9
CreateCreate Ethernet Ethernet packetpacket headerheader
unsigned char *unsigned char *create_eth(charcreate_eth(char **src_macsrc_mac, char *, char *dst_macdst_mac, ,
unsigned short protocol) unsigned short protocol)
{ {
unsigned char *unsigned char *ethbufethbuf; unsigned char abuf[6]; ; unsigned char abuf[6];
unsigned padding; unsigned short type=unsigned padding; unsigned short type=htonshtons(protocol(protocol); );
ethbufethbuf = (unsigned char *) malloc(14); = (unsigned char *) malloc(14);
parse_mac(abuf,dst_macparse_mac(abuf,dst_mac); // from ); // from ff:ff:ff:ff:ff:ffff:ff:ff:ff:ff:ff formform
memcpy(ethbuf,abuf,6); memcpy(ethbuf,abuf,6);
parse_mac(abuf,src_macparse_mac(abuf,src_mac); );
memcpy(ethbuf+6,abuf,6); memcpy(ethbuf+6,abuf,6);
memcpy(ethbuf+12,(unsigned char *)&type,2); memcpy(ethbuf+12,(unsigned char *)&type,2);
return return ethbufethbuf; ;
}}
P. Bakowski 10
PrintPrint Ethernet Ethernet packetpacket headerheader
intint print_ethhdr(unsignedprint_ethhdr(unsigned char *char *eth_headstreth_headstr) )
{ unsigned char *{ unsigned char *ethheadethhead; ; intint j; j;
ethheadethhead==eth_headstreth_headstr; ;
printf("Ethernetprintf("Ethernet headerheader\\ndestinationndestination address: "); address: ");
for(jfor(j=0;j<6;j++) printf("%02x:",*(=0;j<6;j++) printf("%02x:",*(ethhead+jethhead+j)); ));
printfprintf(" source address: "); (" source address: ");
for(jfor(j=6;j<12;j++) printf("%02x:",*(=6;j<12;j++) printf("%02x:",*(ethhead+jethhead+j)); ));
printfprintf(" Ether protocol number: "); (" Ether protocol number: ");
for(jfor(j=12;j<14;j++) printf("%02x",*(=12;j<14;j++) printf("%02x",*(ethhead+jethhead+j)); ));
printf("printf("\\nendnend of Ethernet headerof Ethernet header\\n"); n");
if (*(ethhead+12)==8 && *(ethhead+13)==0) return 1; // IP if (*(ethhead+12)==8 && *(ethhead+13)==0) return 1; // IP
if (*(ethhead+12)==8 && *(ethhead+13)==6) return 2; // ARP if (*(ethhead+12)==8 && *(ethhead+13)==6) return 2; // ARP
return 0; return 0;
}}
P. Bakowski 11
CreateCreate IP IP packetpacket headerheader
P. Bakowski 12
CreateCreate IP IP packetpacket headerheader
unsigned char *unsigned char *create_iphdrcreate_iphdr( (
unsigned char unsigned char verlenverlen, ,
unsigned char unsigned char tostos, ,
unsigned short unsigned short totlentotlen, ,
unsigned short id, unsigned short id,
unsigned short unsigned short foffsetfoffset, ,
unsigned char unsigned char ttlttl, ,
unsigned char proto, unsigned char proto,
unsigned short checksum, unsigned short checksum,
unsigned unsigned intint sasa, ,
unsigned unsigned intint dada))
P. Bakowski 13
CreateCreate IP IP packetpacket headerheader
structstruct ip_hdrip_hdr **ip_headerip_header; ;
/*/*
unsigned char unsigned char ip_version_and_header_lengthip_version_and_header_length; ;
unsigned char unsigned char ip_tosip_tos; // type of service ; // type of service
unsigned short unsigned short ip_lenip_len; // total ; // total lengthether_dest_addrlengthether_dest_addr
unsigned short unsigned short ip_idip_id; // identification number ; // identification number
unsigned short unsigned short ip_frag_offsetip_frag_offset; // fragment offset and flags ; // fragment offset and flags
unsigned char unsigned char ip_ttlip_ttl; // time to live ; // time to live
unsigned char unsigned char ip_typeip_type; // protocol type ; // protocol type
unsigned short unsigned short ip_checksumip_checksum; // checksum ; // checksum
unsigned unsigned intint ip_src_addrip_src_addr; // source IP address; // source IP address
unsigned unsigned intint ip_dest_addrip_dest_addr; // destination IP address ; // destination IP address
*/*/
P. Bakowski 14
CreateCreate IP IP packetpacket headerheader
……
ip_headerip_header = (= (structstruct ip_hdrip_hdr *)*)malloc(sizeof(structmalloc(sizeof(struct ip_hdrip_hdr)); ));
ip_headerip_header-->>ip_version_and_header_lengthip_version_and_header_length = = verlenverlen; ;
ip_headerip_header-->>ip_tosip_tos = = tostos; ; ip_headerip_header-->>ip_lenip_len = = totlentotlen; ;
ip_headerip_header-->>ip_idip_id = = id;ip_headerid;ip_header-->>ip_frag_offsetip_frag_offset==foffsetfoffset; ;
ip_headerip_header-->>ip_ttlip_ttl = = ttlttl; ; ip_headerip_header-->>ip_typeip_type = proto; = proto;
ip_headerip_header-->>ip_checksumip_checksum = checksum; = checksum;
ip_headerip_header-->>ip_src_addrip_src_addr==sa;ip_headersa;ip_header-->>ip_dest_addrip_dest_addr==dada; ;
return ((unsigned char *)return ((unsigned char *)ip_headerip_header); );
}}
P. Bakowski 15
PrintPrint IP IP packetpacket headerheader
void void print_iphdr(unsignedprint_iphdr(unsigned char *char *ip_headerstrip_headerstr) )
{ {
structstruct ip_hdrip_hdr **ip_headerip_header; ;
unsigned char sa[4]; unsigned char da[4]; unsigned char sa[4]; unsigned char da[4];
ip_headerip_header = (= (structstruct ip_hdrip_hdr *)*)malloc(sizeof(structmalloc(sizeof(struct ip_hdrip_hdr)); ));
memcpy(ip_header,ip_headerstr,sizeof(structmemcpy(ip_header,ip_headerstr,sizeof(struct ip_hdrip_hdr)); ));
memcpy(sa,(unsignedmemcpy(sa,(unsigned char *)&char *)&ip_headerip_header-->ip_src_addr,4); >ip_src_addr,4);
memcpy(da,(unsignedmemcpy(da,(unsigned char *)&char *)&ip_headerip_header-->ip_dest_addr,4); >ip_dest_addr,4);
printf("Lengthprintf("Length of IP packet: %of IP packet: %dd\\n",ntohs(ip_headern",ntohs(ip_header-->>ip_lenip_len)); ));
printf("Identifierprintf("Identifier of IP packet: %of IP packet: %dd\\n",ntohs(ip_headern",ntohs(ip_header-->>ip_idip_id)); ));
printf("Timeprintf("Time To Live: %To Live: %dd\\n",ip_headern",ip_header-->>ip_ttlip_ttl); );
printf("Protocolprintf("Protocol type: %type: %dd\\n",ip_headern",ip_header-->>ip_typeip_type); );
printf("IPprintf("IP header checksum: %header checksum: %dd\\n",ip_headern",ip_header-->>ip_checksumip_checksum); );
printfprintf("Sender IP address: %u.%u.%u.%("Sender IP address: %u.%u.%u.%uu\\nn", sa[0],sa[1],sa[2],sa[3]); ", sa[0],sa[1],sa[2],sa[3]);
printf("Destprintf("Dest. IP . IP address:%u.%u.%u.%uaddress:%u.%u.%u.%u\\nn", da[0],da[1],da[2],da[3]); ", da[0],da[1],da[2],da[3]);
}}
P. Bakowski 16
CreateCreate UDP UDP packetpacket headerheader
unsigned short unsigned short uh_sportuh_sport;; // source port // source port
unsigned short unsigned short uh_dportuh_dport;; // destination port // destination port
unsigned short unsigned short uh_ulenuh_ulen;; // // udpudp length length
unsigned short unsigned short uh_sumuh_sum;; // // udpudp header checksumheader checksum
P. Bakowski 17
CreateCreate UDP UDP packetpacket headerheader
unsigned char *unsigned char *create_udphdrcreate_udphdr( (
unsigned short sp, unsigned short sp,
unsigned short unsigned short dpdp, ,
unsigned short unsigned short lenlen, ,
unsigned short checksum) unsigned short checksum)
{ {
structstruct udp_hdrudp_hdr **udp_headerudp_header; ;
udp_headerudp_header = (= (structstruct udp_hdrudp_hdr *)*)malloc(sizeof(structmalloc(sizeof(struct udp_hdrudp_hdr)); ));
udp_headerudp_header-->>uh_sportuh_sport = sp; = sp; udp_headerudp_header-->>uh_dportuh_dport = = dpdp; ;
udp_headerudp_header-->>uh_ulenuh_ulen = = lenlen; ; udp_headerudp_header-->>uh_sumuh_sum = checksum; = checksum;
return ((unsigned char *)return ((unsigned char *)udp_headerudp_header); );
}}
P. Bakowski 18
PrintPrint UDP UDP packetpacket headerheader
void void print_udphdr(unsignedprint_udphdr(unsigned char *char *udp_headerstrudp_headerstr) )
{ {
structstruct udp_hdrudp_hdr **udp_headerudp_header;;
udp_headerudp_header = (= (structstruct udp_hdrudp_hdr *)*)malloc(sizeof(structmalloc(sizeof(struct udp_hdrudp_hdr)); ));
memcpy(udp_header,udp_headerstr,sizeof(structmemcpy(udp_header,udp_headerstr,sizeof(struct udp_hdrudp_hdr)); ));
printf("Sourceprintf("Source UDP port: %UDP port: %dd\\n",ntohs(udp_headern",ntohs(udp_header-->>uh_sportuh_sport)); ));
printf("Destinationprintf("Destination UDP port: %UDP port: %dd\\n",ntohs(udp_headern",ntohs(udp_header-->>uh_dportuh_dport)); ));
printf("UDPprintf("UDP packet length: %packet length: %dd\\n",ntohs(udp_headern",ntohs(udp_header-->>uh_ulenuh_ulen)); ));
printf("UDPprintf("UDP header checksum: %header checksum: %dd\\n",ntohs(udp_headern",ntohs(udp_header-->>uh_sumuh_sum)); ));
}}
P. Bakowski 19
CreateCreate TCP TCP packetpacket headerheader
P. Bakowski 20
CreateCreate TCP TCP packetpacket headerheaderunsigned short unsigned short tcp_src_porttcp_src_port; // source TCP port ; // source TCP port
unsigned short unsigned short tcp_dest_porttcp_dest_port; // destination TCP port ; // destination TCP port
unsigned unsigned intint tcp_seqtcp_seq; // TCP sequence number ; // TCP sequence number
unsigned unsigned intint tcp_acktcp_ack; // TCP acknowledgement number ; // TCP acknowledgement number
unsigned char unsigned char resoffresoff; // 4; // 4--bits + TCP offset bits + TCP offset
unsigned char unsigned char tcp_flagstcp_flags; // TCP flags ; // TCP flags
#define TCP_FIN 0x01 #define TCP_FIN 0x01
#define TCP_SYN 0x02 #define TCP_SYN 0x02
#define TCP_RST 0x04 #define TCP_RST 0x04
#define TCP_PUSH 0x08 #define TCP_PUSH 0x08
#define TCP_ACK 0x10 #define TCP_ACK 0x10
#define TCP_URG 0x20 #define TCP_URG 0x20
unsigned short unsigned short tcp_windowtcp_window; // TCP window size ; // TCP window size
unsigned short unsigned short tcp_checksumtcp_checksum; // TCP checksum ; // TCP checksum
unsigned short unsigned short tcp_urgenttcp_urgent; // TCP urgent pointer ; // TCP urgent pointer
P. Bakowski 21
CreateCreate TCP TCP packetpacket headerheader
unsigned char *unsigned char *create_tcphdrcreate_tcphdr((
unsigned short sp, unsigned short sp,
unsigned short unsigned short dpdp, ,
unsigned unsigned intint seqseq, ,
unsigned unsigned intint ackack, ,
unsigned char unsigned char resoffresoff, ,
unsigned char flags, unsigned char flags,
unsigned short window, unsigned short window,
unsigned short checksum, unsigned short checksum,
unsigned short unsigned short urgpurgp))
P. Bakowski 22
CreateCreate TCP TCP packetpacket headerheader
……
tcp_headertcp_header = (= (structstruct tcp_hdrtcp_hdr *)*)malloc(sizeof(structmalloc(sizeof(struct tcp_hdrtcp_hdr)); ));
tcp_headertcp_header-->>tcp_src_porttcp_src_port = = sp;tcp_headersp;tcp_header-->>tcp_dest_porttcp_dest_port = = dpdp; ;
tcp_headertcp_header-->>tcp_seqtcp_seq = = seq;tcp_headerseq;tcp_header-->>tcp_acktcp_ack = = ackack; ;
tcp_headertcp_header-->>resoffresoff = = resoffresoff; ; tcp_headertcp_header-->>tcp_flagstcp_flags = flags; = flags;
tcp_headertcp_header-->>tcp_windowtcp_window = window; = window;
tcp_headertcp_header-->>tcp_checksumtcp_checksum = checksum; = checksum;
tcp_headertcp_header-->>tcp_urgenttcp_urgent = = urgpurgp; ;
return ((unsigned char *)return ((unsigned char *)tcp_headertcp_header); );
}}
P. Bakowski 23
PrintPrint TCP TCP packetpacket headerheader
void void print_tcphdr(unsignedprint_tcphdr(unsigned char *char *tcp_headerstrtcp_headerstr) )
{ { structstruct tcp_hdrtcp_hdr **tcp_headertcp_header; ;
tcp_headertcp_header = (= (structstruct tcp_hdrtcp_hdr *)*)malloc(sizeof(structmalloc(sizeof(struct tcp_hdrtcp_hdr)); ));
memcpy(tcp_header,tcp_headerstr,sizeof(structmemcpy(tcp_header,tcp_headerstr,sizeof(struct tcp_hdrtcp_hdr)); ));
printfprintf("Source TCP port: %u("Source TCP port: %u\\n",n",ntohsntohs((tcp_headertcp_header-->>tcp_src_porttcp_src_port)); ));
printfprintf("Destination TCP port: %u("Destination TCP port: %u\\n",n",ntohsntohs((tcp_headertcp_header-->>tcp_dest_porttcp_dest_port)); ));
printf("TCPprintf("TCP sequence number: %sequence number: %uu\\n",ntohl(tcp_headern",ntohl(tcp_header-->>tcp_seqtcp_seq)); ));
printf("TCPprintf("TCP acknowledge number: %acknowledge number: %uu\\n",ntohl(tcp_headern",ntohl(tcp_header-->>tcp_acktcp_ack)); ));
printf("TCPprintf("TCP flags: %2.2xflags: %2.2x\\n",tcp_headern",tcp_header-->>tcp_flagstcp_flags); );
if(tcp_headerif(tcp_header-->>tcp_flagstcp_flags & TCP_FIN) & TCP_FIN) printf("FINprintf("FIN "); ");
if(tcp_headerif(tcp_header-->>tcp_flagstcp_flags & TCP_SYN) & TCP_SYN) printf("SYNprintf("SYN "); ");
if(tcp_headerif(tcp_header-->>tcp_flagstcp_flags & TCP_RST) & TCP_RST) printf("RSTprintf("RST "); ");
if(tcp_headerif(tcp_header-->>tcp_flagstcp_flags & TCP_PUSH) & TCP_PUSH) printf("PUSHprintf("PUSH "); ");
if(tcp_headerif(tcp_header-->>tcp_flagstcp_flags & 0x10) & 0x10) printf("ACKprintf("ACK "); ");
if(tcp_headerif(tcp_header-->>tcp_flagstcp_flags & TCP_URG) & TCP_URG) printf("URGprintf("URG "); "); printf("printf("\\nn"); ");
printf("TCPprintf("TCP window: %window: %uu\\n",ntohs(tcp_headern",ntohs(tcp_header-->>tcp_windowtcp_window)); ));
printf("TCPprintf("TCP checksum: %checksum: %uu\\n",ntohs(tcp_headern",ntohs(tcp_header-->>tcp_checksumtcp_checksum)); })); }
P. Bakowski 24
MyMy Ethernet Ethernet packetpacket sendsend#include "#include "mypackage.hmypackage.h" "
#define SRC_ETHER_ADDR#define SRC_ETHER_ADDR ""aa:aa:aa:aa:aa:aaaa:aa:aa:aa:aa:aa" "
#define DST_ETHER_ADDR#define DST_ETHER_ADDR ""ff:ff:ff:ff:ff:ffff:ff:ff:ff:ff:ff" "
#define ETHER_TYPE 0x8000 #define ETHER_TYPE 0x8000
main(intmain(int c, char **a) c, char **a)
{ {
unsigned char message[128]; unsigned char message[128];
intint sdsd, , ret,fn,ncar,iret,fn,ncar,i=0; =0;
unsigned char *eth; unsigned char *eth;
unsigned char abuf[6]; unsigned char abuf[6];
unsigned char packet[1000]; unsigned char packet[1000];
unsigned short type=unsigned short type=htons(ETHER_TYPEhtons(ETHER_TYPE); );
if(cif(c==1) { ==1) { printf("Usageprintf("Usage: : mypacethersendmypacethersend [eth0, wlan0] [eth0, wlan0] frame_numberframe_number\\nn"); exit(1);} "); exit(1);}
fn=atoi(a[2]); fn=atoi(a[2]);
printf("Giveprintf("Give the data message to send in the frame:the data message to send in the frame:\\n"); n");
ncarncar = read(0,message,128); = read(0,message,128);
sdsd = = create_rawsocket(ETH_P_ALLcreate_rawsocket(ETH_P_ALL); );
ret= bind_rawsocket(a[1],sd,ETH_P_ALL); ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
eth = (unsigned char *) eth = (unsigned char *) create_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPEcreate_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPE); );
memcpy(packet,eth,ETHER_HDR_LENmemcpy(packet,eth,ETHER_HDR_LEN); );
memcpy(packet+ETHER_HDR_LEN,message,ncarmemcpy(packet+ETHER_HDR_LEN,message,ncar); );
while(iwhile(i<fn) <fn)
{ {
send_rawpacket(sd,packet,ETHER_HDR_LEN+ncarsend_rawpacket(sd,packet,ETHER_HDR_LEN+ncar); );
sleep(1); i++; sleep(1); i++;
} }
}}
P. Bakowski 25
MyMy Ethernet Ethernet packetpacket receivereceive#include "#include "mypackage.hmypackage.h" "
main(intmain(int c, char **a) c, char **a)
{ {
unsigned char message[128]; unsigned char message[128];
intint sdsd, , ret,ncarret,ncar=128; =128;
unsigned char *eth; unsigned char abuf[6]; unsigned char *eth; unsigned char abuf[6];
unsigned char packet[1000]; unsigned unsigned char packet[1000]; unsigned intint i=0; i=0;
intint type=0,fn=0; char v=0; type=0,fn=0; char v=0;
if(cif(c==1) { ==1) { printf("Usageprintf("Usage: : mypacetherrecvmypacetherrecv [eth0, wlan0] [eth0, wlan0] frame_numberframe_number [[d,p]d,p]\\nn"); exit(1);} "); exit(1);}
sdsd = = create_rawsocket(ETH_P_ALLcreate_rawsocket(ETH_P_ALL); );
ret= bind_rawsocket(a[1],sd,ETH_P_ALL); ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
if(cif(c>2) fn=atoi(a[2]); >2) fn=atoi(a[2]); if(cif(c>3) v=*a[3]; >3) v=*a[3];
while(iwhile(i<fn) <fn)
{ {
recv_rawpacket(sd,packet,ETHER_HDR_LEN+ncarrecv_rawpacket(sd,packet,ETHER_HDR_LEN+ncar); );
type= type= type_ethhdr(packettype_ethhdr(packet); );
if(vif(v=='d') hex_dump(packet,64); =='d') hex_dump(packet,64);
switch (type) { switch (type) {
case 1 : case 1 : printf("IPprintf("IP protocolprotocol\\n");breakn");break; ;
case 2 : case 2 : printf("ARPprintf("ARP protocolprotocol\\n");breakn");break; ;
case 3 : case 3 : printf("RARPprintf("RARP protocolprotocol\\n");breakn");break; ;
default: default: printf("otherprintf("other protocolprotocol\\n");breakn");break; ;
} }
i++;i++;
if(vif(v=='p') =='p') print_ethhdr(packetprint_ethhdr(packet); );
} }
}}
P. Bakowski 26
MyMy IP IP packetpacket sendsend#include "#include "mypackage.hmypackage.h" "
#define SA "172.19.64.142" #define SA "172.19.64.142"
#define DA "172.19.71.255" #define DA "172.19.71.255"
#define ETHER_TYPE 0x0800 #define ETHER_TYPE 0x0800
#define SRC_ETHER_ADDR#define SRC_ETHER_ADDR ""aa:aa:aa:aa:aa:aaaa:aa:aa:aa:aa:aa" "
#define DST_ETHER_ADDR#define DST_ETHER_ADDR ""ff:ff:ff:ff:ff:ffff:ff:ff:ff:ff:ff" "
main(intmain(int c, char **a) c, char **a)
{ {
unsigned char message[128]; unsigned char message[128];
intint sdsd, ret, , ret, ncarncar=128; // 20 bytes =128; // 20 bytes -- IP packet header IP packet header
unsigned char *eth; unsigned char *unsigned char *eth; unsigned char *ipip; ;
unsigned char packet[1000]; unsigned unsigned char packet[1000]; unsigned intint i=0; i=0;
intint pnpn=0; char v=0; =0; char v=0;
if(cif(c==1) { ==1) { printf("Usageprintf("Usage: : mypacetheripsendmypacetheripsend [eth0, wlan0] [eth0, wlan0] packet_numberpacket_number \\n"); exit(1);} n"); exit(1);}
pnpn= atoi(a[2]); = atoi(a[2]);
sdsd = = create_rawsocket(ETH_P_ALLcreate_rawsocket(ETH_P_ALL); );
ret= bind_rawsocket(a[1],sd,ETH_P_ALL); ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
if(retif(ret<0) { <0) { printf("Can'tprintf("Can't bind to %sbind to %s\\n",a[1]); exit(2);} n",a[1]); exit(2);}
eth = (unsigned char *) eth = (unsigned char *) create_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPEcreate_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPE); );
memcpy(packet,eth,ETHER_HDR_LENmemcpy(packet,eth,ETHER_HDR_LEN); );
ipip = (unsigned char *)create_iphdr(0x45,0,htons(128),htons(2010),0= (unsigned char *)create_iphdr(0x45,0,htons(128),htons(2010),0,128,6,0,inet_addr(SA),inet_addr(DA)); ,128,6,0,inet_addr(SA),inet_addr(DA));
memcpy(packet+ETHER_HDR_LEN,ipmemcpy(packet+ETHER_HDR_LEN,ip, IP_HDR_LEN); , IP_HDR_LEN);
while(iwhile(i<<pnpn) )
{ { send_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+ncarsend_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+ncar); );
i++; sleep(1); i++; sleep(1);
} }
}}
P. Bakowski 27
MyMy IP IP packetpacket receivereceive#include "#include "mypackage.hmypackage.h" "
main(intmain(int c, char **a) c, char **a)
{ {
unsigned char message[128]; unsigned char message[128];
intint sdsd, , ret,ncarret,ncar=128; // 28 bytes =128; // 28 bytes -- ARP packet, 20 bytes ARP packet, 20 bytes -- IP packet IP packet
unsigned char *eth; unsigned char abuf[6]; unsigned char *eth; unsigned char abuf[6];
unsigned char packet[1000]; unsigned unsigned char packet[1000]; unsigned intint i=0; i=0;
intint ethtypeethtype=0; =0; intint iptypeiptype=0,=0,pnpn=0; =0; char v=0; char v=0;
if(cif(c==1) { ==1) { printf("Usageprintf("Usage: : mypacetheriprecvmypacetheriprecv [eth0, wlan0] [eth0, wlan0] packet_numberpacket_number [[d,p]d,p]\\nn"); exit(1);} "); exit(1);}
sdsd = = create_rawsocket(ETH_P_ALLcreate_rawsocket(ETH_P_ALL); );
ret= bind_rawsocket(a[1],sd,ETH_P_ALL); ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
pnpn= atoi(a[2]); = atoi(a[2]); if(cif(c>3) v=*a[3]; >3) v=*a[3];
while(iwhile(i<<pnpn) )
{ {
recv_rawpacket(sd,packet,ETHER_HDR_LEN+ncarrecv_rawpacket(sd,packet,ETHER_HDR_LEN+ncar); );
ethtypeethtype= = type_ethhdr(packettype_ethhdr(packet); );
if(ethtypeif(ethtype==1) ==1)
{ {
iptypeiptype=type_iphdr(packet+14); =type_iphdr(packet+14);
if(iptypeif(iptype==1) ==1) printf("printf("\\nn ---------------- IMCP packet IMCP packet ----------------\\n"); n");
if(iptypeif(iptype==2) ==2) printf("printf("\\nn ---------------- TCP packet TCP packet ----------------\\n"); n");
if(iptypeif(iptype==3) ==3) printf("printf("\\nn ---------------- UDP packet UDP packet ----------------\\n"); n");
if(vif(v=='p') print_iphdr(packet+14); =='p') print_iphdr(packet+14);
if(vif(v=='d') hex_dump(packet+14,64); =='d') hex_dump(packet+14,64);
} }
i++; i++;
} }
}}
P. Bakowski 28
MyMy UDP UDP packetpacket sendsend#include "#include "mypackage.hmypackage.h" "
#define SA "172.19.64.142" #define SA "172.19.64.142"
#define DA "172.19.71.255" #define DA "172.19.71.255"
#define ETHER_TYPE 0x0800 #define ETHER_TYPE 0x0800
#define SRC_ETHER_ADDR#define SRC_ETHER_ADDR ""aa:aa:aa:aa:aa:aaaa:aa:aa:aa:aa:aa" "
#define DST_ETHER_ADDR#define DST_ETHER_ADDR ""ff:ff:ff:ff:ff:ffff:ff:ff:ff:ff:ff" "
main(intmain(int c, char **a) c, char **a)
{ {
unsigned char message[128]; unsigned char message[128];
intint sdsd, ret, , ret, ncarncar=128; // 20 bytes =128; // 20 bytes -- IP packet header IP packet header
unsigned char *eth; unsigned char *unsigned char *eth; unsigned char *ipip; ;
unsigned char *unsigned char *udpudp; unsigned char packet[1000]; ; unsigned char packet[1000];
unsigned unsigned intint i=0; i=0; intint pnpn=0; char v=0; =0; char v=0;
if(cif(c==1) { ==1) { printf("Usageprintf("Usage: : mypacetheripsendmypacetheripsend [eth0, wlan0] [eth0, wlan0] packet_numberpacket_number \\n"); n");
exit(1);} exit(1);}
pnpn= atoi(a[2]); = atoi(a[2]); sdsd = = create_rawsocket(ETH_P_ALLcreate_rawsocket(ETH_P_ALL); );
ret= bind_rawsocket(a[1],sd,ETH_P_ALL); ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
……
P. Bakowski 29
MyMy UDP UDP packetpacket sendsend……
if(retif(ret<0) { <0) { printf("Can'tprintf("Can't bind to %sbind to %s\\n",a[1]); exit(2);} n",a[1]); exit(2);}
printf("Giveprintf("Give the packet message (data) to send :the packet message (data) to send :\\n"); n");
ncarncar= read(0,message,128); = read(0,message,128);
eth = (unsigned char *) eth = (unsigned char *)
create_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPEcreate_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPE); );
memcpy(packet,eth,ETHER_HDR_LENmemcpy(packet,eth,ETHER_HDR_LEN); );
ipip = (unsigned char *)create_iphdr(0x45,0,htons(128),htons(2010),0= (unsigned char *)create_iphdr(0x45,0,htons(128),htons(2010),0,128,UDP,0, ,128,UDP,0,
inet_addr(SAinet_addr(SA), ), inet_addr(DAinet_addr(DA)); ));
memcpy(packet+ETHER_HDR_LEN,ipmemcpy(packet+ETHER_HDR_LEN,ip, IP_HDR_LEN); , IP_HDR_LEN);
udpudp = (unsigned char *)create_udphdr(htons(80),htons(80),htons(32),= (unsigned char *)create_udphdr(htons(80),htons(80),htons(32),0); 0);
memcpy(packet+ETHER_HDR_LEN+IP_HDR_LEN,udp,UDP_HDR_LENmemcpy(packet+ETHER_HDR_LEN+IP_HDR_LEN,udp,UDP_HDR_LEN); );
memcpy(packet+ETHER_HDR_LEN+IP_HDR_LEN+UDP_HDR_LEN,messagememcpy(packet+ETHER_HDR_LEN+IP_HDR_LEN+UDP_HDR_LEN,message, , ncarncar); );
while(iwhile(i<<pnpn) )
{ {
send_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+UDP_HDR_LEN+ncsend_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+UDP_HDR_LEN+ncarar); );
i++; sleep(1); i++; sleep(1);
} }
}}
P. Bakowski 30
MyMy UDP UDP packetpacket receivereceive#include "#include "mypackage.hmypackage.h" "
main(intmain(int c, char **a) c, char **a)
{ {
unsigned char message[128]; unsigned char message[128];
intint sdsd, , ret,ncarret,ncar=128; // 28 bytes =128; // 28 bytes -- ARP packet, 20 bytes ARP packet, 20 bytes -- IP packet IP packet
unsigned char *eth; unsigned char abuf[6]; unsigned char *eth; unsigned char abuf[6];
unsigned char packet[1000]; unsigned unsigned char packet[1000]; unsigned intint i=0; i=0;
intint ethtypeethtype=0; =0; intint iptypeiptype=0,=0,pnpn=0; =0; char v=0; char v=0;
if(cif(c==1) ==1)
{ { printf("Usageprintf("Usage: : mypacetheriprecvmypacetheriprecv [eth0, wlan0] [eth0, wlan0] packet_numberpacket_number [[d,p]d,p]\\nn"); exit(1);} "); exit(1);}
sdsd = = create_rawsocket(ETH_P_ALLcreate_rawsocket(ETH_P_ALL); );
ret= bind_rawsocket(a[1],sd,ETH_P_ALL); ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
pnpn= atoi(a[2]); = atoi(a[2]);
if(cif(c>3) v=*a[3]; >3) v=*a[3];
……
P. Bakowski 31
MyMy UDP UDP packetpacket receivereceive……
while(iwhile(i<<pnpn) )
{ {
recv_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+UDP_HDR_LEN+ncrecv_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+UDP_HDR_LEN+ncarar); );
ethtypeethtype= = type_ethhdr(packettype_ethhdr(packet); );
if(ethtypeif(ethtype==1) ==1)
{ {
iptypeiptype==type_iphdr(packet+ETHER_HDR_LENtype_iphdr(packet+ETHER_HDR_LEN); );
if(iptypeif(iptype==17) ==17)
{ {
printf("printf("\\nn-------- UDP packet UDP packet --------\\n"); n");
if(vif(v=='p') =='p')
{ {
print_iphdr(packet+ETHER_HDR_LENprint_iphdr(packet+ETHER_HDR_LEN); );
print_udphdr(packet+ETHER_HDR_LEN+IP_HDR_LENprint_udphdr(packet+ETHER_HDR_LEN+IP_HDR_LEN); );
} }
if(vif(v=='d') hex_dump(packet,64); =='d') hex_dump(packet,64);
} }
} }
i++; i++;
} }
}}
P. Bakowski 32
MyMy TCP TCP packetpacket sendsend#include "#include "mypackage.hmypackage.h" "
#define SA "172.19.64.142" #define SA "172.19.64.142"
#define DA "172.19.71.255" #define DA "172.19.71.255"
#define ETHER_TYPE 0x0800 #define ETHER_TYPE 0x0800
#define SRC_ETHER_ADDR#define SRC_ETHER_ADDR ""aa:aa:aa:aa:aa:aaaa:aa:aa:aa:aa:aa" "
#define DST_ETHER_ADDR#define DST_ETHER_ADDR ""ff:ff:ff:ff:ff:ffff:ff:ff:ff:ff:ff" "
main(intmain(int c, char **a) c, char **a)
{ {
unsigned char message[128]; unsigned char message[128];
intint sdsd, ret, , ret, ncarncar=128; // 20 bytes =128; // 20 bytes -- IP packet header IP packet header
unsigned char *eth; unsigned char *eth;
unsigned char *unsigned char *ipip; ;
unsigned char *unsigned char *tcptcp; ;
unsigned char packet[1000]; unsigned char packet[1000];
unsigned unsigned intint i=0; i=0;
intint pnpn=0; =0;
char v=0; char v=0;
if(cif(c==1) { ==1) { printf("Usageprintf("Usage: : mypacetheriptcpsendmypacetheriptcpsend [eth0, wlan0] [eth0, wlan0] packet_numberpacket_number \\n"); exit(1);} n"); exit(1);}
pnpn= atoi(a[2]); = atoi(a[2]);
sdsd = = create_rawsocket(ETH_P_ALLcreate_rawsocket(ETH_P_ALL); );
ret= bind_rawsocket(a[1],sd,ETH_P_ALL); ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
if(retif(ret<0) { <0) { printf("Can'tprintf("Can't bind to %sbind to %s\\n",a[1]); exit(2);} n",a[1]); exit(2);}
printf("Giveprintf("Give the packet message (data) to send :the packet message (data) to send :\\n"); n");
ncarncar= read(0,message,128); = read(0,message,128);
eth = (unsigned char *) eth = (unsigned char *) create_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPEcreate_eth(SRC_ETHER_ADDR,DST_ETHER_ADDR,ETHER_TYPE); );
memcpy(packet,eth,ETHER_HDR_LENmemcpy(packet,eth,ETHER_HDR_LEN); );
……
P. Bakowski 33
MyMy TCP TCP packetpacket sendsend
……
ipip = (unsigned char *) = (unsigned char *) create_iphdrcreate_iphdr((
0x45,0, // 0x45,0, // verlen,tosverlen,tos
htons(IP_HDR_LEN+TCP_HDR_LEN+128),htons(2010), // htons(IP_HDR_LEN+TCP_HDR_LEN+128),htons(2010), // totlen,idtotlen,id
0,128,6,cksum((unsigned short *)(0,128,6,cksum((unsigned short *)(packet+ETHER_HDR_LEN),IP_HDR_LENpacket+ETHER_HDR_LEN),IP_HDR_LEN), // ), // cksumcksum(), (),
TTL,protoTTL,proto, , inet_addr(SA),inet_addr(DAinet_addr(SA),inet_addr(DA)); ));
memcpy(packet+ETHER_HDR_LEN,ipmemcpy(packet+ETHER_HDR_LEN,ip, IP_HDR_LEN); , IP_HDR_LEN);
tcptcp =(unsigned char *) =(unsigned char *)
create_tcphdr(htons(80),htons(80),htonl(1111),htonl(2222),0,0x02create_tcphdr(htons(80),htons(80),htonl(1111),htonl(2222),0,0x02,htons(1000),0,0);,htons(1000),0,0);
memcpy(packet+ETHER_HDR_LEN+IP_HDR_LEN,tcp,TCP_HDR_LENmemcpy(packet+ETHER_HDR_LEN+IP_HDR_LEN,tcp,TCP_HDR_LEN); );
memcpy(packet+ETHER_HDR_LEN+IP_HDR_LEN+TCP_HDR_LEN,messagememcpy(packet+ETHER_HDR_LEN+IP_HDR_LEN+TCP_HDR_LEN,message, , ncarncar); );
while(iwhile(i<<pnpn) )
{ {
send_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+TCP_HDR_LEN+ncsend_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+TCP_HDR_LEN+ncarar); );
i++; sleep(1); i++; sleep(1);
} }
}}
P. Bakowski 34
MyMy TCP TCP packetpacket receivereceiveinclude "include "mypackage.hmypackage.h" "
main(intmain(int c, char **a) c, char **a)
{ {
unsigned char message[128]; unsigned char message[128];
intint sdsd, , ret,ncarret,ncar=128; // 28 bytes =128; // 28 bytes -- ARP packet, 20 bytes ARP packet, 20 bytes -- IP packet IP packet
unsigned char *eth; unsigned char *eth;
unsigned char abuf[6]; unsigned char abuf[6];
unsigned char packet[1000]; unsigned unsigned char packet[1000]; unsigned intint i=0; i=0;
intint ethtypeethtype=0; =0;
intint iptypeiptype=0,=0,pnpn=0; =0;
char v=0; char v=0;
if(cif(c==1) ==1)
{ { printf("Usageprintf("Usage: : mypacetheriptcprecvmypacetheriptcprecv [eth0, wlan0] [eth0, wlan0] packet_numberpacket_number [[d,p]d,p]\\nn"); ");
exit(1);} exit(1);}
sdsd = = create_rawsocket(ETH_P_ALLcreate_rawsocket(ETH_P_ALL); );
ret= bind_rawsocket(a[1],sd,ETH_P_ALL); ret= bind_rawsocket(a[1],sd,ETH_P_ALL);
pnpn= atoi(a[2]); = atoi(a[2]);
if(cif(c>3) v=*a[3]; >3) v=*a[3];
……
P. Bakowski 35
MyMy TCP TCP packetpacket receivereceive…
while(iwhile(i<<pnpn) )
{ {
recv_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+TCP_HDR_LEN+ncrecv_rawpacket(sd,packet,ETHER_HDR_LEN+IP_HDR_LEN+TCP_HDR_LEN+ncarar); );
ethtypeethtype= = type_ethhdr(packettype_ethhdr(packet); );
if(ethtypeif(ethtype==1) ==1)
{ {
iptypeiptype==type_iphdr(packet+ETHER_HDR_LENtype_iphdr(packet+ETHER_HDR_LEN); );
if(iptypeif(iptype==6) ==6)
{ {
printf("printf("\\nn-------- TCP packet TCP packet --------\\n"); n");
if(vif(v=='p') =='p')
{ {
print_iphdr(packet+ETHER_HDR_LENprint_iphdr(packet+ETHER_HDR_LEN); );
print_tcphdr(packet+ETHER_HDR_LEN+IP_HDR_LENprint_tcphdr(packet+ETHER_HDR_LEN+IP_HDR_LEN); );
} }
if(vif(v=='d') hex_dump(packet,64); =='d') hex_dump(packet,64);
} }
} i++; } i++;
} }
}}
P. Bakowski 36
SummarySummary
Creating and Binding raw sockets
Creating and Displaying Ethernet framesCreating and Displaying IP packetsCreating and Displaying UDP packetsCreating and Displaying TCP packets
Sending and Receiving Ethernet framesSending and Receiving IP packetsSending and Receiving UDP packetsSending and Receiving TCP packets