简介hping.win32 是一份面向网络安全学习者与运维人员的 Windows 平台 hping 源码包基于 Dev-C 工程组织适合研究 TCP/IP 数据包组装与分析原理、开展防火墙测试与端口扫描实验的中级读者。压缩包共 102 个文件以 43 个 .o 目标文件与 43 个 .c 源文件为主体另含 11 个 .h 头文件及 1 个可执行 exe、Dev-C 工程文件与说明文本整体约 255KB源码覆盖参数解析、数据包收发、网卡获取、路由跟踪与扫描等模块便于对照阅读与二次编译。该资源已有 2919 人学习下载读者可借此掌握 TCP、UDP、ICMP 与 RAW-IP 协议的手工探测方法理解 MTU 路径发现、远程操作系统与运行时间探测、TCP/IP 堆栈审计等典型用法并基于现有工程结构进行调试与功能扩展。1. hping.win32 到底能干什么把 Linux 下的老牌探测工具搬到 Windows 上如果你在 Windows 上做过网络排查大概率经历过这种尴尬想发一个自定义 TCP 包看看对面防火墙到底放不放行结果系统自带的ping只会 ICMPtelnet只能连端口Test-NetConnection又封得死死的想改个标志位、指定源端口、控制 TTL全都没戏。hping.win32就是来解决这个问题的——它是经典 hping 工具在 Windows 平台上的移植版本能让你在 Windows 命令行里手工构造 TCP/UDP/ICMP 报文指定目标端口、源端口、TCP 标志位、TTL、数据长度甚至做端口扫描和防火墙规则探测。适合谁做渗透测试前期信息收集的、排查防火墙 ACL 到底拦在哪一跳的、学 TCP/IP 协议想亲手发包看回包的。它不依赖 WinPcap 之外的运行时编译产物是原生 exe扔到目标机器上就能跑。下面我从源码结构、编译链路、参数用法到踩坑把这份资源拆开讲清楚。2. 源码结构与编译链路从 Dev-C 到可执行 exe2.1 为什么这份代码在 Dev-C 里能编、在 VS 里反而报错hping.win32的源码是典型的 C 语言老项目目录里通常包含hping2.c、parseoptions.c、sendtcp.c、sendicmp.c、sendudp.c、waitpacket.c、resolve.c、ars.c这些文件外加一个Makefile.win或者.dev工程文件。它依赖两个东西一是 Windows 的 Winsock2 库ws2_32.lib二是 WinPcap 的开发包wpcap.lib和packet.lib头文件是pcap.h。为什么用 Dev-CMinGW 工具链而不是 Visual Studio因为这份代码里大量用了 GCC 的扩展语法和旧式 C 声明习惯比如在函数中间声明变量、用u_int32_t这种 BSD 类型、还有struct in_addr的隐式转换。MSVC 对 C89 之后的语法检查更严直接编译会报一堆error C2275: illegal use of this type as an expression。常见做法是要么用 Dev-C 自带的 MinGW GCC 直接编要么在 VS 里把文件后缀改成.c并关掉/WX但后者折腾成本高不推荐。编译前你需要确认三件事WinPcap 开发包已安装默认路径C:\WpdPack、Dev-C 的编译器选项里 include 路径加了C:\WpdPack\Include、链接器里加了C:\WpdPack\Lib下的wpcap.lib和ws2_32.lib。缺一个都会在链接阶段报undefined reference to pcap_open_live。2.2 用 Dev-C 编译 hping.win32 的完整步骤下面是我实际走通的编译流程按顺序执行即可。第一步安装 WinPcap 驱动和开发包。驱动装WinPcap_4_1_3.exe开发包解压到C:\WpdPack。注意驱动必须装否则运行时会报Error: unable to open adapter。第二步打开 Dev-C新建一个 Console Application 工程把源码目录下所有.c文件加入工程。第三步配置编译选项。在Project→Project Options→Directories里添加头文件路径在Parameters的 Linker 框里填入链接库。# Dev-C 链接器参数Project Options - Parameters - Linker -lwpcap -lpacket -lws2_32这三行分别链接 WinPcap 抓包库、WinPcap 数据包库、Winsock2 网络库。顺序不能乱-lwpcap必须在-lpacket前面否则会出现符号解析失败。第四步在Tools→Compiler Options→Settings→Code Generation里把Language standard设为ISO C99否则for循环里声明变量会报错。第五步按 F9 编译。如果一切正常会在output目录生成hping.exe。如果报cannot find -lwpcap说明库路径没配对回去检查C:\WpdPack\Lib是否加进了 Library 目录。编译成功后把hping.exe和C:\WpdPack\Bin下的wpcap.dll、Packet.dll放同一目录否则换机器跑会提示缺 DLL。2.3 源码里几个关键文件的分工理解文件分工改代码时才知道动哪里。hping2.c是主入口负责解析命令行参数、初始化 WinPcap、调度发送和接收循环。parseoptions.c处理所有-开头的参数比如-S设 SYN、-p设目标端口。sendtcp.c、sendudp.c、sendicmp.c分别构造三种协议的报文头里面能看到手工填ip_header和tcp_header结构体的过程。waitpacket.c是收包回调负责匹配回包并打印。resolve.c做 DNS 反查。如果你想加自定义 payload改sendtcp.c里的send_tcp_packet函数在填充完 TCP 头之后、调用pcap_sendpacket之前把数据拷进 buffer 偏移位置即可。注意校验和要重算源码里checksum函数在hping2.c末尾。3. 参数用法与实战场景手工发包到底怎么发3.1 核心参数速查与含义hping.win32的参数和 Linux 版基本一致但 Windows 下网卡名不是eth0而是\Device\NPF_{GUID}格式这是最容易卡住新手的地方。先用hping --list-interfaces或者直接跑hping -D列出所有可用网卡复制那串\Device\NPF_...备用。参数含义典型值-S设置 TCP SYN 标志无值-A设置 TCP ACK 标志无值-F设置 FIN 标志无值-P设置 PSH 标志无值-p目标端口80、443、22-s源端口随机或指定-c发送计数4-d数据长度120-tTTL 值64-I指定网卡\Device\NPF_{...}-a伪造源 IP谨慎使用-V详细输出无值这些参数可以组合。比如-S -p 80 -c 4就是向 80 端口发 4 个 SYN 包。3.2 三个能直接抄的实战命令场景一探测目标 80 端口是否被防火墙放行。用 SYN 包看有没有 SYN-ACK 回来。# 向 192.168.1.100 的 80 端口发 4 个 SYN 包指定网卡 hping.exe -S -p 80 -c 4 -I \Device\NPF_{你的网卡GUID} 192.168.1.100逻辑说明-S让 TCP 头 flags 位只置 SYN-c 4发 4 个包后停止。如果回包显示flagsSASYN-ACK说明端口开放且防火墙放行如果显示flagsRARST-ACK说明端口关闭但主机可达如果一个回包都没有说明被中间设备丢弃可能是防火墙 DROP 规则。场景二用不同 TTL 判断数据包在路径上哪一跳被拦。逐步加大 TTL看 ICMP 超时回包从哪个 IP 返回。# TTL 从 1 到 5 逐跳探测 hping.exe -S -p 443 -t 1 -c 1 10.0.0.1 hping.exe -S -p 443 -t 2 -c 1 10.0.0.1 hping.exe -S -p 443 -t 3 -c 1 10.0.0.1参数说明-t设 TTL每经过一个路由器减 1减到 0 时路由器回 ICMP Time Exceeded。通过观察回包源 IP能画出到目标的路径并定位在哪一跳开始没有响应。场景三发送带 payload 的 UDP 包测试服务响应。有些服务只对特定长度的 UDP 包回应。# 向 53 端口发 120 字节 UDP 数据 hping.exe --udp -p 53 -d 120 -c 3 8.8.8.8--udp切换协议-d 120指定数据区长度。注意 Windows 下 UDP 校验和计算和 Linux 略有差异源码里sendudp.c对校验和为 0 的情况做了特殊处理如果发现回包异常可以临时把校验和字段强制置 0 再试。3.3 回包怎么读flags 字段的含义跑完命令后输出里最关键的是flags后面的字母组合。S是 SYNA是 ACKR是 RSTF是 FINP是 PSH.表示该位为 0。常见组合SA表示端口开放RA表示端口关闭R单独出现表示目标不可达或协议栈拒绝。如果看到flags..全零说明收到的是异常包可能是中间设备伪造的。seq和ack字段用来核对序列号是否符合预期。如果回包的 ack 不等于你发出的 seq1说明有中间人或者 NAT 改写了包。ttl字段能反推对端操作系统Windows 默认 128Linux 默认 64经过几跳就减几。4. 避坑与排查Windows 下跑 hping 最容易翻车的五个点4.1 报 “unable to open adapter” 或找不到网卡现象命令跑起来直接退出提示打不开适配器或者-D列不出任何网卡。原因WinPcap 驱动没装或者当前用户没有管理员权限。WinPcap 需要内核级驱动才能抓包普通用户权限不够。解决用管理员身份运行 cmd再执行 hping。如果还不行重装 WinPcap 驱动装完重启一次。确认C:\Windows\System32\drivers\npf.sys存在。4.2 编译时报 “undefined reference to pcap_open_live”现象Dev-C 编译到最后链接阶段报一堆 undefined reference全是 pcap 开头的函数。原因链接器没找到wpcap.lib或者库路径写错。解决检查Project Options→Directories→Library里是否加了C:\WpdPack\LibParameters→Linker里是否写了-lwpcap -lpacket。注意 Dev-C 对路径中的空格敏感如果 WpdPack 装在Program Files下路径带空格会解析失败建议装在C:\WpdPack。4.3 发出去的包收不到任何回包现象命令正常执行显示发送了 N 个包但一个回包都没收到。原因三种可能——目标确实不可达本机防火墙拦截了回包网卡选错了。Windows 防火墙对原始套接字的回包有时会直接丢弃。解决先ping目标确认基础连通性。然后临时关闭 Windows 防火墙测试。最后确认-I指定的网卡 GUID 是当前活跃网卡多网卡机器上很容易选到虚拟网卡或已断开的网卡。4.4 伪造源 IP 后完全没响应现象用了-a指定伪造源 IP结果没有任何回包。原因回包会发到伪造的 IP 去你的机器根本收不到。这是原理决定的不是 bug。解决伪造源 IP 只适合做单向探测比如测试目标是否会对某个 IP 回应。想看回包就不要伪造源 IP。如果确实需要看回包用-a指定本机另一个网卡的 IP并在该网卡上抓包。4.5 在 Win10/Win11 上跑提示缺 msvcr100.dll现象换一台机器跑 hping.exe弹窗提示缺少msvcr100.dll或microsoft.vc80.mfc相关组件。原因Dev-C 默认链接的是 MinGW 运行时但如果你之前用 VS 编过一版产物会依赖 MSVC 运行时库。热词里出现的microsoft.vc80.mfc、publickeytoken这些就是典型的 VC 运行时清单信息。解决要么在目标机器装对应的 VC Redistributable要么用 Dev-C 重新编译一版静态链接的 exe。在 Dev-C 的Compiler Options→Settings→Code Generation里把Runtime library设为Static重新编译后 exe 体积会变大但不依赖外部 DLL。5. 进阶技巧把 hping.win32 嵌进批处理做半自动探测单次手工敲命令适合排查但如果你要批量测一组 IP 的多个端口手工敲就太慢了。我一般会写一个批处理脚本把 hping 包进去循环调用输出重定向到文件再用 findstr 过滤关键 flags。echo off set HPINGhping.exe set IFACE\Device\NPF_{你的网卡GUID} set OUTscan_result.txt echo scan start %OUT% for %%i in (192.168.1.1 192.168.1.2 192.168.1.10) do ( for %%p in (22 80 443 3389) do ( echo --- %%i : %%p --- %OUT% %HPING% -S -p %%p -c 2 -I %IFACE% %%i %OUT% 21 ) ) echo scan done %OUT% findstr /C:flagsSA %OUT%这段脚本的逻辑外层循环遍历 IP内层循环遍历端口每个组合发 2 个 SYN 包结果追加写入scan_result.txt。最后用findstr只挑出flagsSA的行也就是端口开放的目标。参数上-c 2是发两个包减少等待时间-I必须带引号因为网卡 GUID 里有花括号和连字符不加引号会被 cmd 解析成特殊字符。跑完之后findstr的输出就是一份开放的 IP:端口清单。我习惯再手工核对一遍因为有些设备会对所有端口回 SYN-ACK比如某些负载均衡的健康检查这种假阳性要靠看seq和ack是否连续来排除。还有一个技巧把-d参数和数据内容结合用来测试目标服务对特定 payload 的反应。比如某些老式服务对超过 512 字节的 UDP 包会崩溃或返回错误码你可以用-d 600发大包观察回包变化。但注意别对生产环境做这种测试容易触发 IDS 告警。从那以后我每次换机器跑 hping都强制先跑一遍hping -D确认网卡名再跑一个-c 1的单包测试确认链路通最后才上批量脚本。这个习惯帮我省了至少三次“以为工具坏了其实是网卡选错”的返工。希望帮到你。本文还有配套的精品资源点击获取
