ByteBunny777/Netprobe
GitHub: ByteBunny777/Netprobe
一个零依赖的纯 C 多线程 TCP 端口扫描器,适用于快速发现目标主机的开放端口与服务 Banner。
Stars: 6 | Forks: 0
# NETprobe
[](https://en.wikipedia.org/wiki/C11_(C_standard_revision))
[](#build)
[](#why)
[](#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
标签:客户端加密