#include "network.h" #include <iostream> #include <string> #include <vector> #include "pcap.h" #include <ntddndis.h> #include "packet32.h" using namespace std; struct packet_t{ ethhdr eth; arphdr arp; u_char pad[18]; }; int main(int argc, char **argv) { pcap_t *fp; char errbuf[PCAP_ERRBUF_SIZE]; string str; vector<string> v; packet_t packet; int i = 0; pcap_if_t *alldevs; pcap_if_t *d; /* Retrieve the device list from the local machine */ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf); exit(1); } cout<<sizeof(packet_t)<<endl; /* Print the list */ for(d= alldevs; d != NULL; d= d->next) { printf("%d. %s", ++i, d->name); str = d->name; v.push_back(str); if(d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } if (i == 0) { printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); return 1; } /* We don't need any more the device list. Free it */ pcap_freealldevs(alldevs); printf("%s..\n",mac_to_string(get_dev_mac(v[0].c_str()),errbuf)); /* Open the output device */ if ( (fp= pcap_open(v[0].c_str(), 100, // portion of the packet to capture (only the first 100 bytes) PCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode 1000, // read timeout NULL, // authentication on the remote machine errbuf // error buffer ) ) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", argv[1]); return 1; } /* Send down the packet */ memset(&packet,0,sizeof packet_t); memset(&packet.eth.h_dest,0xFF,ETH_ALEN); memcpy(&packet.eth.h_source,get_dev_mac(v[0].c_str()),ETH_ALEN); //上层协议为ARP协议,0x0806 packet.eth.h_proto = htons(ETH_P_ARP); //硬件类型,Ethernet是0x0001 packet.arp.ar_hrd = htons(ARPHRD_ETHER); //上层协议类型,IP为0x0800 packet.arp.ar_pro = htons(ETH_P_IP); //硬件地址长度:MAC地址长度为0x06 packet.arp.ar_hln = 6; //协议地址长度:IP地址长度为0x04 packet.arp.ar_pln = 4; //操作:ARP请求为1 packet.arp.ar_op = htons(ARPOP_REQUEST); //源端 memcpy(packet.arp.ar_sha,get_dev_mac(v[0].c_str()),ETH_ALEN); u_long sip = inet_addr("125.217.40.219"); memcpy(packet.arp.ar_sip,&sip,sizeof(u_long)); //目标 memset(packet.arp.ar_tha,0,ETH_ALEN); u_long tip = inet_addr("125.217.40.254"); memcpy(packet.arp.ar_tip,&tip,sizeof(u_long)); L: if (pcap_sendpacket(fp, (u_char*)&packet, sizeof packet_t /* size */) != 0) { fprintf(stderr,"\nError sending the packet: %s\n", pcap_geterr(fp)); return 1; } goto L; return 0; }