简介: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只会 ICMP,telnet只能连端口,Test-NetConnection又封得死死的,想改个标志位、指定源端口、控制 TTL,全都没戏。hping.win32就是来解决这个问题的——它是经典 hping 工具在 Windows 平台上的移植版本,能让你在 Windows 命令行里手工构造 TCP/UDP/ICMP 报文,指定目标端口、源端口、TCP 标志位、TTL、数据长度,甚至做端口扫描和防火墙规则探测。适合谁?做渗透测试前期信息收集的、排查防火墙 ACL 到底拦在哪一跳的、学 TCP/IP 协议想亲手发包看回包的。它不依赖 WinPcap 之外的运行时,编译产物是原生 exe,扔到目标机器上就能跑。下面我从源码结构、编译链路、参数用法到踩坑,把这份资源拆开讲清楚。
2. 源码结构与编译链路:从 Dev-C++ 到可执行 exe
2.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-C++(MinGW 工具链)而不是 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 |
-t | TTL 值 | 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 个包后停止。如果回包显示flags=SA(SYN-ACK),说明端口开放且防火墙放行;如果显示flags=RA(RST-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是 SYN,A是 ACK,R是 RST,F是 FIN,P是 PSH,.表示该位为 0。常见组合:SA表示端口开放,RA表示端口关闭,R单独出现表示目标不可达或协议栈拒绝。如果看到flags=..全零,说明收到的是异常包,可能是中间设备伪造的。
seq=和ack=字段用来核对序列号是否符合预期。如果回包的 ack 不等于你发出的 seq+1,说明有中间人或者 NAT 改写了包。ttl=字段能反推对端操作系统,Windows 默认 128,Linux 默认 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\Lib,Parameters→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 HPING=hping.exe set IFACE=\Device\NPF_{你的网卡GUID} set OUT=scan_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% 2>&1 ) ) echo === scan done === >> %OUT% findstr /C:"flags=SA" %OUT%这段脚本的逻辑:外层循环遍历 IP,内层循环遍历端口,每个组合发 2 个 SYN 包,结果追加写入scan_result.txt。最后用findstr只挑出flags=SA的行,也就是端口开放的目标。参数上-c 2是发两个包,减少等待时间;-I必须带引号,因为网卡 GUID 里有花括号和连字符,不加引号会被 cmd 解析成特殊字符。
跑完之后,findstr的输出就是一份开放的 IP:端口清单。我习惯再手工核对一遍,因为有些设备会对所有端口回 SYN-ACK(比如某些负载均衡的健康检查),这种假阳性要靠看seq和ack是否连续来排除。
还有一个技巧:把-d参数和数据内容结合,用来测试目标服务对特定 payload 的反应。比如某些老式服务对超过 512 字节的 UDP 包会崩溃或返回错误码,你可以用-d 600发大包观察回包变化。但注意别对生产环境做这种测试,容易触发 IDS 告警。
从那以后我每次换机器跑 hping,都强制先跑一遍hping -D确认网卡名,再跑一个-c 1的单包测试确认链路通,最后才上批量脚本。这个习惯帮我省了至少三次“以为工具坏了其实是网卡选错”的返工。希望帮到你。
本文还有配套的精品资源,点击获取