36
Using Raw Sockets Using Raw Sockets with Internet Protocols P. Bakowski P. Bakowski [email protected] [email protected]

Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... [email protected]. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

Embed Size (px)

Citation preview

Page 1: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

Using Raw SocketsUsing Raw Socketswith Internet Protocols

P. BakowskiP. Bakowski

[email protected]@ieee.org

Page 2: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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.

Page 3: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

P. Bakowski 3

WhatWhat is is RawRaw Socket ?Socket ?

raw socketraw socket

Ethernet frame

eth0, wlan0eth0, wlan0

Page 4: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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; ;

}}

Page 5: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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);

} }

Page 6: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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;

}}

Page 7: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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;

}}

Page 8: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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; ;

}}

Page 9: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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; ;

}}

Page 10: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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;

}}

Page 11: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

P. Bakowski 11

CreateCreate IP IP packetpacket headerheader

Page 12: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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))

Page 13: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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

*/*/

Page 14: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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); );

}}

Page 15: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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]);

}}

Page 16: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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

Page 17: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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); );

}}

Page 18: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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)); ));

}}

Page 19: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

P. Bakowski 19

CreateCreate TCP TCP packetpacket headerheader

Page 20: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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

Page 21: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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))

Page 22: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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); );

}}

Page 23: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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)); })); }

Page 24: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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++;

} }

}}

Page 25: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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); );

} }

}}

Page 26: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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);

} }

}}

Page 27: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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++;

} }

}}

Page 28: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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);

……

Page 29: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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);

} }

}}

Page 30: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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];

……

Page 31: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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++;

} }

}}

Page 32: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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); );

……

Page 33: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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);

} }

}}

Page 34: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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];

……

Page 35: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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++;

} }

}}

Page 36: Using Raw Sockets - Polytech2go · Using Raw Sockets with Internet Protocols ... bako@ieee.org. P. Bakowski 2 What is Raw Socket ? Most socket application programming interfaces

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