/*****************************This code generates a bogus ethernet packet and sends it on the interface of your choice ********
******************************Compiling the code -> $g++ -o aha eth.cpp -lpcap *****************************************************
******************************Running the code -> $sudo ./aha ***********************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <pcap.h>
#include <iostream>
using namespace std;
struct ETHER_HDR
{
unsigned char d_mac[6];
unsigned char s_mac[6];
unsigned char typecode[2];
} *P_EH;
struct ARP_HDR
{
//complete this struct
};
/* For future reference and for the bold who may wish to experiment
struct IP_HDR
{
unsigned char ip_ver_ihl; // 4-bit IPv4 version
// 4-bit header length (in 32-bit words)
// normally=5 Means 20 Bytes may be 24
unsigned char ip_tos; // IP type of service
unsigned short ip_total_length; // Total length
unsigned short ip_id; // Unique identifier
unsigned short ip_flag_frag_off; // Flags & Fragment offset field
unsigned char ip_ttl; // Time to live
unsigned char ip_protocol;// Protocol(TCP,UDP etc)
unsigned short ip_checksum;// IP checksum
unsigned int ip_srcaddr; // Source address
unsigned int ip_destaddr;// Source address
} *P_IPV4;
*/
//void prep_ip_hdr (u_char* pkt, IP_HDR* iph);
//Function Prototypes
void prep_ether_hdr(u_char* pkt, ETHER_HDR* eh);
void prep_ARP_hdr(u_char* pkt, ARP_HDR* eh);
int main ()
{
ETHER_HDR* eh;
//IP_HDR* iph;
pcap_if_t *alldevs;
pcap_if_t *d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t * fp;
/* Retrieve the device list from the local machine */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
cerr<<"Error in pcap_findalldevs "<<errbuf;
exit(1);
}
/* Print the list */
for(d= alldevs; d != NULL; d= d->next)
{
cout<<++i<<" "<<d->name;
if (d->description)
cout<<d->description<<endl;
else
cout<< "(No description available)\n";
}
if (i == 0)
{
cout<<"\nNo interfaces found! Make sure Pcap is installed.\n";
return 1;
}
cout<<"Enter the interface number"<< (1-i);
int inum;
cin>>inum;
if(inum < 1 || inum > i)
{
cout<<"\nInterface number out of range.\n";
/* Free the device list */
pcap_freealldevs(alldevs);
return 1;
}
for (d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
fp = pcap_open_live(d->name, 65536,1,1000,errbuf); //open the device to enable sending the packet
u_char packet[100];
eh=new ETHER_HDR;
eh->d_mac[0]=255;
eh->d_mac[1]=255;
eh->d_mac[2]=255;
eh->d_mac[3]=255;
eh->d_mac[4]=255;
eh->d_mac[5]=255;
eh->s_mac[0]=2;
eh->s_mac[1]=2;
eh->s_mac[2]=2;
eh->s_mac[3]=2;
eh->s_mac[4]=2;
eh->s_mac[5]=2;
//the following will cause the payload to be interpreted as an IP protocol packet,this is the Type Code for IP 0x0800 is the type code for IP
eh->typecode[0] = 0x08;
eh->typecode[1] = 0x00;
prep_ether_hdr(packet, eh);
for (int i=14;i<100;i++)
packet[i]=i;
//iph = (struct IP_HDR*) (packet + sizeof(ETHER_HDR));
/*
iph=new IP_HDR;
iph->ip_ver_ihl = 0x45;
iph->ip_tos = 0;
iph->ip_total_length = 100 - sizeof(ETHER_HDR);
iph->ip_id = 2;
iph->ip_flag_frag_off = htons(0x4000); // 010 0000000000000 = 0 1000 0000
// 0000 0000 = 0x4000
iph->ip_ttl = 3;
iph->ip_protocol = 0x01;
iph->ip_checksum = 0;
iph->ip_srcaddr = inet_addr("192.168.1.3"); // change IP as needed
iph->ip_destaddr = inet_addr("192.168.1.2");// change IP as needed
//prep_ip_hdr(packet, iph);
*/
/* Send down the packet */
if (pcap_sendpacket(fp, packet, 100 /* size */) != 0)
{
cerr<<"\nError sending the packet: \n"<<pcap_geterr(fp);
return 0;
}
}
void prep_ether_hdr(u_char* pkt, ETHER_HDR* eh)
{
memcpy((pkt), eh->d_mac,6);
memcpy((pkt+6), eh->s_mac,6);
memcpy((pkt+12), &(eh->typecode),2);
}
void prep_ARP_hdr(u_char* pkt, ARP_HDR* eh)
{
//complete this fuction
}
//void prep_ip_hdr (u_char* pkt, IP_HDR* iph)
//{
// COMPLETE THIS FUNCTION
//}
******************************Compiling the code -> $g++ -o aha eth.cpp -lpcap *****************************************************
******************************Running the code -> $sudo ./aha ***********************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <pcap.h>
#include <iostream>
using namespace std;
struct ETHER_HDR
{
unsigned char d_mac[6];
unsigned char s_mac[6];
unsigned char typecode[2];
} *P_EH;
struct ARP_HDR
{
//complete this struct
};
/* For future reference and for the bold who may wish to experiment
struct IP_HDR
{
unsigned char ip_ver_ihl; // 4-bit IPv4 version
// 4-bit header length (in 32-bit words)
// normally=5 Means 20 Bytes may be 24
unsigned char ip_tos; // IP type of service
unsigned short ip_total_length; // Total length
unsigned short ip_id; // Unique identifier
unsigned short ip_flag_frag_off; // Flags & Fragment offset field
unsigned char ip_ttl; // Time to live
unsigned char ip_protocol;// Protocol(TCP,UDP etc)
unsigned short ip_checksum;// IP checksum
unsigned int ip_srcaddr; // Source address
unsigned int ip_destaddr;// Source address
} *P_IPV4;
*/
//void prep_ip_hdr (u_char* pkt, IP_HDR* iph);
//Function Prototypes
void prep_ether_hdr(u_char* pkt, ETHER_HDR* eh);
void prep_ARP_hdr(u_char* pkt, ARP_HDR* eh);
int main ()
{
ETHER_HDR* eh;
//IP_HDR* iph;
pcap_if_t *alldevs;
pcap_if_t *d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t * fp;
/* Retrieve the device list from the local machine */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
cerr<<"Error in pcap_findalldevs "<<errbuf;
exit(1);
}
/* Print the list */
for(d= alldevs; d != NULL; d= d->next)
{
cout<<++i<<" "<<d->name;
if (d->description)
cout<<d->description<<endl;
else
cout<< "(No description available)\n";
}
if (i == 0)
{
cout<<"\nNo interfaces found! Make sure Pcap is installed.\n";
return 1;
}
cout<<"Enter the interface number"<< (1-i);
int inum;
cin>>inum;
if(inum < 1 || inum > i)
{
cout<<"\nInterface number out of range.\n";
/* Free the device list */
pcap_freealldevs(alldevs);
return 1;
}
for (d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
fp = pcap_open_live(d->name, 65536,1,1000,errbuf); //open the device to enable sending the packet
u_char packet[100];
eh=new ETHER_HDR;
eh->d_mac[0]=255;
eh->d_mac[1]=255;
eh->d_mac[2]=255;
eh->d_mac[3]=255;
eh->d_mac[4]=255;
eh->d_mac[5]=255;
eh->s_mac[0]=2;
eh->s_mac[1]=2;
eh->s_mac[2]=2;
eh->s_mac[3]=2;
eh->s_mac[4]=2;
eh->s_mac[5]=2;
//the following will cause the payload to be interpreted as an IP protocol packet,this is the Type Code for IP 0x0800 is the type code for IP
eh->typecode[0] = 0x08;
eh->typecode[1] = 0x00;
prep_ether_hdr(packet, eh);
for (int i=14;i<100;i++)
packet[i]=i;
//iph = (struct IP_HDR*) (packet + sizeof(ETHER_HDR));
/*
iph=new IP_HDR;
iph->ip_ver_ihl = 0x45;
iph->ip_tos = 0;
iph->ip_total_length = 100 - sizeof(ETHER_HDR);
iph->ip_id = 2;
iph->ip_flag_frag_off = htons(0x4000); // 010 0000000000000 = 0 1000 0000
// 0000 0000 = 0x4000
iph->ip_ttl = 3;
iph->ip_protocol = 0x01;
iph->ip_checksum = 0;
iph->ip_srcaddr = inet_addr("192.168.1.3"); // change IP as needed
iph->ip_destaddr = inet_addr("192.168.1.2");// change IP as needed
//prep_ip_hdr(packet, iph);
*/
/* Send down the packet */
if (pcap_sendpacket(fp, packet, 100 /* size */) != 0)
{
cerr<<"\nError sending the packet: \n"<<pcap_geterr(fp);
return 0;
}
}
void prep_ether_hdr(u_char* pkt, ETHER_HDR* eh)
{
memcpy((pkt), eh->d_mac,6);
memcpy((pkt+6), eh->s_mac,6);
memcpy((pkt+12), &(eh->typecode),2);
}
void prep_ARP_hdr(u_char* pkt, ARP_HDR* eh)
{
//complete this fuction
}
//void prep_ip_hdr (u_char* pkt, IP_HDR* iph)
//{
// COMPLETE THIS FUNCTION
//}
No comments:
Post a Comment