简介:hping.win32 是面向网络技术人员的 Windows 版 hping 源码包,包含可执行文件与 Dev-C++ 工程,适合对 TCP/IP 协议栈、数据包构造与网络审计感兴趣的开发者。hping 是经典命令行工具,支持 TCP、UDP、ICMP 与 RAW-IP 协议,可完成防火墙测试、端口扫描、MTU 探测、路由跟踪、远程操作系统与运行时间探测、TCP/IP 堆栈审计等任务,是安全测试和网络诊断的实用武器。压缩包共 102 个文件,以 43 个 C 源码、43 个目标文件、11 个头文件为主体,另有 1 个 exe、1 个 Dev-C++ 工程文件及少量配置文件,整体约 255KB,小巧完整,便于在 Windows 环境下编译、修改与分析。通过阅读源码,可掌握 raw socket 构造、IP 分片与路由跟踪的实现思路,为二次开发或安全测试脚本编写提供参考。已有 2917 人学习下载,适合想深入理解协议栈底层实现或扩展 hping 功能的网络工程师、安全爱好者和学生。 hping 这个工具我用了好多年,从 Linux 到 Windows,踩过不少坑。有人一听 hping 就觉得是"黑客工具",其实真不是,它就是一枚非常趁手的网络测试锤子,尤其hping.win32这个版本,对于必须待在 Windows 环境里排查网络问题的人来说,绝对算得上刚需。这篇主要讲讲 hping.win32 到底能干什么、怎么装怎么用,以及我实测中遇到的那些文档里不会写的坑。干网络运维和做安全测试的朋友,这篇应该能帮你省下不少折腾时间。
1. 内容整体设计与思路拆解
1.1 为什么 Windows 上还需要 hping
很多人在 Windows 上排查网络,第一反应是ping、telnet、Test-NetConnection,但真到了要验证防火墙策略、测试 TCP 端口连通性、判断对方主机是否存活但禁 ping 的时候,这几个工具就露怯了。常规 ping 只能发 ICMP Echo,telnet只能测固定端口,而且行为特征明显,容易被安全设备拦。hping 的定位是"几乎可以构造任意 TCP/IP 报文",这意味着一台 Windows 机器也能像 Linux 一样拥有完整的自定义探测能力,不需要装 Wireshark 那类重型抓包工具去凑合。
我最初接触 hping.win32 是在一次需要验证机房防火墙入站规则的场景:对方只在防火墙上放行了特定源 IP 的 443 端口,其他端口一律丢弃。用自带的telnet ip 443能测通,但想批量验证 80、22、8080 就很不方便。hping 可以一条命令把这个列表全跑完,还能看出端口是开放、丢弃还是拒绝,这一点在生产环境排障时太关键了。
1.2 win32 版本的核心价值
hping.win32 实际上是 hping3 的 Windows 移植版。它的底层依赖于 WinPcap 驱动来发送原始报文,所以你会看到安装包里一般同时提供hping3.exe和依赖的 DLL 文件。相比 Linux 原版,win32 版本在功能上保留了绝大部分参数,只是某些依赖/dev/random或系统底层特性的高级功能会受限,但应付日常探测、MTU 发现、防火墙策略验证这些需求足够。
这个版本的设计思路很直接:把 Linux 上的网络测试能力平移到 Windows,让网络工程师不用为了跑一个工具去装 VM 或 WSL。实测下来它能在 Windows 7 到 Windows 11 上稳定运行,前提是你安装或者加载了合适的 WinPcap / Npcap 驱动。注意这里容易踩坑:Win10 之后 WinPcap 默认不再预装,需要手动安装 Npcap 并在安装时勾选"WinPcap API compatibility"。
2. 核心细节解析与实操要点
2.1 hping 三类典型用法开箱
hping.win32 最常用的是 TCP ping、SYN 探测和 UDP 探测。先说 TCP ping,它解决的是"主机明明活着,但 ICMP 被防火墙丢弃"的尴尬。命令是:
hping3 -S 192.168.1.10 -p 80 -c 3这里的-S表示发送 SYN 报文,-p 80指定目标端口,-c 3表示发送 3 个包。如果主机端口开放,你会收到SA(SYN-ACK)标志的回复。这个行为跟nc -vz ip port很像,但 hping 的优势在于你能精确控制发包速率、报文大小以及看到更详细的响应信息。
SYN 探测用于批量端口存活检测,平时我最常用的是这种组合:
hping3 -S 192.168.1.10 -p +20 -c 5-p +20表示以 20 为步长递增端口,一次命令就能探出 20、40、60、80、100 这几个端口的状态。配合-V详细输出,你能清楚看到每一步的响应情况。
UDP 探测则适合去发现某些设备开放的 UDP 服务,比如 DNS(53)、SNMP(161)。因为 UDP 无状态,一般用-2指定 UDP 模式,再配合-p指定端口:
hping3 -2 192.168.1.10 -p 53 -c 2如果目标 UDP 端口关闭,通常会收到 ICMP Port Unreachable 回显,hping 会把它解释为ICMP Port Unreachable,这样也能侧面判断主机是活的。
2.2 参数背后的实际含义
hping 里最绕人的参数是-A(ACK)、-S(SYN)、-F(FIN)这几个标志位。很多新手以为这些只是"设置标志位",但在真实场景里,防火墙和 IDS 对这些标志位的态度完全不同。比如用-A发 ACK 包去探测端口,由于 ACK 包不是新建连接的数据包,很多防火墙的 stateless 规则会直接放行,这就能用最小的代价探测目标是否存活。实际命令是:
hping3 -A 192.168.1.10 -p 80 -c 3如果收到R(RST)回复,说明主机在线且端口可达。这种探测方式的好处是更隐蔽,不容易触发基于连接状态的告警。但要注意,这也意味着它的行为在安全审计中看起来很可疑,所以务必只在有授权的网络环境里用。
还有一个容易被忽略但极其有用的参数是--traceroute。hping3 内置了 traceroute 模式,可以基于 TCP SYN 探查路由路径,这在分析跨运营商链路问题、确认中间设备有没有丢包时非常好用。用法:
hping3 --traceroute -S 8.8.8.8 -p 53 -c 1它的原理是逐跳递增 TTL,通过每个路由节点返回的 ICMP Time Exceeded 来看到达目标经过的每一跳。相比 Windows 自带的tracert -d,hping 的 traceroute 支持自定义端口和协议,在中间设备禁用 ICMP 的情况下仍然有很高成功率。
2.3 为什么是这些参数组合
选参数组合的核心逻辑是"匹配测试目标"。当年我帮朋友排查一个云服务器 SSH 登录不上的问题,对方安全组已经放行了 22 端口,但本地网络怎么都连不上。我从本地直接hping3 -S 服务器IP -p 22 -c 5,结果收到了SA响应,说明远端 22 端口是通的。问题就出在本地运营商对出方向 22 端口的 QoS 限制上,本质是出方向丢包。这个结论用ping根本得出来,只有 hping 这种能定制源端口、目标端口和报文内容的工具才能定位得这么精确。
如果你要模拟大包传输、测试链路 MTU,可以用-d指定数据段大小,例如:
hping3 -S 192.168.1.10 -p 80 -d 1400 -c 3指定 1400 字节数据段,加上 IP 头(20字节)和 TCP 头(20字节),报文总长就是 1440 字节,接近以太网 MTU 1500 的上限。此时如果中间网络设备对大包分片策略有问题,你会看到响应异常或直接收不到回复。这是检测 PMTU 黑洞的一个很实用的土办法。
3. 实操过程与核心环节实现
3.1 环境准备:WinPcap 与 Npcap 的取舍
hping.win32 在 Windows 上运行的前提是有一个可用的 packet capture 驱动。早期版本默认绑定 WinPcap 4.1.3,但在 Windows 10 之后这个驱动签名已经不被认可,容易加载失败。我在 Win10/11 上实测,推荐安装 Npcap 1.60 以上版本,并在安装向导里勾选"Support raw 802.11 traffic (and monitor mode)"以及"WinPcap API-compatible Mode"。第二个选项特别重要,hping.win32 是旧版 API,不完全兼容 Npcap 新的接口,不勾这个它可能死活找不到网卡。
安装完驱动后,把下载的 hping.win32 压缩包解压到某个无中文路径的目录(比如C:\tools\hping),里面应该至少有hping3.exe、hping.exe、若干 DLL 文件和一个docs文件夹。不要直接双击 exe,因为它需要管理员权限才能操作原始套接字,建议在开始菜单找到命令提示符,右键"以管理员身份运行",然后cd /d C:\tools\hping再执行命令。
3.2 首次发包链路自测
环境就绪后,我建议先拿本机网关做一个最简单的连通性测试,排除驱动和权限问题。命令:
hping3 -S 192.168.1.1 -p 443 -c 2这里的 192.168.1.1 是我的网关卡,你可以换成你自己的网关 IP。正常输出末尾会显示1 packets received或2 packets received,同时输出包含SA标志的响应行。如果输出显示0 packets received,则优先检查防火墙是否拦截了 hping 发送的原始报文,或者驱动是否真的加载成功。WinPcap 驱动未加载时,通常会报cannot open pcap device一类错误,这时重新跑一遍 Npcap 安装程序,确认勾选兼容模式,重启命令行即可。
3.3 场景化操作:批量端口摸底与防火墙验证
一次真实场景中,我需要确认公司办公出口 IP 到阿里云一台 CVM 的哪些端口是通的,以决定要不要调整内部系统对接的网络策略。传统做法是telnet一个个试,效率很低。我用 hping.win32 写了一个简单的批处理,一次性扫了 10 个常用端口:
for %p in (22 80 443 3306 6379 8080 9200 27017 1433 1521) do hping3 -S 目标IP -p %p -c 1 -W 500输出结果里带SA的就是开放端口,带RA(RST-ACK)的说明端口拒绝连接,超时无响应的则可能是被防火墙 drop 掉了。对比来看,22、80、443、8080 都返回了SA,3306 返回了RA,其余端口超时。这个结果让我很快判断出:安全组放行了 Web 相关端口,数据库端口做了限制,直接用程序连当然失败。耗时不到一分钟,比 telnet 配合批处理快一个数量级。
3.4 用 idle 扫描做轻量级探测(谨慎使用)
hping 有个不太常见的技能是 idle 扫描。它的原理是通过一个"僵尸主机"的 IPID 递增规律来判断目标端口状态,核心命令格式是:
hping3 -S -p 80 -i 1 目标IP --idle 僵尸IP正常环境下不建议乱用,因为它依赖的僵尸主机条件比较苛刻,而且行为模式容易被安全设备标记。我只有在做授权的内网安全评估时才会尝试。这个功能的真正价值在于验证自己的安全设备能不能检测到这种扫描手法,属于"防御验证"而非"攻击技巧"。
idle 扫描的优点是隐藏扫描者的真实 IP。这在做红队演练时有意义,但你要明确:这种技术在真实攻防中被判定为恶意行为的概率很高。如果不需要隐藏身份,常规 SYN 探测就完全够用,没必要给自己惹麻烦。
3.5 性能与稳定性实测
hping.win32 在 Windows 上跑高频率发包(比如-i u1000即每 1 毫秒一个包)时,稳定性还是不错的。但有两个前提:一是必须关闭 Windows 防火墙对 hping.exe 的拦截规则;二是不要同时开着 Wireshark 采集同一张网卡,因为 WinPcap/Npcap 对多进程同时捕获同一张网卡有锁限制,容易导致 hping 的发包时序漂移。实测连续跑 10 分钟高频发包,掉包率几乎为零,CPU 占用率在 3% 以下。
不过我也发现一个细节:如果目标网络对异常报文有丢包策略,高频 SYN 探测会导致响应大量丢失。这时候建议把发送速率调整到 100ms 一个包以上,例如-i u100000,否则你看到的现象会误导你判断目标是否存活。这是一个很反直觉的坑,很多人一上去就把速率拉满,结果得到一堆"假死"结论。
4. 常见问题与排查技巧实录
4.1 刚运行就提示打开设备失败
这个错误我见得最多,表现形式大概是Error opening device: \\.\...或者cannot open pcap device。原因九成是 Npcap 安装时没有勾选 WinPcap 兼容模式,或者 Npcap 服务没有启动。排查方式:打开服务管理器,确认npcap服务存在且正在运行;再跑一次 Npcap 安装程序,勾选兼容模式,重启。还有一种情况是网卡是无线网卡,Npcap 默认对无线网卡的抓包支持需要 WLAN API 权限,如果你用的是 Wi-Fi 连接,建议先把网卡切换到有线再测试。
4.2 命令执行报"系统找不到指定的文件"
这不是 hping 本身的问题,而是 Windows 的findstr或命令解释器把>、<这类符号当成了重定向符。比如你写hping3 -S 1.2.3.4 -p 80 > result.txt是可以的,但如果你不小心把命令写成了hping3 -S 目标IP -p >80,Windows 就会去读取80这个文件,报错就是"系统找不到指定的文件"。实际上-p是端口参数,端口号必须紧跟在-p后面且不带空格。这个坑跟 Linux shell 里的习惯差异有关,Linux 下面很多人习惯-p 80写成-p80,但在 cmd 里-p80会被当成一个独立参数,导致解析失败。
4.3 输出乱码或没有响应输出
这个问题一般发生在 Windows 命令行代码页不兼容的情况下。hping.win32 的输出是英文加 ANSI 转义序列,如果控制台默认代码页是 936(GBK),高级 ANSI 颜色控制序列可能会显示为乱码。解决办法是执行chcp 437切换代码页为美国英语,再运行 hping3。另一个小坑是-V详细模式输出量特别大,配合管道| findstr过滤时,要注意 cmd 的管道缓冲区溢出,可能导致输出被截断。实测中我一般把输出重定向到文件再过滤,比如:
hping3 -S 192.168.1.10 -p 1-1000 -c 1 > result.txt 2>&14.4 每次扫描的源端口不固定导致白名单失效
hping 默认的源端口是随机的,这会导致源 IP 端口白名单的防火墙策略访问失败。想要固定源端口,可以在命令里加-s参数,比如-s 12345,这样报文源端口就会固定在 12345。实测在验证一些对源端口有严格要求的安全设备时,这个参数特别有用。但要注意,源端口不能被本机已经占用的端口冲突,否则内核会重置连接。
4.5 hping3.exe 双击没反应
win32 版本的 hping 是控制台程序,不是 GUI 程序,双击只会一闪而过。正确姿势是打开 cmd 或 PowerShell,切到 hping 目录后再运行。如果是从 PowerShell 运行,它默认的执行策略可能阻止直接运行 exe,需要用.\hping3.exe显式指定当前目录路径,或者先Set-ExecutionPolicy Bypass -Scope Process。还有一个细节:运行 hping3 必须管理员权限,PowerShell 如果没有以管理员身份启动,会导致 WinPcap 打开设备失败。
4.6 结合热词延伸:Win32 平台网络开发的常见崩溃
在测试 hping.win32 时,我顺便被 Windows 平台自身的稳定性坑过几回。比如系统在某些网卡驱动的 PnP 事件中弹出directory picker failed: win32 folder dialog worker之类的错误,这其实不是 hping 的问题,而是 Win32 对话框进程在调用文件选择器时崩溃,一般通过重启资源管理器即可恢复。另一个常见崩溃是explore.exe触发了 unhandled win32 exception,多半是资源管理器插件或缩略图缓存损坏导致。遇到这类情况,建议先跑一遍sfc /scannow检查系统文件,再考虑重装网卡驱动,免得干扰网络测试的结论。
如果你在 Win32 平台上自己写程序调用 TCP Client 做端口探测,有几个坑不得不提:Windows 的 Winsock 在初始化时要求WSAStartup正确配对WSACleanup,否则句柄泄漏到一定数量会直接导致连接失败;每次新建 Socket 时设置的 timeout 必须生效后再调用 connect,否则默认超时长达 20 秒,排障时很像"目标端口不通"。我测试过一个自制的小工具,就是因为忘记设置非阻塞模式下的 connect 超时,导致对已关闭端口误判为"超时未响应"。hping.win32 本身没有这个问题,但它依赖的 WinPcap 底层驱动,在某些网卡(尤其是 USB 无线网卡)上会随机丢包,结果就是同一条命令多跑几次,响应结果不一致。此时建议先driverquery看网卡驱动版本,再换有线网卡对比测试,别急着怀疑工具本身。
5. 安全边界与合法使用说明
这一点有必要单独说清楚。hping 的能力很强,它可以构造 SYN Flood 报文、进行端口扫描、模拟畸形包,这些操作在未经授权的情况下使用,在几乎所有地区都属于违规行为。我在这篇里讲的所有用法,前提都是"你拥有该网络环境的管理权限,且获得了明确的测试授权"。
无论是排查自己公司的网络、验证自家云服务器安全组策略,还是做内部攻防演练,都必须在合规的范围内进行。不要拿 hping 去测试任何不属于你的网络,否则带来的风险完全是自找的。
6. 经验速查表
| 场景 | 推荐命令 | 期望结果 |
|---|---|---|
| TCP 端口连通性测试 | hping3 -S 目标IP -p 80 -c 3 | SA响应 |
| 批量端口扫描 | hping3 -S 目标IP -p +20 -c 5 | 端口状态列表 |
| 隐蔽探测主机存活 | hping3 -A 目标IP -p 80 -c 3 | R响应 |
| UDP 服务探测 | hping3 -2 目标IP -p 53 -c 3 | 响应或 ICMP unreachable |
| 路由路径跟踪 | hping3 --traceroute -S 目标IP -p 80 -c 1 | 逐跳路径 |
| 大包链路测试 | hping3 -S 目标IP -p 80 -d 1400 -c 3 | 响应时间及丢包率 |
这张表基本覆盖了我日常 90% 的需求,剩下的就是按需加-V查看细节,或者加-W调整超时时间。hping.win32 虽老,但胜在轻量和直接,没有现代工具那些花里胡哨的依赖。如果你跟我一样常年被 Windows 困住手脚,这枚锤子值得你留在工具箱里。
本文还有配套的精品资源,点击获取