WinPcap实战(一)——发送ARP包

2023-10-27

ARP包的结构:

  1. ARP包格式:物理帧头(14B)——ARP帧结构(28B)——填充数据(18B)——CRC(4B)。这里给出一张图(图中没有18字节的填充数据和4字节的校验位):这里写图片描述

  2. 物理帧头(14B):目的MAC (6B) ——源MAC(6B) ——类型(2B, ARP帧:0x0806)

  3. ARP帧结构(28B):硬件类型(2B,Ethernet:0x1)——上层协议类型(2B,IP:0x0800)——硬件地址长度(1B,0x6)——IP地址长度(1B,0x4)——操作(2B,请求: 0x1; 应答: 0x2)——源MAC地址(6B)——源IP地址(6B)——目的MAC地址(6B)——目的IP地址(6B)

依据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;
};

源代码

#include "stdafx.h"

#include <pcap.h>

#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;
};


int main()
{
	pcap_if_t *alldevs;   //所有网络适配器
	pcap_if_t *d;   //选中的网络适配器 
	int inum;   //选择网络适配器
	int i = 0;   //for循环变量
	pcap_t *adhandle;   //打开网络适配器,捕捉实例,是pcap_open返回的对象
	char errbuf[PCAP_ERRBUF_SIZE];   //错误缓冲区,大小为256

	/* 获取本机设备列表 */
	if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
	{
		fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
		exit(1);
	}

	/* 打印列表 */
	for (d = alldevs; d; d = d->next)
	{
		printf("%d. %s", ++i, d->name);
		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;
	}

	printf("Enter the interface number (1-%d):", i);
	scanf("%d", &inum);

	if (inum < 1 || inum > i)
	{
		printf("\nInterface number out of range.\n");
		/* 释放设备列表 */
		pcap_freealldevs(alldevs);
		return -1;
	}

	/* 跳转到选中的适配器 */
	for (d = alldevs, i = 0; i< inum - 1; d = d->next, i++);

	/* 打开设备 */
	if ((adhandle = pcap_open(d->name,          // 设备名
		65536,            // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
		PCAP_OPENFLAG_PROMISCUOUS,    // 混杂模式
		1000,             // 读取超时时间
		NULL,             // 远程机器验证
		errbuf            // 错误缓冲池
		)) == NULL)
	{
		fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
		/* 释放设备列表 */
		pcap_freealldevs(alldevs);
		return -1;
	}

	/*以上代码在WinPcap开发文档中都可以找到,填充ARP包的代码则要自己编写*/

	//开始填充ARP包,填充数据写死在代码中,测试用时数据可随意填写
	unsigned char sendbuf[42]; //arp包结构大小,42个字节
	unsigned char mac[6] = { 0x00,0x11,0x22,0x33,0x44,0x55 };
	unsigned char ip[4] = { 0x01,0x02,0x03,0x04 };
	EthernetHeader eh;
	ArpHeader ah;
	//赋值MAC地址
	memset(eh.DestMAC, 0xff, 6);   //以太网首部目的MAC地址,全为广播地址
	memcpy(eh.SourMAC, mac, 6);   //以太网首部源MAC地址
	memcpy(ah.smac, mac, 6);   //ARP字段源MAC地址
	memset(ah.dmac, 0xff, 6);   //ARP字段目的MAC地址
	memcpy(ah.sip, ip, 4);   //ARP字段源IP地址
	memset(ah.dip, 0x05, 4);   //ARP字段目的IP地址
	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));
	memcpy(sendbuf + sizeof(eh), &ah, sizeof(ah));
	//如果发送成功
	if (pcap_sendpacket(adhandle, sendbuf, 42) == 0) {
		printf("\nPacketSend succeed\n");
	}
	else {
		printf("PacketSendPacket in getmine Error: %d\n", GetLastError());
	}

	/* 释放设备列表 */
	pcap_freealldevs(alldevs);

	return 0;
}

运行结果

程序在VS2015企业版里面运行无误,需要提前配置好WinPcap的编程环境

选择第三个网卡,成功发送ARP包
这里写图片描述

抓包软件抓到ARP包:
这里写图片描述

传送门

接收ARP包:
http://blog.csdn.net/u013539342/article/details/48525525
参考网址:http://blog.csdn.net/cqcre/article/details/40213911
WinPcap编程配置:http://www.findspace.name/easycoding/871
VS下This function or variable may be unsafe解决办法:
http://jingyan.baidu.com/article/49711c616b8a1ffa441b7cdc.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WinPcap实战(一)——发送ARP包 的相关文章

  • 【计算机网络13】网络安全

    文章目录 1 HTTP协议的安全问题 2 单向散列函数 One way hash function 2 1 单向散列函数的特点 2 2 常见的几种单向散列函数 2 3 防止数据被篡改 2 4 几个网站 3 对称加密 Symmetric Cr
  • windows修改远程端口

    windows修改远程端口 一 修改注册表 关于远程桌面的注册表的位置 由于系统版本的不同 文件存在的位置也不同 核心是寻找名称类似CurrentControlSet的目录下的PortNumber文件 其是远程桌面端口的端口配置 1 按 w
  • 前端面试的性能优化部分(3)每天10个小知识点

    目录 系列文章目录 前端面试的性能优化部分 1 每天10个小知识点 前端面试的性能优化部分 2 每天10个小知识点 前端面试的性能优化部分 3 每天10个小知识点 前端面试的性能优化部分 4 每天10个小知识点 前端面试的性能优化部分 5
  • 计算机网络4--Internet结构

    本页内容 1 基本结构 2 结构图解 3 层次结构图解 1 基本结构 a 端系统通过接入ISP access ISPs 连接到Internet b 接入ISP必须进一步互连 保证任意两个主机可以互相发送分组 c 构成复杂的网络互连的网络 2
  • 计算机网络 网络层——IP数据报 详记

    IP 数据报的格式 一个 IP 数据报由首部和数据两部分组成 首部的前一部分是固定长度 共 20 字节 是所有 IP 数据报必须具有的 在首部的固定部分的后面是一些可选字段 其长度是可变的 IP数据报首部的固定部分中的各字段 版本 占4位
  • 计算机网络(自顶向下方法)中的PoP

    目录 前言 问题 解决 前言 在读 计算机网络 自顶向下方法 时 看到在讲网络结构的时候提到过PoP 但是其中有一句话始终不理解 不通顺 上网搜索也没发现相关解释文章 因此 在我把这个问题解决后 就写下了这篇文章 希望可以帮助到其他人 问题
  • LWIP学习笔记(2)---IP协议

    IP首部 最高位在左边记为 bit 最低位在右边 记为31 bit 传输顺序 先0 7bit 在8 15bit 然后16 13 最后24 31bit 这种方式称为 big endian 也叫网络字节序 版本 ipv4 或 6 ipv6 首部
  • 在Windows 64位上编译gopacket

    我正在尝试使用gopacket在我的 Windows 10 上 我用它来嗅探数据包并将数据包直接注入到网卡或从网卡注入数据包 我可以使用 GOARCH 386 轻松编译和运行我的代码 但不能在 GOARCH amd64 中编译和运行我的代码
  • 如何使用 winpcap 修改 HTTP 响应数据包?

    这里有两个问题 如果内容被编码 gzip 我是否还需要更改标头部分以使 HTTP 数据包有效 校验和 如果有的话 UPDATE 有实际经验的人可以详细说明一下涉及的步骤吗 我在用着winpcap和BPFtcp and src port 80
  • 使用 WinPcap 获取原始 WiFi 数据包

    考虑简单的 C 代码发送单个原始数据包与WinPcap 与构建数据包标头相关的行以以下注释开头 假设在以太网上 将 mac 目标设置为 1 1 1 1 1 1 因此 您可能会猜测 为了发送原始 WiFi 数据包 您应该相应地更改此代码块 然
  • 计算机网络扫盲(4)——时延

    一 概述 在这里 我们考虑分组交换网的情况 因特网可以被看成是一种基础设施 该基础设施为运行在端系统上的分布式应用提供服务 在理想情况下 我们希望因特网服务能够在任意两个端系统之间随心所欲地移动数据而没有任何数据地丢失 然而 这是一个极高的
  • Android 无需 root 即可访问 ARP 表

    最近在做一个Android项目 需要访问ARP表 要求之一是避免任何需要 root 设备的方法 所以 我的问题是 有没有办法在不root设备的情况下访问android中的ARP表 目前我发现大多数方法都使用 proc net arp 来访问
  • 【计算机网络概述】第一章:概论 1.1什么是Internet

    学习目标 什么是网络 什么是计算机网络 什么是互联网 前言 温馨提示 该文章是小编学习计算机网络的笔记 参考中科大的郑老师hh 这一章是非常重要的 是为之后的学习进行打基础 我们需要努力学习这一章的内容 跨过这座山 他们就会听见你的故事 一
  • 【计算机网络概述】第一章:概论 1.3什么是网络核心

    学习目标 网络核心 电路交换 分组交换 电路交换与分组交换的区别 前言 上一篇文章学习了网络边缘 知道了主机和应用进程 端系统 是怎么接入网络核心中的 端系统的两种模式 客户端 服务器模式 对等模式 端系统中利用两种面向网络实施的服务 TC
  • 计算机网络基础——常用的中英文网络述语大全,强烈建议收藏

    系统网络体系结构 System Network Architecture SNA 国际标准化组织 International Organization for Standardization ISO 开放系统互连基本参考模型 Open Sy
  • pcap_pkthdr 是做什么用的?

    代码片段来自here https www winpcap org docs docs 40 2 html group wpcap tut6 html void packet handler u char param const struct
  • 2023 全球网络黑客常用攻击方法 Top10_top10攻击

    近几年 借助互联网产业发展的东风 网络黑产也迎来更加巅峰的状态 不论是从攻击效率 组织规模 亦或是收益变现能力 都在一天天变的成熟完善 根据艾瑞咨询 2020 年发布的 现代网络诈骗分析报告 全国黑产从业者已经超过 40 万人 依托其从事网
  • 在 Linux 上嗅探数据包时过滤网络堆栈中的数据包?

    我有一个问题要问底层网络 Linux 专家 我必须为我大学的安全项目构建两个工具 第一个工具是 ARP 中毒攻击者 它会毒害远程主机的 ARP 缓存 以便检索他发送到另一台主机的数据 我使用原始套接字用 C 语言编写了这个工具 它工作得很好
  • 从MAC地址获取IP。 arp -a 不显示设备

    我正在尝试编写一个批处理文件 该文件应该在连接到网络 腾达 WiFi 路由器 时找到我的 Android 手机的动态分配的 IP 所以我正在尝试arp a并搜索我手机的 MAC 地址 以便我可以从表中获取其 IP C Users Leero
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行

随机推荐

  • 期权酱也来说说期权双卖策略原理

    期权option 又称选择权 是一类衍生品合约 买方支付权利金给卖方之后 买方有权在未来的特定日期或之前 以特定的价格向卖方买入或卖出标的资产的权利 下文介绍期权酱也来说说期权双卖策略原理 本文来自 期权酱 期权的本质简单说就是买方支付权利
  • 自己挖坑自己填,谷歌大改Transformer注意力,速度、内存利用率都提上去了

    点击上方 AI遇见机器学习 选择 星标 公众号 重磅干货 第一时间送达 来自 机器之心 考虑到 Transformer 对于机器学习最近一段时间的影响 这样一个研究就显得异常引人注目了 Transformer 有着巨大的内存和算力需求 因为
  • 挖掘机整体(2012.11.30)

    将近1周 终于把整体搞定了 这周的问题所在就是由于 180 ANGLE或者180 ANGLE的余弦值都相同 所以才会来回晃 我用了ASINF反正弦
  • Spring 框架学习—控制反转(IOC)

    Spring是一个开源框架 Spring是于2003 年兴起的一个轻量级的Java 开发框架 由Rod Johnson创建 简单来说 Spring是一个分层的JavaSE EEfull stack 一站式 轻量级开源框架 主要用于降低模块之
  • C#编程中的报错解决System.InvalidOperationException

    C 编程中的报错解决System InvalidOperationException 问题场景 问题原因 解决方案 方案一 打破规则 方案二 利用委托 Delegate 问题场景 在C Windows GUI编程中 从某个子线程去访问设计器
  • 计算机类毕业设计优秀最新题目

    主要有以下类别 python c语言 c vc opencv opengl程序设计 单片机类 51 stm32 arduino arm avr 龙芯开发板 嵌入式系统等硬件设计 程序设计 protues仿真 下列题目涵盖但不限于以上内容 4
  • 【Unity】渐入渐出的黑屏(白屏)过场动画最简单的实现

    一个简单的黑屏动画 用于2D项目 效果类似慢眨眼 进 出房间时切换场景的衔接过渡 这种效果的实现方式其实蛮多的 我能想到的包括用shader 用一张全黑Sprite覆盖屏幕 或者直接做成一个UI 最近学了一些UnityShader 所以首先
  • html title 属性多行显示

    html global attribute title displays in multiple lines 下面的代码段主要是展现了4种方式让 title 属性的多行展示 经测试 至少兼容到了 ie8
  • java JDBC

    JDBC是什么 Java DataBase Connectivity Java语言连接数据库 JDBC的本质是什么 一套接口 JDBC是SUN公司制定的一套接口 interface 接口都有调用者和实现者 面向接口调用 面向接口写实现类 这
  • Golang笔记:使用exec包执行外部程序与Shell命令

    文章目录 目的 使用演示 Cmd结构体 总结 目的 程序中执行外部程序是比较常用的功能 Golang执行外部程序可以使用标准库中的 os exec https pkg go dev os exec 这个包默认是用来执行外部程序的 可以通过调
  • 3 分钟掌握 Node.js 版本的区别

    在我们日常开发中 Node js 使用场景越来越多 大到服务端项目 小到开发工具脚本 所以掌握 Node js 一些基础知识是非常有必要的 今天主要聊一下 Node js 中 LTS 和 Current 的区别和如何选择合适的版本 一 版本
  • 前端在线预览word,excel,pdf

    前端在线预览word excel pdf 预览Word 预览pdf 预览Excel 预览Word 微软的在线预览功能 可以预览word ppt Excel PDF 局限 需要外网能访问文件 如果是只能内网用的系统就不适合了 XDOX预览 局
  • Linux组成员共享目录

    背景 在实际工作中常常会遇到这样的问题 一台服务器上的多个用户需要合作完成一个项目 他们都有自己的home目录和初始私有组 而他们需要同时再同一个目录下做开发 这时就会用到组成员共享目录 下面介绍如何让组成员再同一目录协同工作 以下操作默认
  • ./darknet: error while loading shared libraries: libcudart.so.8.0: cannot open shared object file:

    libcudart so 8 0 不能找到 是库文件路径引发的问题 可以到 etc ld so conf d目录下 修改其中任意一份conf文件 可以自建conf 以方便识别 将lib所在目录写进去 然后在终端输入 ldconfig 更新缓
  • Android客户端连接SSM(Spring+SpringMVC+Mybatis)框架Java服务器端

    Android客户端开发越来越流行 但是 Android客户端对应的服务器端采用什么框架呢 对于功能较为简单的应用 我建议 直接采用java web开发最简单的MVC框架即可 很多Android应用的服务器端开发框架 我都是采用这种 但是
  • Python安装及建立虚拟环境

    文章目录 前言 一 python安装 二 建立虚拟环境 三 安装jupyter notebook 总结 前言 Python由荷兰数学和计算机科学研究学会的吉多 范罗苏姆 于1990 年代初设计 作为一门叫做ABC语言的替代品 Python提
  • MongoDB 系统管理与操作详解

    一 MongoDB 启动与关闭 1 启动MongoDB 执行mongod命令即可启动MongoDB服务器 mongod在启动时可使用许多可配置选项 在命令行中运行mongod help可列出这些选项 下列选项十分常用 需着重注意 dbpat
  • JVM——垃圾回收

    垃圾回收 文章目录 垃圾回收 垃圾回收概述 什么是垃圾 为什么要回收垃圾 内存溢出和内存泄漏 java垃圾回收机制 自动内存管理 应该关心哪些区域的回收 垃圾回收相关算法 垃圾标记阶段算法 如何标记一个垃圾对象 什么样的对象能被标记为垃圾对
  • IntelliJ IDEA 高级调试技巧

    一 条件断点 循环中经常用到这个技巧 比如 遍历1个大List的过程中 想让断点停在某个特定值 参考上图 在断点的位置 右击断点旁边的小红点 会出来一个界面 在Condition这里填入断点条件即可 这样调试时 就会自动停在i 10的位置
  • WinPcap实战(一)——发送ARP包

    ARP包的结构 ARP包格式 物理帧头 14B ARP帧结构 28B 填充数据 18B CRC 4B 这里给出一张图 图中没有18字节的填充数据和4字节的校验位 物理帧头 14B 目的MAC 6B 源MAC 6B 类型 2B ARP帧 0x