Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P....

Preview:

Citation preview

Using Raw SocketsUsing Raw Socketswith Internet Protocols

P. BakowskiP. Bakowski

bako@ieee.orgbako@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

Recommended