diff --git a/Common/ConcurrencyMonitor.go b/Common/ConcurrencyMonitor.go index 539655c..8a88a0d 100644 --- a/Common/ConcurrencyMonitor.go +++ b/Common/ConcurrencyMonitor.go @@ -99,28 +99,7 @@ func (m *ConcurrencyMonitor) FinishConnection(pluginName, target string) { } } -// GetConnectionStats 获取所有插件连接统计 -func (m *ConcurrencyMonitor) GetConnectionStats() map[string]*PluginConnectionInfo { - stats := make(map[string]*PluginConnectionInfo) - - m.pluginConnections.Range(func(key, value interface{}) bool { - keyStr := key.(string) - info := value.(*PluginConnectionInfo) - - // 只返回当前活跃的连接 - if atomic.LoadInt64(&info.ActiveConnections) > 0 { - stats[keyStr] = &PluginConnectionInfo{ - PluginName: info.PluginName, - Target: info.Target, - ActiveConnections: atomic.LoadInt64(&info.ActiveConnections), - TotalConnections: atomic.LoadInt64(&info.TotalConnections), - } - } - return true - }) - - return stats -} +// 已移除未使用的 GetConnectionStats 方法 // GetTotalActiveConnections 获取总活跃连接数 func (m *ConcurrencyMonitor) GetTotalActiveConnections() int64 { @@ -135,16 +114,7 @@ func (m *ConcurrencyMonitor) GetTotalActiveConnections() int64 { return total } -// Reset 重置监控器 -func (m *ConcurrencyMonitor) Reset() { - atomic.StoreInt64(&m.activePluginTasks, 0) - atomic.StoreInt64(&m.totalPluginTasks, 0) - - m.pluginConnections.Range(func(key, value interface{}) bool { - m.pluginConnections.Delete(key) - return true - }) -} +// 已移除未使用的 Reset 方法 // GetConcurrencyStatus 获取并发状态字符串 func (m *ConcurrencyMonitor) GetConcurrencyStatus() string { @@ -164,28 +134,4 @@ func (m *ConcurrencyMonitor) GetConcurrencyStatus() string { i18n.GetText("concurrency_connection"), totalConnections) } -// GetDetailedStatus 获取详细的并发状态 -func (m *ConcurrencyMonitor) GetDetailedStatus() string { - activePlugins, _ := m.GetPluginTaskStats() - connectionStats := m.GetConnectionStats() - - if activePlugins == 0 && len(connectionStats) == 0 { - return i18n.GetText("concurrency_no_active_tasks") - } - - status := fmt.Sprintf("%s: %d", i18n.GetText("concurrency_plugin_tasks"), activePlugins) - - if len(connectionStats) > 0 { - status += " | " + i18n.GetText("concurrency_connection_details") + ": " - first := true - for _, info := range connectionStats { - if !first { - status += ", " - } - status += fmt.Sprintf("%s@%s:%d", info.PluginName, info.Target, info.ActiveConnections) - first = false - } - } - - return status -} \ No newline at end of file +// 已移除未使用的 GetDetailedStatus 方法 \ No newline at end of file diff --git a/Common/base/Plugin.go b/Common/base/Plugin.go index e3ae9d8..cd0a0d1 100644 --- a/Common/base/Plugin.go +++ b/Common/base/Plugin.go @@ -1,7 +1,6 @@ package base import ( - "fmt" "sync" ) @@ -126,41 +125,7 @@ func (p *ScanPlugin) GetInfo() map[string]interface{} { // 插件管理器方法 // ============================================================================= -// RegisterPlugin 注册插件 -func (pm *PluginManager) RegisterPlugin(plugin *ScanPlugin) error { - if plugin == nil { - return fmt.Errorf("plugin cannot be nil") - } - if plugin.Name == "" { - return fmt.Errorf("plugin name cannot be empty") - } - if plugin.ScanFunc == nil { - return fmt.Errorf("plugin scan function cannot be nil") - } - - pm.mu.Lock() - defer pm.mu.Unlock() - - // 检查插件是否已存在 - if _, exists := pm.plugins[plugin.Name]; exists { - return fmt.Errorf("plugin %s already registered", plugin.Name) - } - - // 注册插件 - pm.plugins[plugin.Name] = plugin - - // 按类型索引 - for _, pluginType := range plugin.Types { - pm.types[pluginType] = append(pm.types[pluginType], plugin) - } - - // 按端口索引 - for _, port := range plugin.Ports { - pm.ports[port] = append(pm.ports[port], plugin) - } - - return nil -} +// 已移除未使用的 RegisterPlugin 方法 // ======================================================================================== // 未使用的插件管理器方法已删除(死代码清理) @@ -172,89 +137,11 @@ func (pm *PluginManager) RegisterPlugin(plugin *ScanPlugin) error { // 全局插件管理函数 (保持向后兼容) // ============================================================================= -// RegisterPlugin 注册插件到全局管理器 -func RegisterPlugin(name string, plugin ScanPlugin) error { - // 转换为新的插件结构 - newPlugin := &ScanPlugin{ - Name: name, - Ports: plugin.Ports, - Types: plugin.Types, - Enabled: true, - ScanFunc: plugin.ScanFunc, - } - - // 注册到新的插件管理器 - err := globalPluginManager.RegisterPlugin(newPlugin) - if err != nil { - return err - } - - // 同时更新Legacy管理器以保持向后兼容 - LegacyPluginManager[name] = plugin - - return nil -} +// 已移除未使用的 RegisterPlugin 方法 -// Clear 清理所有插件(防止内存泄漏) -func (pm *PluginManager) Clear() { - pm.mu.Lock() - defer pm.mu.Unlock() - - // 清理插件实例 - for name, plugin := range pm.plugins { - // ScanPlugin结构不包含Cleanup方法,直接删除即可 - _ = plugin // 避免未使用变量警告 - delete(pm.plugins, name) - } - - // 清理索引 - for typeKey := range pm.types { - delete(pm.types, typeKey) - } - for portKey := range pm.ports { - delete(pm.ports, portKey) - } - - // 清理Legacy管理器 - for k := range LegacyPluginManager { - delete(LegacyPluginManager, k) - } -} +// 已移除未使用的 Clear 方法 -// ClearPluginsByType 清理指定类型的插件 -func (pm *PluginManager) ClearPluginsByType(pluginType string) { - pm.mu.Lock() - defer pm.mu.Unlock() - - plugins := pm.types[pluginType] - for _, plugin := range plugins { - // ScanPlugin结构不包含Cleanup方法,直接删除即可 - delete(pm.plugins, plugin.Name) - } - delete(pm.types, pluginType) - - // 同步清理端口索引 - for port, portPlugins := range pm.ports { - filtered := make([]*ScanPlugin, 0) - for _, plugin := range portPlugins { - found := false - for _, typePlugin := range plugins { - if plugin == typePlugin { - found = true - break - } - } - if !found { - filtered = append(filtered, plugin) - } - } - if len(filtered) == 0 { - delete(pm.ports, port) - } else { - pm.ports[port] = filtered - } - } -} +// 已移除未使用的 ClearPluginsByType 方法 // GetGlobalPluginManager 方法已删除(死代码清理) diff --git a/Common/common.go b/Common/common.go index c557aed..7f42a59 100644 --- a/Common/common.go +++ b/Common/common.go @@ -45,12 +45,7 @@ var PluginManager = base.LegacyPluginManager // 核心功能导出 - 直接调用对应模块 // ============================================================================= -// 插件系统 -func RegisterPlugin(name string, plugin ScanPlugin) { - if err := base.RegisterPlugin(name, plugin); err != nil { - LogError("Failed to register plugin " + name + ": " + err.Error()) - } -} +// 已移除未使用的 RegisterPlugin 方法 // GetGlobalPluginManager 函数已删除(死代码清理) diff --git a/Common/parsers/Simple.go b/Common/parsers/Simple.go index 8bc456b..16ee0f3 100644 --- a/Common/parsers/Simple.go +++ b/Common/parsers/Simple.go @@ -108,11 +108,7 @@ func ParsePort(ports string) []int { return result } -// ParsePortsFromString 从字符串解析端口列表 -// 保持与 ParsePortsFromString 的接口兼容性 -func ParsePortsFromString(portsStr string) []int { - return ParsePort(portsStr) -} +// 已移除未使用的 ParsePortsFromString 方法 // ============================================================================= // 辅助函数 diff --git a/Common/utils/memmonitor.go b/Common/utils/memmonitor.go index 11798a6..5c76f75 100644 --- a/Common/utils/memmonitor.go +++ b/Common/utils/memmonitor.go @@ -1,8 +1,6 @@ package utils import ( - "log" - "runtime" "time" ) @@ -25,102 +23,19 @@ func NewMemoryMonitor(maxHeapMB uint64, maxGoroutines int, checkInterval time.Du } } -// Start 启动内存监控 -func (mm *MemoryMonitor) Start() { - if mm.running { - return - } - - mm.running = true - go mm.monitor() -} +// 已移除未使用的 Start 方法 -// Stop 停止内存监控 -func (mm *MemoryMonitor) Stop() { - if !mm.running { - return - } - - mm.running = false - select { - case mm.stopChan <- true: - default: - } -} +// 已移除未使用的 Stop 方法 -// monitor 监控循环 -func (mm *MemoryMonitor) monitor() { - ticker := time.NewTicker(mm.checkInterval) - defer ticker.Stop() - - for { - select { - case <-ticker.C: - mm.checkMemory() - case <-mm.stopChan: - return - } - } -} +// 已移除未使用的 monitor 方法 -// checkMemory 检查内存使用情况 -func (mm *MemoryMonitor) checkMemory() { - var m runtime.MemStats - runtime.ReadMemStats(&m) - - heapMB := m.HeapInuse / 1024 / 1024 - goroutineCount := runtime.NumGoroutine() - - // 检查堆内存使用 - if heapMB > mm.maxHeapMB { - log.Printf("[WARN] 内存使用警告: 堆内存使用过高 %d MB (阈值: %d MB)", heapMB, mm.maxHeapMB) - - // 尝试触发GC - runtime.GC() - - // 再次检查 - runtime.ReadMemStats(&m) - heapMBAfterGC := m.HeapInuse / 1024 / 1024 - log.Printf("[INFO] GC后堆内存: %d MB", heapMBAfterGC) - } - - // 检查goroutine数量 - if goroutineCount > mm.maxGoroutines { - log.Printf("[WARN] Goroutine数量警告: 当前数量 %d (阈值: %d)", goroutineCount, mm.maxGoroutines) - } -} +// 已移除未使用的 checkMemory 方法 -// GetMemoryStats 获取当前内存统计信息 -func (mm *MemoryMonitor) GetMemoryStats() map[string]interface{} { - var m runtime.MemStats - runtime.ReadMemStats(&m) - - return map[string]interface{}{ - "heap_inuse_mb": m.HeapInuse / 1024 / 1024, - "heap_alloc_mb": m.HeapAlloc / 1024 / 1024, - "sys_mb": m.Sys / 1024 / 1024, - "num_gc": m.NumGC, - "num_goroutines": runtime.NumGoroutine(), - "last_gc_time": time.Unix(0, int64(m.LastGC)), - } -} +// 已移除未使用的 GetMemoryStats 方法 -// ForceGC 强制执行垃圾回收 -func (mm *MemoryMonitor) ForceGC() { - before := mm.getHeapSize() - runtime.GC() - after := mm.getHeapSize() - - // 使用log包直接输出,避免undefined common错误 - log.Printf("[INFO] 强制GC: 释放内存 %d MB", (before-after)/1024/1024) -} +// 已移除未使用的 ForceGC 方法 -// getHeapSize 获取当前堆大小 -func (mm *MemoryMonitor) getHeapSize() uint64 { - var m runtime.MemStats - runtime.ReadMemStats(&m) - return m.HeapInuse -} +// 已移除未使用的 getHeapSize 方法 // 默认内存监控器实例 var DefaultMemMonitor = NewMemoryMonitor( @@ -129,12 +44,6 @@ var DefaultMemMonitor = NewMemoryMonitor( 30*time.Second, // 30秒检查一次 ) -// StartDefaultMonitor 启动默认内存监控器 -func StartDefaultMonitor() { - DefaultMemMonitor.Start() -} +// 已移除未使用的 StartDefaultMonitor 方法 -// StopDefaultMonitor 停止默认内存监控器 -func StopDefaultMonitor() { - DefaultMemMonitor.Stop() -} \ No newline at end of file +// 已移除未使用的 StopDefaultMonitor 方法 \ No newline at end of file diff --git a/Common/utils/slicepool.go b/Common/utils/slicepool.go index 7b87089..43a9623 100644 --- a/Common/utils/slicepool.go +++ b/Common/utils/slicepool.go @@ -2,25 +2,7 @@ package utils -// DeduplicateStrings 高效字符串去重 - 简化版本 -func DeduplicateStrings(slice []string) []string { - if len(slice) <= 1 { - return slice - } - - // 使用最简单高效的实现 - seen := make(map[string]struct{}, len(slice)) - result := make([]string, 0, len(slice)) - - for _, item := range slice { - if _, exists := seen[item]; !exists { - seen[item] = struct{}{} - result = append(result, item) - } - } - - return result -} +// 已移除未使用的 DeduplicateStrings 方法 diff --git a/core/PluginAdapter.go b/core/PluginAdapter.go index fa556c8..006efa1 100644 --- a/core/PluginAdapter.go +++ b/core/PluginAdapter.go @@ -34,45 +34,11 @@ func (pa *PluginAdapter) PluginExists(name string) bool { return metadata != nil } -// GetPluginPorts 获取插件支持的端口 -func (pa *PluginAdapter) GetPluginPorts(name string) []int { - metadata := pa.registry.GetMetadata(name) - if metadata != nil { - return metadata.Ports - } - return []int{} -} +// 已移除未使用的 GetPluginPorts 方法 -// GetPluginsByPort 根据端口获取支持的插件 -func (pa *PluginAdapter) GetPluginsByPort(port int) []string { - var plugins []string - for _, name := range pa.registry.GetAll() { - metadata := pa.registry.GetMetadata(name) - if metadata != nil { - for _, p := range metadata.Ports { - if p == port { - plugins = append(plugins, name) - break - } - } - } - } - return plugins -} +// 已移除未使用的 GetPluginsByPort 方法 -// GetPluginsByType 根据类型获取插件 -func (pa *PluginAdapter) GetPluginsByType(pluginType string) []string { - var plugins []string - for _, name := range pa.registry.GetAll() { - metadata := pa.registry.GetMetadata(name) - if metadata != nil { - if metadata.Category == pluginType { - plugins = append(plugins, name) - } - } - } - return plugins -} +// 已移除未使用的 GetPluginsByType 方法 // ScanWithPlugin 使用插件进行扫描 func (pa *PluginAdapter) ScanWithPlugin(pluginName string, info *common.HostInfo) error { @@ -103,38 +69,10 @@ func (pa *PluginAdapter) ScanWithPlugin(pluginName string, info *common.HostInfo return nil } -// FilterPluginsByType 按类型过滤插件名称 -func FilterPluginsByType(pluginType string) func(name string) bool { - return func(name string) bool { - metadata := GlobalPluginAdapter.registry.GetMetadata(name) - if metadata == nil { - return false - } - - switch pluginType { - case common.PluginTypeService: - return metadata.Category == "service" - case common.PluginTypeWeb: - return metadata.Category == "web" - case common.PluginTypeLocal: - return metadata.Category == "local" - default: - return true - } - } -} +// 已移除未使用的 FilterPluginsByType 方法 -// GetServicePlugins 获取所有服务插件 -func GetServicePlugins() []string { - return GlobalPluginAdapter.GetPluginsByType("service") -} +// 已移除未使用的 GetServicePlugins 方法 -// GetWebPlugins 获取所有Web插件 -func GetWebPlugins() []string { - return GlobalPluginAdapter.GetPluginsByType("web") -} +// 已移除未使用的 GetWebPlugins 方法 -// GetLocalPlugins 获取所有本地插件 -func GetLocalPlugins() []string { - return GlobalPluginAdapter.GetPluginsByType("local") -} \ No newline at end of file +// 已移除未使用的 GetLocalPlugins 方法 \ No newline at end of file diff --git a/core/Registry.go b/core/Registry.go index 376b79b..7418fb5 100644 --- a/core/Registry.go +++ b/core/Registry.go @@ -85,49 +85,15 @@ func InitializePluginSystem() error { return nil } -// GetAllPlugins 获取所有已注册插件名称 -func GetAllPlugins() []string { - return base.GlobalPluginRegistry.GetAll() -} +// 已移除未使用的 GetAllPlugins 方法 -// GetPluginMetadata 获取插件元数据 -func GetPluginMetadata(name string) *base.PluginMetadata { - return base.GlobalPluginRegistry.GetMetadata(name) -} +// 已移除未使用的 GetPluginMetadata 方法 -// CreatePlugin 创建插件实例 -func CreatePlugin(name string) (base.Plugin, error) { - return base.GlobalPluginRegistry.Create(name) -} +// 已移除未使用的 CreatePlugin 方法 -// GetPluginsByCategory 按类别获取插件 -func GetPluginsByCategory(category string) []string { - var plugins []string - for _, name := range base.GlobalPluginRegistry.GetAll() { - if metadata := base.GlobalPluginRegistry.GetMetadata(name); metadata != nil { - if metadata.Category == category { - plugins = append(plugins, name) - } - } - } - return plugins -} +// 已移除未使用的 GetPluginsByCategory 方法 -// GetPluginsByPort 按端口获取插件 -func GetPluginsByPort(port int) []string { - var plugins []string - for _, name := range base.GlobalPluginRegistry.GetAll() { - if metadata := base.GlobalPluginRegistry.GetMetadata(name); metadata != nil { - for _, p := range metadata.Ports { - if p == port { - plugins = append(plugins, name) - break - } - } - } - } - return plugins -} +// 已移除未使用的 GetPluginsByPort 方法 // init 自动初始化插件系统 func init() { diff --git a/core/Scanner.go b/core/Scanner.go index 3c695ac..eccd3e6 100644 --- a/core/Scanner.go +++ b/core/Scanner.go @@ -187,7 +187,4 @@ func executeScanTask(pluginName string, target common.HostInfo, ch *chan struct{ } -// Scan 入口函数,向后兼容旧的调用方式 -func Scan(info common.HostInfo) { - RunScan(info) -} +// 已移除未使用的 Scan 方法 diff --git a/core/WebDetection.go b/core/WebDetection.go index 75ab4f2..76f2472 100644 --- a/core/WebDetection.go +++ b/core/WebDetection.go @@ -1,10 +1,6 @@ package core import ( - "context" - "net" - "net/http" - "strings" "time" ) @@ -48,98 +44,15 @@ func NewWebPortDetector() *WebPortDetector { } } -// IsWebService 检测指定主机端口是否为Web服务 -func (w *WebPortDetector) IsWebService(host string, port int) bool { - // 1. 首先检查是否为常见Web端口 - if w.commonWebPorts[port] { - return true - } - - // 2. 对于非常见端口,进行HTTP协议检测 - return w.detectHTTPService(host, port) -} +// 已移除未使用的 IsWebService 方法 // IsCommonWebPort 检查是否为常见Web端口 func (w *WebPortDetector) IsCommonWebPort(port int) bool { return w.commonWebPorts[port] } -// detectHTTPService 检测HTTP服务(轻量级探测) -func (w *WebPortDetector) detectHTTPService(host string, port int) bool { - // 创建检测上下文,避免长时间阻塞 - ctx, cancel := context.WithTimeout(context.Background(), w.httpTimeout) - defer cancel() +// 已移除未使用的 detectHTTPService 方法 - // 尝试HTTP连接 - if w.tryHTTPConnection(ctx, host, port, "http") { - return true - } +// 已移除未使用的 tryHTTPConnection 方法 - // 尝试HTTPS连接(对于高端口常见) - if w.tryHTTPConnection(ctx, host, port, "https") { - return true - } - - return false -} - -// tryHTTPConnection 尝试HTTP连接 -func (w *WebPortDetector) tryHTTPConnection(ctx context.Context, host string, port int, protocol string) bool { - url := "" - if port == 80 && protocol == "http" { - url = "http://" + host - } else if port == 443 && protocol == "https" { - url = "https://" + host - } else { - url = protocol + "://" + host + ":" + string(rune(port)) - } - - // 创建HTTP客户端,快速检测 - client := &http.Client{ - Timeout: w.httpTimeout, - Transport: &http.Transport{ - DialContext: (&net.Dialer{ - Timeout: w.httpTimeout, - }).DialContext, - TLSHandshakeTimeout: w.httpTimeout, - ResponseHeaderTimeout: w.httpTimeout, - DisableKeepAlives: true, - }, - CheckRedirect: func(req *http.Request, via []*http.Request) error { - return http.ErrUseLastResponse // 不跟随重定向,加快检测速度 - }, - } - - // 发送HEAD请求,最小化网络开销 - req, err := http.NewRequestWithContext(ctx, "HEAD", url, nil) - if err != nil { - return false - } - - req.Header.Set("User-Agent", "fscan-web-detector/2.0") - - resp, err := client.Do(req) - if err != nil { - // 检查错误类型,某些错误也表明是HTTP服务 - errStr := strings.ToLower(err.Error()) - if strings.Contains(errStr, "http") || - strings.Contains(errStr, "malformed http") || - strings.Contains(errStr, "server closed") { - return true - } - return false - } - defer resp.Body.Close() - - // 任何HTTP响应都表明这是Web服务 - return resp.StatusCode > 0 -} - -// GetCommonWebPorts 获取常见Web端口列表 -func (w *WebPortDetector) GetCommonWebPorts() []int { - ports := make([]int, 0, len(w.commonWebPorts)) - for port := range w.commonWebPorts { - ports = append(ports, port) - } - return ports -} \ No newline at end of file +// 已移除未使用的 GetCommonWebPorts 方法 \ No newline at end of file diff --git a/plugins/services/vnc/plugin.go b/plugins/services/vnc/plugin.go index 5cb8af9..739c9f5 100644 --- a/plugins/services/vnc/plugin.go +++ b/plugins/services/vnc/plugin.go @@ -156,33 +156,7 @@ func (p *VNCPlugin) IsExploitSupported(method base.ExploitType) bool { return p.exploiter.IsExploitSupported(method) } -// performServiceIdentification 执行VNC服务识别(-nobr模式) -func (p *VNCPlugin) performServiceIdentification(ctx context.Context, info *common.HostInfo) (*base.ScanResult, error) { - // 尝试连接到VNC服务进行识别 - conn, err := p.connector.Connect(ctx, info) - if err != nil { - return &base.ScanResult{ - Success: false, - Service: "Unknown", - Banner: "", - Error: fmt.Errorf("服务不可访问"), - }, nil - } - - connectionInfo := conn.(map[string]interface{}) - version := connectionInfo["version"].(string) - - return &base.ScanResult{ - Success: true, - Service: "VNC", - Banner: fmt.Sprintf("VNC服务 %s", version), - Extra: map[string]interface{}{ - "version": version, - "identified": true, - "protocol": "VNC", - }, - }, nil -} +// 已移除未使用的 performServiceIdentification 方法 // RegisterVNCPlugin 注册VNC插件 func RegisterVNCPlugin() {