torjaeger1709/cpp-port-scanner
GitHub: torjaeger1709/cpp-port-scanner
基于 C++17 和 Dear ImGui 的高性能多线程 TCP/IP 端口扫描器,支持多种隐蔽扫描技术与桌面端可视化操作。
Stars: 0 | Forks: 0
# C++ 模块化端口扫描器与 Dear ImGui 桌面端
现代化的 **C++17** 网络端口扫描器,具备可重用的扫描引擎、多线程架构、原始 socket 扫描技术以及 Dear ImGui 桌面端界面。
## 桌面端预览

# 功能
* 跨平台 CLI 扫描器(Windows 和 Linux)
* 原生 Dear ImGui 桌面端应用程序
* 模块化 MVC 架构
* 多线程扫描引擎
* 可重用的线程池
* TCP Connect 扫描
* SYN / FIN / NULL / XMAS 原始扫描
* 协议感知的 banner grabbing
* CIDR 子网扫描
* JSON / CSV / XML 报告导出
* 优雅的扫描取消机制
* WSAPoll / poll 异步 I/O 多路复用
# 项目架构
该项目构建了两个共享同一扫描引擎的可执行文件。
```
graph TD
CLI["port_scanner (CLI)"] --> Engine
GUI["port_scanner_gui"] --> Controller
Controller --> Engine
Engine --> ThreadPool
ThreadPool --> Network["Sockets / WSAPoll / poll"]
```
## MVC 设计
### Model
负责:
* TCP/UDP 扫描
* 原始 socket 数据包构造
* Banner grabbing
* 导出 pipeline
* 线程池调度
位置:
```
src/scanner_engine.cpp
```
### Controller
负责:
* 启动扫描 worker
* 进度更新
* 扫描取消
* 线程同步
位置:
```
src/scan_controller.cpp
```
### View
负责:
* Dear ImGui 渲染
* 交互式扫描配置
* 实时控制台
* 结果表格
* 响应式布局
位置:
```
src/gui_view.cpp
```
# 支持的功能
| 功能 | CLI | GUI |
| ---------------- | --- | --- |
| Windows | ✅ | ✅ |
| Linux | ✅ | ❌ |
| TCP Connect 扫描 | ✅ | ✅ |
| SYN 扫描 | ✅ | ✅ |
| FIN 扫描 | ✅ | ✅ |
| NULL 扫描 | ✅ | ✅ |
| XMAS 扫描 | ✅ | ✅ |
| Banner grabbing | ✅ | ✅ |
| CIDR 扫描 | ✅ | ✅ |
| JSON 导出 | ✅ | ✅ |
| CSV 导出 | ✅ | ✅ |
| XML 导出 | ✅ | ✅ |
# 工程说明
### 响应式桌面端 UI
扫描完全在后台 worker 线程上执行,确保 GUI 在长时间的扫描过程中保持响应。
### 高效同步
扫描引擎通过将 atomic counters 与预分配的扫描结果存储相结合,最大限度地减少了 mutex 争用。
### 优雅关闭
在活动扫描期间关闭应用程序会发送取消信号,等待 worker 线程完成,并安全释放资源。
### 跨平台网络
网络通过公共接口进行抽象,在 Windows 上使用 Winsock,在 Linux 上使用 POSIX socket。
# 构建
## Windows
环境要求
* Visual Studio 2019 或更高版本
* 使用 C++ 的桌面开发
* CMake
```
cmake -B build -S .
cmake --build build --config Release
```
生成的二进制文件
```
build/
├── port_scanner.exe
└── port_scanner_gui.exe
```
## Linux
安装依赖
```
sudo apt update
sudo apt install build-essential cmake git
```
构建
```
cmake -B build -S .
cmake --build build -j$(nproc)
```
生成的二进制文件
```
./build/port_scanner
```
# 使用方法
## 启动 GUI
```
.\build\port_scanner_gui.exe
```
步骤
1. 输入 IP 地址、主机名或 CIDR 范围。
2. 指定目标端口。
3. 选择扫描方法。
4. 配置线程数。
5. 开始扫描。
## CLI 示例
TCP Connect 扫描
```
./build/port_scanner \
-t scanme.nmap.org \
-p 22,80,443 \
-o result.json
```
子网扫描
```
./build/port_scanner \
-t 192.168.1.0/24 \
-p 80 \
--threads 200 \
--timeout 500
```
Linux SYN 扫描
```
sudo ./build/port_scanner \
-t 10.0.0.1 \
-p 1-1024 \
-sS \
-o report.csv
```
# 项目结构
```
.
├── assets/
├── include/
├── src/
│ ├── scanner_engine.cpp
│ ├── scan_controller.cpp
│ ├── gui_view.cpp
│ └── ...
├── third_party/
├── CMakeLists.txt
└── README.md
```
# 技术限制
## Windows 原始 socket 限制
Windows 限制通过原始 socket 发送自定义 TCP 数据包。真正的 SYN/FIN/NULL/XMAS 扫描需要 Npcap。否则,扫描器将自动回退到 TCP Connect 模式。
## RFC 793 兼容性
FIN、NULL 和 XMAS 扫描依赖于 RFC 793 行为。某些操作系统(尤其是 Windows)并未完全实现此行为,从而降低了这些扫描技术的可靠性。
# 许可证
本项目基于 MIT 许可证授权。
# 作者
**Khiem Nguyen**
标签:Bash脚本, C++17, Dear ImGui, GUI桌面应用, HTTP头分析, Raw Socket, 云存储安全, 插件系统, 数据统计, 端口扫描, 网络扫描