shreethaar/OpenIPRadar
GitHub: shreethaar/OpenIPRadar
一款 Windows 批量 IP 信誉分析桌面工具,聚合多个威胁情报源并以颜色编码报告呈现,支持一键导出。
Stars: 0 | Forks: 0
# OpenIPRadar
一款用于批量 IP 信誉分析的 Windows 桌面应用程序。粘贴 IP 列表或加载文件,选择您的威胁情报提供商,即可在几秒钟内获得带有颜色编码的风险报告 —— 支持一键导出为 HTML 或 PDF。
## 功能
- **批量输入** —— 直接粘贴 IP,或加载 `.txt` 或 `.csv` 文件
- 支持 **IPv4 和 IPv6**,自动提取并去重
- **三大威胁情报提供商** —— AbuseIPDB、VirusTotal、Shodan
- **15 列结果表格** —— IP、国家、ASN、ISP、主机名、 Abuse Confidence、报告数、最后报告时间、VT 信誉、VT 恶意、VT 可疑、开放端口、操作系统、标签、威胁评分
- **颜色编码的风险级别** —— 恶意(红色)、可疑(黄色)、干净(绿色)
- **导出**至 HTML(独立文件)或 PDF(通过 QuestPDF 生成 A4 横向版面)
- **安全的密钥存储** —— API 密钥使用 Windows DPAPI 加密,绝不以明文写入
- **速率限制** —— 按提供商进行请求限流(遵守 VirusTotal 免费版每分钟 4 次请求的限制)
- **可取消的扫描**,带有实时进度条
- **全异步** —— UI 线程永不会被阻塞
## 截图
## 环境要求
- Windows 10 或更高版本 (x64)
- [.NET 10 Desktop Runtime](https://dotnet.microsoft.com/download/dotnet/10.0)(如果是从源码构建,则需要 SDK)
- 您想使用的任何提供商的 API 密钥(每个单独的密钥都是可选的)
## 快速开始
### 从源码构建
```
git clone https://github.com/shreethaar/OpenIPRadar.git
cd OpenIPRadar/OpenIPRadar
dotnet restore
dotnet run
```
### 发布独立可执行文件
```
dotnet publish -c Release -r win-x64 --self-contained
```
`.exe` 及所有依赖项将位于 `bin\Release\net10.0-windows\win-x64\publish\` 中。
## API 密钥
启动后转到 **Settings**(设置)选项卡。粘贴每个提供商的密钥并点击 **Save**(保存)—— 密钥将立即使用 DPAPI 加密并存储在 `%AppData%\OpenIPRadar\keys.dat` 中。密钥绝不会以明文形式写入磁盘,也不会出现在日志中。
| 提供商 | 获取密钥的地址 | 免费额度 |
|---|---|---|
| AbuseIPDB | [abuseipdb.com/api](https://www.abuseipdb.com/api) | 每天 1,000 次查询 |
| VirusTotal | [virustotal.com/gui/join-us](https://www.virustotal.com/gui/join-us) | 每分钟 4 次请求 |
| Shodan | [account.shodan.io](https://account.shodan.io/) | 有限(查询积分) |
您只需提供想要使用的提供商的密钥。没有提供密钥的提供商将自动被排除在扫描之外。
## 用法
1. 将 IP **粘贴**到输入框中,或点击 **Load File**(加载文件)打开 `.txt` 或 `.csv`
2. 点击 **Extract IPs**(提取 IP)—— 系统将移除重复项并显示总数
3. 使用复选框选择要查询的提供商(只有已配置的提供商可供选择)
4. 点击 **Scan**(扫描)—— 每个 IP 完成后,结果会立即显示在表格中
5. 点击 **Export HTML**(导出 HTML)或 **Export PDF**(导出 PDF)以保存报告
## 威胁评分的工作原理
评分 (0–100) 是各个提供商中最强的信号:
- **AbuseIPDB** —— 直接使用 abuse confidence 评分
- **VirusTotal** —— `malicious × 12 + suspicious × 4`,最大限制为 100
| 评分 | 风险等级 |
|---|---|
| ≥ 70 | 恶意 |
| ≥ 30 | 可疑 |
| < 30 | 干净 |
| 无数据 | 未知 |
## 项目结构
```
OpenIPRadar/
├── Core/
│ ├── Abstractions/ 12 interfaces (IThreatProvider, IScanOrchestrator, …)
│ ├── Configuration/ AppSettings model
│ ├── Enums/ IpVersion, RiskLevel, ProviderResultStatus, ReportFormat
│ ├── Exceptions/ ProviderException, RateLimitExceededException, ApiAuthenticationException
│ └── Models/ IpAddressEntry, ProviderResult, ThreatReport, ScanReportModel, …
├── Services/
│ ├── Configuration/ ConfigurationService (appsettings.json + user overrides)
│ ├── Http/ SharedHttpClient, RetryPolicy
│ ├── Input/ IpExtractor (GeneratedRegex + IPAddress.TryParse), InputFileReader
│ ├── Logging/ FileAppLogger (Channel-backed async writer, daily rotation)
│ ├── RateLimiting/ TokenBucketRateLimiter (per-provider SemaphoreSlim + interval)
│ ├── Reporting/ HtmlReportExporter, PdfReportExporter, ReportModelBuilder
│ ├── Scanning/ ScanOrchestrator (Parallel.ForEachAsync + Task.WhenAll), RiskAggregator
│ └── Security/ DpapiKeyStore (crypt32.dll P/Invoke — no NuGet)
├── Providers/
│ ├── ProviderBase.cs Rate-limit + retry + error-mapping choke point
│ ├── AbuseIpDb/
│ ├── VirusTotal/
│ └── Shodan/
├── Presentation/
│ ├── Converters/ RiskLevelToBrushConverter, NullableToNaConverter
│ ├── Mvvm/ ObservableObject, RelayCommand, AsyncRelayCommand (hand-rolled)
│ ├── Services/ DialogService
│ └── ViewModels/ MainViewModel, SettingsViewModel, ProviderKeyViewModel, ProviderToggleViewModel
├── CompositionRoot.cs Manual DI — wires the entire graph at startup
├── App.xaml / App.xaml.cs
├── MainWindow.xaml / .cs
└── appsettings.json Provider endpoints, rate limits, scan settings, log directory
```
## 配置
`appsettings.json` 控制提供商的 endpoint、并发、超时和重试行为。您可以通过创建 `%AppData%\OpenIPRadar\settings.json` 并仅包含您想要更改的键来覆盖任何值 —— 覆盖配置将在启动时合并。
```
{
"Scanning": {
"MaxConcurrency": 4,
"HttpTimeoutSeconds": 30,
"RetryCount": 3,
"RetryBaseDelayMs": 500
},
"Providers": {
"AbuseIPDB": { "RequestsPerMinute": 60 },
"VirusTotal": { "RequestsPerMinute": 4 },
"Shodan": { "RequestsPerMinute": 60 }
}
}
```
## 日志
日志异步写入 `%AppData%\OpenIPRadar\logs\log-yyyyMMdd.txt`。提供商错误以 `Warning` 或 `Error` 级别记录。API 密钥绝不会包含在日志输出中。
## 设计决策
- **零 NuGet 依赖**,除了 QuestPDF(仅用于 PDF 导出,通过 `IReportExporter` 隔离)
- **通过直接 P/Invoke 使用 DPAPI** —— 避免使用 `System.Security.Cryptography.ProtectedData` NuGet 包,同时确保密钥存储安全
- **在 `SocketsHttpHandler` 上使用单一共享 `HttpClient`** 并设置 `PooledConnectionLifetime = 5 min` —— 避免 socket 耗尽和 DNS 过期问题
- **纯手写的 MVVM 和 DI** —— 没有使用任何第三方 MVVM 工具包或 IoC 容器
- **提供商隔离** —— 失败的提供商会返回失败的 `ProviderResult`;绝不会向协调器抛出异常或导致扫描崩溃
## 添加提供商
1. 在 `Providers/YourProvider/` 中创建一个继承自 `ProviderBase` 的类
2. 实现 `BuildCheckRequest`、`BuildConnectivityRequest` 和 `ParseResponse`
3. 将该提供商的设置添加到 `appsettings.json`
4. 在 `CompositionRoot.cs` 中注册它
标签:GitHub, IP 信誉分析, Windows 桌面应用, WPF, 威胁情报, 实时处理, 开发者工具, 网络空间安全