ByteBunny777/Netprobe

GitHub: ByteBunny777/Netprobe

一个零依赖的纯 C 多线程 TCP 端口扫描器,适用于快速发现目标主机的开放端口与服务 Banner。

Stars: 6 | Forks: 0

# NETprobe [![C](https://img.shields.io/badge/C-11-00599C?logo=c)](https://en.wikipedia.org/wiki/C11_(C_standard_revision)) [![平台](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20WSL-lightgrey)](#build) [![依赖项](https://img.shields.io/badge/dependencies-none-brightgreen)](#why) [![许可证: MIT](https://img.shields.io/badge/license-MIT-blue)](#license) 一个用纯 C 编写的、无依赖的多线程 TCP 端口扫描器 (POSIX sockets + pthreads)。不需要 libpcap,不需要 OpenSSL,也不需要任何外部库 — 只需要 `gcc` 和一个 Makefile。 ``` $ ./netprobe -H 192.168.1.1 -p 1-1024 -t 100 netprobe: scanning 192.168.1.1 (1024 ports, 100 threads) -- only scan authorized targets PORT STATE SERVICE BANNER 22 open ssh SSH-2.0-OpenSSH_9.6p1 80 open http 443 open https netprobe: done in 1.8s -- 3/1024 ports open ``` ## 为什么选择它 网上流传的大多数“C 语言端口扫描器”示例,要么是 单线程的玩具代码,要么是对 nmap 的简单封装。`netprobe` 是一个小巧、 易读且真正实现了多线程的工具,你可以轻松将其加入家庭 实验室或小型运维工具包中,只需二十分钟就能从头到尾读完它的代码。 ## 功能 - **多线程 TCP connect 扫描**,具有可配置的线程池 - **带超时的非阻塞 connect**(通过 `poll` 实现),因此单个 被过滤/丢弃的端口不会阻塞整个扫描过程 - **尽力而为的 Banner grabbing** — 读取服务最先发送的数据, 如果服务保持沉默,则对常见的类 HTTP 端口发送最小的 `HEAD` 请求进行试探 - **灵活的端口规范**:`22`、`1-1024`、`20-25,80,443,8000-8100` - 为常见端口(ssh、http、mysql、redis、 rdp、mongodb、kubernetes-api 等)提供**已知服务名称查询** - **输出格式**:文本(表格)、CSV、JSON - 零外部依赖 — 仅需要 libc 和 pthreads ## 构建 ``` make # builds ./netprobe make test # runs the unit tests for port-list parsing make clean ``` 需要 POSIX 系统(Linux、macOS、WSL)和 C11 编译器。 ## 用法 ``` netprobe -H -p [options] Required: -H, --host Target hostname or IP address -p, --ports e.g. "22,80,443" or "1-1024" or "20-25,80,8000-8100" Options: -t, --threads Worker threads (default: 50) -w, --timeout Connect timeout in ms (default: 800) -b, --banner-timeout Banner read timeout in ms (default: 500) -n, --no-banner Skip banner grabbing (faster, connect-only) -a, --all Also print closed/filtered ports -o, --output text | csv | json (default: text) -h, --help Show help ``` ### 示例 ``` # 快速扫描本机的常见端口 ./netprobe -H 127.0.0.1 -p 20-25,80,443,3306,5432,6379,8080 # 全面扫描你所管理的家庭路由器,增加 threads 以提升速度 ./netprobe -H 192.168.1.1 -p 1-65535 -t 300 -o json > scan.json # 快速的 connect-only 扫描(不进行 banner grabbing),用于快速检查“哪些端口是开放的” ./netprobe -H 10.0.0.5 -p 1-1024 -n ``` ## 工作原理 每个工作线程都会从一个受 mutex 保护的共享 计数器中获取下一个待扫描端口,并执行非阻塞的 `connect()`,通过 `poll()` 等待直到 达到配置的超时时间。如果连接成功,该端口将被标记为 open, 并且(除非设置了 `-n`)线程会尝试执行一次简短的 `recv()` 来捕获 服务提供的任何 banner,对于那些在收到请求前保持沉默的常见类 HTTP 端口, 会发送一个简单的 `HEAD / HTTP/1.0` 请求进行试探。 这是一种 **TCP connect 扫描**(类似于 `nmap -sT`),而不是基于 raw socket 的 SYN 扫描 — 它不需要 root 权限,更适合从 普通用户账户运行,但代价是它在日志中 比隐蔽扫描稍微明显一些。 ## 项目结构 ``` src/ main.c CLI argument parsing and orchestration scanner.c/h connect + banner-grab logic, thread pool portlist.c/h port-spec parsing, known-service name table output.c/h text / CSV / JSON formatting tests/ test_portlist.c unit tests for port-spec parsing ``` ## 测试环境 使用 `-Wall -Wextra -std=c11` 编译,零警告。使用 `valgrind --leak-check=full` 检查了内存泄漏(结果干净)。 ## 许可证 MIT
标签:客户端加密