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, 威胁情报, 实时处理, 开发者工具, 网络空间安全