Files
fscan/tools/perftest/run_param_test.ps1
ZacharyZcR 71b92d4408 feat: v2.1.0 核心重构与功能增强
## 架构重构
- 全局变量消除,迁移至 Config/State 对象
- SMB 插件融合(smb/smb2/smbghost/smbinfo)
- 服务探测重构,实现 Nmap 风格 fallback 机制
- 输出系统重构,TXT 实时刷盘 + 双写机制
- i18n 框架升级至 go-i18n

## 性能优化
- 正则表达式预编译
- 内存优化 map[string]struct{}
- 并发指纹匹配
- SOCKS5 连接复用
- 滑动窗口调度 + 自适应线程池

## 新功能
- Web 管理界面
- 多格式 POC 适配(xray/afrog)
- 增强指纹库(3139条)
- Favicon hash 指纹识别
- 插件选择性编译(Build Tags)
- fscan-lab 靶场环境
- 默认端口扩展(62→133)

## 构建系统
- 添加 no_local tag 支持排除本地插件
- 多版本构建:fscan/fscan-nolocal/fscan-web
- CI 添加 snapshot 模式支持仅测试构建

## Bug 修复
- 修复 120+ 个问题,包括 RDP panic、批量扫描漏报、
  JSON 输出格式、Redis 检测、Context 超时等

## 测试增强
- 单元测试覆盖率 74-100%
- 并发安全测试
- 集成测试(Web/端口/服务/SSH/ICMP)
2026-01-11 20:16:23 +08:00

97 lines
3.5 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# fscan 参数性能测试脚本
# 测试 -time 和 -mt 参数对性能的影响
param(
[Parameter(Mandatory=$true)]
[string]$Target,
[string]$Ports = "22,80,443,3389,8080",
[int]$Threads = 600,
[string]$OutputDir = "results/param_tests"
)
$fscanPath = Join-Path $PSScriptRoot "..\..\fscan.exe"
if (-not (Test-Path $fscanPath)) {
$fscanPath = "fscan.exe"
}
# 创建输出目录
$fullOutputDir = Join-Path $PSScriptRoot $OutputDir
New-Item -ItemType Directory -Force -Path $fullOutputDir | Out-Null
Write-Host "=== fscan 参数性能测试 ===" -ForegroundColor Cyan
Write-Host "目标: $Target"
Write-Host "端口: $Ports"
Write-Host "基准线程: $Threads"
Write-Host ""
# ==================== 测试1: -time 超时参数 ====================
Write-Host ">>> 测试1: -time 超时参数 <<<" -ForegroundColor Yellow
$timeValues = @(1, 2, 3, 5)
$timeResults = @()
foreach ($t in $timeValues) {
Write-Host "[time=$t] " -NoNewline
$output = & $fscanPath -h $Target -p $Ports -t $Threads -time $t -np -nopoc -perf -no 2>&1 | Out-String
if ($output -match '\[PERF_STATS_JSON\](.*?)\[/PERF_STATS_JSON\]') {
$stats = $Matches[1] | ConvertFrom-Json
$timeResults += [PSCustomObject]@{
time_seconds = $t
duration_ms = $stats.scan_duration_ms
packets_per_sec = [math]::Round($stats.packets_per_second, 2)
tcp_success = $stats.tcp_success
tcp_failed = $stats.tcp_failed
success_rate = [math]::Round($stats.success_rate, 2)
}
Write-Host "耗时: $([math]::Round($stats.scan_duration_ms/1000, 2))s, $([math]::Round($stats.packets_per_second, 1)) pps, 成功率: $([math]::Round($stats.success_rate, 1))%" -ForegroundColor Green
} else {
Write-Host "解析失败" -ForegroundColor Red
}
}
$timeResults | Export-Csv -Path (Join-Path $fullOutputDir "time_results.csv") -NoTypeInformation
Write-Host ""
# ==================== 测试2: -mt 模块线程参数 ====================
Write-Host ">>> 测试2: -mt 模块线程参数 <<<" -ForegroundColor Yellow
$mtValues = @(5, 10, 20, 50, 100)
$mtResults = @()
foreach ($mt in $mtValues) {
Write-Host "[mt=$mt] " -NoNewline
# 注意: -mt 主要影响服务识别和POC这里不用 -nopoc 来观察效果
$output = & $fscanPath -h $Target -p $Ports -t $Threads -mt $mt -np -nopoc -perf -no 2>&1 | Out-String
if ($output -match '\[PERF_STATS_JSON\](.*?)\[/PERF_STATS_JSON\]') {
$stats = $Matches[1] | ConvertFrom-Json
$mtResults += [PSCustomObject]@{
module_threads = $mt
duration_ms = $stats.scan_duration_ms
packets_per_sec = [math]::Round($stats.packets_per_second, 2)
tcp_success = $stats.tcp_success
tcp_failed = $stats.tcp_failed
success_rate = [math]::Round($stats.success_rate, 2)
}
Write-Host "耗时: $([math]::Round($stats.scan_duration_ms/1000, 2))s, $([math]::Round($stats.packets_per_second, 1)) pps" -ForegroundColor Green
} else {
Write-Host "解析失败" -ForegroundColor Red
}
}
$mtResults | Export-Csv -Path (Join-Path $fullOutputDir "mt_results.csv") -NoTypeInformation
Write-Host ""
Write-Host "=== 测试完成 ===" -ForegroundColor Cyan
Write-Host "结果保存到: $fullOutputDir" -ForegroundColor Yellow
# 打印汇总
Write-Host ""
Write-Host ">>> -time 测试结果 <<<" -ForegroundColor Cyan
$timeResults | Format-Table -AutoSize
Write-Host ">>> -mt 测试结果 <<<" -ForegroundColor Cyan
$mtResults | Format-Table -AutoSize