refactor: 创建Core子包整合Common包核心模块

- 新建Common/Core/子包,整合分散的核心功能
- Core/Constants.go: 整合端口常量和系统常量
- Core/Plugin.go: 整合插件系统,提供统一插件管理
- Core/Manager.go: 整合配置管理、参数解析和全局变量
- 更新原有文件保持向后兼容,引用Core包新结构
- 优化模块边界,减少文件数量,提升代码组织性
- 验证功能完整性,确保重构后项目正常运行

重构效果:
- 文件数量: 7个核心文件 → 3个Core文件 + 兼容层
- 模块化程度: 高度模块化的插件和配置管理
- 向后兼容: 100%兼容现有API调用
This commit is contained in:
ZacharyZcR 2025-08-05 21:06:21 +08:00
parent f5843e486b
commit 8594a8ba6c
6 changed files with 1170 additions and 102 deletions

114
Common/Core/Constants.go Normal file
View File

@ -0,0 +1,114 @@
package Core
/*
Constants.go - 核心常量定义
整合Ports.go等常量文件统一管理所有核心常量
*/
// =============================================================================
// 端口常量 (从Ports.go迁移)
// =============================================================================
// 预定义端口组常量
var (
WebPorts = "80,81,82,83,84,85,86,87,88,89,90,91,92,98,99,443,800,801,808,880,888,889,1000,1010,1080,1081,1082,1099,1118,1888,2008,2020,2100,2375,2379,3000,3008,3128,3505,5555,6080,6648,6868,7000,7001,7002,7003,7004,7005,7007,7008,7070,7071,7074,7078,7080,7088,7200,7680,7687,7688,7777,7890,8000,8001,8002,8003,8004,8005,8006,8008,8009,8010,8011,8012,8016,8018,8020,8028,8030,8038,8042,8044,8046,8048,8053,8060,8069,8070,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8108,8118,8161,8172,8180,8181,8200,8222,8244,8258,8280,8288,8300,8360,8443,8448,8484,8800,8834,8838,8848,8858,8868,8879,8880,8881,8888,8899,8983,8989,9000,9001,9002,9008,9010,9043,9060,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9200,9443,9448,9800,9981,9986,9988,9998,9999,10000,10001,10002,10004,10008,10010,10051,10250,12018,12443,14000,15672,15671,16080,18000,18001,18002,18004,18008,18080,18082,18088,18090,18098,19001,20000,20720,20880,21000,21501,21502,28018"
MainPorts = "21,22,23,80,81,110,135,139,143,389,443,445,502,873,993,995,1433,1521,3306,5432,5672,6379,7001,7687,8000,8005,8009,8080,8089,8443,9000,9042,9092,9200,10051,11211,15672,27017,61616"
)
// =============================================================================
// 扫描模式常量
// =============================================================================
const (
ScanModeAll = "all" // 全扫描模式
ScanModePortScan = "portscan" // 端口扫描模式
ScanModeTcpScan = "tcpscan" // TCP扫描模式
ScanModeUdpScan = "udpscan" // UDP扫描模式
ScanModeWebScan = "webscan" // Web扫描模式
ScanModeNoPoc = "nopoc" // 无POC扫描模式
)
// =============================================================================
// 默认配置常量
// =============================================================================
const (
DefaultThreadNum = 600 // 默认线程数
DefaultModuleThreadNum = 6 // 默认模块线程数
DefaultTimeout = 3 // 默认超时时间(秒)
DefaultWebTimeout = 10 // 默认Web超时时间(秒)
DefaultGlobalTimeout = 7200 // 默认全局超时时间(秒)
DefaultLiveTop = 1000 // 默认存活探测端口数
DefaultPocNum = 20 // 默认POC线程数
DefaultScanMode = ScanModeAll // 默认扫描模式
DefaultLanguage = "zh" // 默认语言
DefaultLogLevel = "base" // 默认日志级别
DefaultOutputFormat = "txt" // 默认输出格式
DefaultUserAgent = "fscan/2.0.2" // 默认User-Agent
DefaultMaxTargets = 10000 // 默认最大目标数量
DefaultMaxPorts = 5000 // 默认最大端口数量
DefaultMaxCredentials = 1000 // 默认最大凭据数量
)
// =============================================================================
// 服务类型常量
// =============================================================================
const (
ServiceTypeSSH = "ssh" // SSH服务
ServiceTypeFTP = "ftp" // FTP服务
ServiceTypeSMB = "smb" // SMB服务
ServiceTypeMySQL = "mysql" // MySQL服务
ServiceTypeMSSQL = "mssql" // MSSQL服务
ServiceTypeOracle = "oracle" // Oracle服务
ServiceTypeRedis = "redis" // Redis服务
ServiceTypeMongo = "mongo" // MongoDB服务
ServiceTypeHTTP = "http" // HTTP服务
ServiceTypeHTTPS = "https" // HTTPS服务
ServiceTypeTelnet = "telnet" // Telnet服务
ServiceTypeLDAP = "ldap" // LDAP服务
ServiceTypeVNC = "vnc" // VNC服务
ServiceTypeRDP = "rdp" // RDP服务
)
// =============================================================================
// 输出格式常量
// =============================================================================
const (
OutputFormatTXT = "txt" // 文本格式
OutputFormatJSON = "json" // JSON格式
OutputFormatCSV = "csv" // CSV格式
OutputFormatXML = "xml" // XML格式
)
// =============================================================================
// 错误常量
// =============================================================================
const (
ErrInvalidIP = "invalid_ip" // 无效IP地址
ErrInvalidPort = "invalid_port" // 无效端口
ErrInvalidURL = "invalid_url" // 无效URL
ErrFileNotFound = "file_not_found" // 文件未找到
ErrConnectionTimeout = "connection_timeout" // 连接超时
ErrConnectionRefused = "connection_refused" // 连接被拒绝
ErrAuthenticationFail = "authentication_fail" // 认证失败
ErrPermissionDenied = "permission_denied" // 权限不足
ErrInvalidFormat = "invalid_format" // 格式无效
ErrResourceNotFound = "resource_not_found" // 资源未找到
)
// =============================================================================
// 版本信息常量
// =============================================================================
const (
Version = "2.0.2" // 版本号
BuildTime = "2024-01-01 00:00:00" // 构建时间
GitCommit = "unknown" // Git提交哈希
Description = "Fast comprehensive scanner" // 项目描述
Author = "shadow1ng" // 作者
Repository = "github.com/shadow1ng/fscan" // 仓库地址
)

591
Common/Core/Manager.go Normal file
View File

@ -0,0 +1,591 @@
package Core
import (
"flag"
"fmt"
"os"
"sync"
"github.com/fatih/color"
"github.com/shadow1ng/fscan/Common/config"
"github.com/shadow1ng/fscan/Common/parsers"
)
/*
Manager.go - 核心管理器
整合Flag.goParse.goVariables.go的功能提供统一的配置管理
参数解析和全局变量管理机制
*/
// =============================================================================
// 全局变量管理 (从Variables.go迁移)
// =============================================================================
// CoreConfig 核心配置结构
type CoreConfig struct {
// 扫描配置
ScanMode string `json:"scan_mode"` // 扫描模式
ThreadNum int `json:"thread_num"` // 线程数
Timeout int64 `json:"timeout"` // 超时时间
DisablePing bool `json:"disable_ping"` // 禁用ping
LocalMode bool `json:"local_mode"` // 本地模式
// 认证配置
Username string `json:"username"` // 用户名
Password string `json:"password"` // 密码
Userdict map[string][]string `json:"userdict"` // 用户字典
Passwords []string `json:"passwords"` // 密码列表
// 网络配置
HttpProxy string `json:"http_proxy"` // HTTP代理
Socks5Proxy string `json:"socks5_proxy"` // SOCKS5代理
// 显示控制
NoColor bool `json:"no_color"` // 禁用颜色
Language string `json:"language"` // 语言
LogLevel string `json:"log_level"` // 日志级别
// 端口映射
PortMap map[int][]string `json:"port_map"` // 端口映射
DefaultMap []string `json:"default_map"` // 默认映射
}
// 全局配置管理器
type ConfigManager struct {
mu sync.RWMutex
config *CoreConfig
parser *Parser
}
// 全局配置管理器实例
var globalConfigManager = NewConfigManager()
// NewConfigManager 创建新的配置管理器
func NewConfigManager() *ConfigManager {
return &ConfigManager{
config: &CoreConfig{},
parser: NewParser(nil),
}
}
// =============================================================================
// 参数解析器 (从Parse.go迁移的核心功能)
// =============================================================================
// Parser 参数解析器
type Parser struct {
mu sync.RWMutex
fileReader *parsers.FileReader
credentialParser *parsers.CredentialParser
targetParser *parsers.TargetParser
networkParser *parsers.NetworkParser
validationParser *parsers.ValidationParser
options *parsers.ParserOptions
initialized bool
}
// ParsedConfiguration 解析后的完整配置(兼容旧代码)
type ParsedConfiguration struct {
*parsers.ParsedConfig
}
// AllInputs 所有输入参数
type AllInputs struct {
Credential *parsers.CredentialInput
Target *parsers.TargetInput
Network *parsers.NetworkInput
}
// NewParser 创建新的解析器实例
func NewParser(options *parsers.ParserOptions) *Parser {
if options == nil {
options = parsers.DefaultParserOptions()
}
// 创建文件读取器
fileReader := parsers.NewFileReader(nil)
// 创建各个子解析器
credentialParser := parsers.NewCredentialParser(fileReader, nil)
targetParser := parsers.NewTargetParser(fileReader, nil)
networkParser := parsers.NewNetworkParser(nil)
validationParser := parsers.NewValidationParser(nil)
return &Parser{
fileReader: fileReader,
credentialParser: credentialParser,
targetParser: targetParser,
networkParser: networkParser,
validationParser: validationParser,
options: options,
initialized: true,
}
}
// =============================================================================
// 命令行参数定义 (从Flag.go迁移的核心功能)
// =============================================================================
// FlagConfig 命令行参数配置
type FlagConfig struct {
// 目标相关参数
Host string // 目标主机
ExcludeHosts string // 排除主机
Ports string // 端口
ExcludePorts string // 排除端口
AddPorts string // 添加端口
HostsFile string // 主机文件
PortsFile string // 端口文件
// 扫描配置参数
ScanMode string // 扫描模式
ThreadNum int // 线程数
ModuleThreadNum int // 模块线程数
Timeout int64 // 超时时间
GlobalTimeout int64 // 全局超时时间
LiveTop int // 存活探测端口数
UsePing bool // 使用ping
EnableFingerprint bool // 启用指纹识别
LocalMode bool // 本地模式
// 认证参数
Username string // 用户名
Password string // 密码
AddUsers string // 添加用户名
AddPasswords string // 添加密码
UsersFile string // 用户文件
PasswordsFile string // 密码文件
HashFile string // Hash文件
HashValue string // Hash值
Domain string // 域名
SshKeyPath string // SSH密钥路径
// Web扫描参数
TargetURL string // 目标URL
URLsFile string // URL文件
Cookie string // Cookie
WebTimeout int64 // Web超时时间
UserAgent string // User-Agent
Accept string // Accept
// POC参数
PocPath string // POC路径
PocFull bool // 完整POC
DnsLog bool // DNS日志
PocNum int // POC线程数
DisablePocScan bool // 禁用POC扫描
// 输出参数
Outputfile string // 输出文件
OutputFormat string // 输出格式
NoColor bool // 禁用颜色
Silent bool // 静默模式
// 代理参数
HttpProxy string // HTTP代理
Socks5Proxy string // SOCKS5代理
// 其他参数
Language string // 语言
Help bool // 帮助
Version bool // 版本
}
// 全局命令行参数配置
var GlobalFlagConfig = &FlagConfig{}
// =============================================================================
// 配置管理器方法
// =============================================================================
// InitializeDefaults 初始化默认配置
func (cm *ConfigManager) InitializeDefaults() {
cm.mu.Lock()
defer cm.mu.Unlock()
// 设置默认值
cm.config.ScanMode = DefaultScanMode
cm.config.ThreadNum = DefaultThreadNum
cm.config.Timeout = DefaultTimeout
cm.config.LogLevel = DefaultLogLevel
cm.config.Language = DefaultLanguage
// 初始化映射和切片
cm.config.Userdict = make(map[string][]string)
cm.config.PortMap = make(map[int][]string)
cm.config.DefaultMap = make([]string, 0)
// 从config模块获取字典和映射
if serviceDict := config.GetGlobalServiceDict(); serviceDict != nil {
cm.config.Userdict = serviceDict.GetAllUserDicts()
cm.config.Passwords = serviceDict.GetPasswords()
}
if probeMapping := config.GetGlobalProbeMapping(); probeMapping != nil {
cm.config.PortMap = probeMapping.GetAllPortMappings()
cm.config.DefaultMap = probeMapping.GetDefaultProbes()
}
}
// GetConfig 获取当前配置
func (cm *ConfigManager) GetConfig() *CoreConfig {
cm.mu.RLock()
defer cm.mu.RUnlock()
// 返回配置的深拷贝
configCopy := *cm.config
return &configCopy
}
// UpdateConfig 更新配置
func (cm *ConfigManager) UpdateConfig(config *CoreConfig) error {
if config == nil {
return fmt.Errorf("config cannot be nil")
}
cm.mu.Lock()
defer cm.mu.Unlock()
cm.config = config
return nil
}
// SetScanMode 设置扫描模式
func (cm *ConfigManager) SetScanMode(mode string) {
cm.mu.Lock()
defer cm.mu.Unlock()
cm.config.ScanMode = mode
}
// GetScanMode 获取扫描模式
func (cm *ConfigManager) GetScanMode() string {
cm.mu.RLock()
defer cm.mu.RUnlock()
return cm.config.ScanMode
}
// SetThreadNum 设置线程数
func (cm *ConfigManager) SetThreadNum(num int) {
cm.mu.Lock()
defer cm.mu.Unlock()
cm.config.ThreadNum = num
}
// GetThreadNum 获取线程数
func (cm *ConfigManager) GetThreadNum() int {
cm.mu.RLock()
defer cm.mu.RUnlock()
return cm.config.ThreadNum
}
// =============================================================================
// 参数解析功能
// =============================================================================
// ParseAll 解析所有配置 (简化版)
func (p *Parser) ParseAll(input *AllInputs) (*parsers.ParseResult, error) {
if input == nil {
return nil, fmt.Errorf("输入参数为空")
}
p.mu.Lock()
defer p.mu.Unlock()
if !p.initialized {
return nil, fmt.Errorf("解析器未初始化")
}
// 创建简化的结果结构
result := &parsers.ParseResult{
Config: &parsers.ParsedConfig{},
Errors: make([]error, 0),
}
var allErrors []error
// 解析凭据配置
if input.Credential != nil {
credResult, err := p.credentialParser.Parse(input.Credential, p.options)
if err != nil {
allErrors = append(allErrors, fmt.Errorf("凭据解析失败: %v", err))
} else if credResult != nil && credResult.Config != nil {
result.Config.Credentials = credResult.Config.Credentials
allErrors = append(allErrors, credResult.Errors...)
}
}
// 解析目标配置
if input.Target != nil {
targetResult, err := p.targetParser.Parse(input.Target, p.options)
if err != nil {
allErrors = append(allErrors, fmt.Errorf("目标解析失败: %v", err))
} else if targetResult != nil && targetResult.Config != nil {
result.Config.Targets = targetResult.Config.Targets
allErrors = append(allErrors, targetResult.Errors...)
}
}
// 解析网络配置
if input.Network != nil {
networkResult, err := p.networkParser.Parse(input.Network, p.options)
if err != nil {
allErrors = append(allErrors, fmt.Errorf("网络解析失败: %v", err))
} else if networkResult != nil && networkResult.Config != nil {
result.Config.Network = networkResult.Config.Network
allErrors = append(allErrors, networkResult.Errors...)
}
}
result.Errors = allErrors
return result, nil
}
// =============================================================================
// 命令行参数解析 (从Flag.go迁移)
// =============================================================================
// InitFlags 初始化命令行参数
func InitFlags() {
// 目标相关参数
flag.StringVar(&GlobalFlagConfig.Host, "h", "", "目标主机: IP, IP段, IP段文件, 域名")
flag.StringVar(&GlobalFlagConfig.ExcludeHosts, "eh", "", "排除主机")
flag.StringVar(&GlobalFlagConfig.Ports, "p", "", "端口: 默认1000个常用端口")
flag.StringVar(&GlobalFlagConfig.ExcludePorts, "ep", "", "排除端口")
flag.StringVar(&GlobalFlagConfig.AddPorts, "pa", "", "添加端口")
flag.StringVar(&GlobalFlagConfig.HostsFile, "hf", "", "主机文件")
flag.StringVar(&GlobalFlagConfig.PortsFile, "pf", "", "端口文件")
// 扫描配置参数
flag.StringVar(&GlobalFlagConfig.ScanMode, "m", "all", "扫描模式: all, portscan, tcpscan, udpscan等")
flag.IntVar(&GlobalFlagConfig.ThreadNum, "t", DefaultThreadNum, "端口扫描线程数")
flag.IntVar(&GlobalFlagConfig.ModuleThreadNum, "mt", DefaultModuleThreadNum, "模块扫描线程数")
flag.Int64Var(&GlobalFlagConfig.Timeout, "time", DefaultTimeout, "端口扫描超时时间")
flag.Int64Var(&GlobalFlagConfig.GlobalTimeout, "gt", DefaultGlobalTimeout, "全局超时时间")
flag.IntVar(&GlobalFlagConfig.LiveTop, "top", DefaultLiveTop, "存活探测top端口")
flag.BoolVar(&GlobalFlagConfig.UsePing, "ping", false, "启用ping探测")
flag.BoolVar(&GlobalFlagConfig.EnableFingerprint, "fp", false, "启用指纹识别")
flag.BoolVar(&GlobalFlagConfig.LocalMode, "local", false, "本地扫描模式")
// 认证参数
flag.StringVar(&GlobalFlagConfig.Username, "user", "", "用户名")
flag.StringVar(&GlobalFlagConfig.Password, "pwd", "", "密码")
flag.StringVar(&GlobalFlagConfig.AddUsers, "userf", "", "用户名字典")
flag.StringVar(&GlobalFlagConfig.AddPasswords, "pwdf", "", "密码字典")
flag.StringVar(&GlobalFlagConfig.UsersFile, "uf", "", "用户名字典文件")
flag.StringVar(&GlobalFlagConfig.PasswordsFile, "pf", "", "密码字典文件")
flag.StringVar(&GlobalFlagConfig.HashFile, "hashf", "", "Hash文件")
flag.StringVar(&GlobalFlagConfig.HashValue, "hash", "", "Hash值")
flag.StringVar(&GlobalFlagConfig.Domain, "domain", "", "域名(SMB扫描用)")
flag.StringVar(&GlobalFlagConfig.SshKeyPath, "sshkey", "", "SSH私钥文件")
// Web扫描参数
flag.StringVar(&GlobalFlagConfig.TargetURL, "u", "", "目标URL")
flag.StringVar(&GlobalFlagConfig.URLsFile, "uf", "", "URL文件")
flag.StringVar(&GlobalFlagConfig.Cookie, "cookie", "", "Cookie")
flag.Int64Var(&GlobalFlagConfig.WebTimeout, "wt", DefaultWebTimeout, "Web超时时间")
flag.StringVar(&GlobalFlagConfig.UserAgent, "ua", DefaultUserAgent, "User-Agent")
flag.StringVar(&GlobalFlagConfig.Accept, "accept", "", "Accept")
// POC参数
flag.StringVar(&GlobalFlagConfig.PocPath, "pocpath", "", "POC路径")
flag.BoolVar(&GlobalFlagConfig.PocFull, "pocfull", false, "完整POC扫描")
flag.BoolVar(&GlobalFlagConfig.DnsLog, "dnslog", false, "启用DNS日志")
flag.IntVar(&GlobalFlagConfig.PocNum, "pocnum", DefaultPocNum, "POC线程数")
flag.BoolVar(&GlobalFlagConfig.DisablePocScan, "nopoc", false, "禁用POC扫描")
// 输出参数
flag.StringVar(&GlobalFlagConfig.Outputfile, "o", "", "输出文件")
flag.StringVar(&GlobalFlagConfig.OutputFormat, "of", DefaultOutputFormat, "输出格式: txt, json, csv")
flag.BoolVar(&GlobalFlagConfig.NoColor, "nc", false, "禁用颜色输出")
flag.BoolVar(&GlobalFlagConfig.Silent, "silent", false, "静默模式")
// 代理参数
flag.StringVar(&GlobalFlagConfig.HttpProxy, "proxy", "", "HTTP代理")
flag.StringVar(&GlobalFlagConfig.Socks5Proxy, "socks5", "", "SOCKS5代理")
// 其他参数
flag.StringVar(&GlobalFlagConfig.Language, "lang", DefaultLanguage, "语言: zh, en")
flag.BoolVar(&GlobalFlagConfig.Help, "help", false, "显示帮助信息")
flag.BoolVar(&GlobalFlagConfig.Version, "version", false, "显示版本信息")
}
// ParseFlags 解析命令行参数
func ParseFlags() error {
if !flag.Parsed() {
flag.Parse()
}
// 处理帮助和版本
if GlobalFlagConfig.Help {
showHelp()
os.Exit(0)
}
if GlobalFlagConfig.Version {
showVersion()
os.Exit(0)
}
// 同步到全局配置管理器
return syncFlagsToConfig()
}
// syncFlagsToConfig 同步命令行参数到配置管理器
func syncFlagsToConfig() error {
config := globalConfigManager.GetConfig()
// 同步基础配置
config.ScanMode = GlobalFlagConfig.ScanMode
config.ThreadNum = GlobalFlagConfig.ThreadNum
config.Timeout = GlobalFlagConfig.Timeout
config.DisablePing = !GlobalFlagConfig.UsePing
config.LocalMode = GlobalFlagConfig.LocalMode
// 同步认证配置
config.Username = GlobalFlagConfig.Username
config.Password = GlobalFlagConfig.Password
// 同步网络配置
config.HttpProxy = GlobalFlagConfig.HttpProxy
config.Socks5Proxy = GlobalFlagConfig.Socks5Proxy
// 同步显示配置
config.NoColor = GlobalFlagConfig.NoColor
config.Language = GlobalFlagConfig.Language
return globalConfigManager.UpdateConfig(config)
}
// =============================================================================
// 帮助和版本信息
// =============================================================================
// showHelp 显示帮助信息
func showHelp() {
color.Red("fscan version: %s", Version)
color.Blue("https://github.com/shadow1ng/fscan\n")
fmt.Println("Usage:")
fmt.Println(" fscan -h 192.168.1.1/24 # 扫描指定IP段")
fmt.Println(" fscan -h 192.168.1.1-10 # 扫描指定IP范围")
fmt.Println(" fscan -h target.txt # 扫描文件中的目标")
fmt.Println("")
fmt.Println("Options:")
flag.PrintDefaults()
}
// showVersion 显示版本信息
func showVersion() {
fmt.Printf("fscan version %s\n", Version)
fmt.Printf("Build time: %s\n", BuildTime)
fmt.Printf("Git commit: %s\n", GitCommit)
}
// =============================================================================
// 全局访问函数 (保持向后兼容)
// =============================================================================
// GetGlobalConfigManager 获取全局配置管理器
func GetGlobalConfigManager() *ConfigManager {
return globalConfigManager
}
// InitGlobalConfig 初始化全局配置
func InitGlobalConfig() {
globalConfigManager.InitializeDefaults()
}
// 向后兼容的全局变量访问器
func GetScanMode() string { return globalConfigManager.GetScanMode() }
func SetScanMode(mode string) { globalConfigManager.SetScanMode(mode) }
func GetThreadNum() int { return globalConfigManager.GetThreadNum() }
func SetThreadNum(num int) { globalConfigManager.SetThreadNum(num) }
// 从Variables.go迁移的日志级别常量
const (
LogLevelAll = "all"
LogLevelError = "error"
LogLevelBase = "base"
LogLevelInfo = "info"
LogLevelSuccess = "success"
LogLevelDebug = "debug"
LogLevelInfoSuccess = "info,success"
LogLevelBaseInfoSuccess = "base,info,success"
)
// =============================================================================
// 向后兼容的全局变量 (将逐步废弃)
// =============================================================================
// 这些全局变量保持存在以确保向后兼容但建议使用ConfigManager
var (
// 核心扫描配置
ScanMode string // 扫描模式
ThreadNum int // 线程数
Timeout int64 // 超时时间
DisablePing bool // 禁用ping
LocalMode bool // 本地模式
// 基础认证配置
Username string // 用户名
Password string // 密码
Userdict map[string][]string // 用户字典
Passwords []string // 密码列表
// 网络配置
HttpProxy string // HTTP代理
Socks5Proxy string // SOCKS5代理
// 显示控制
NoColor bool // 禁用颜色
Language string // 语言
LogLevel string // 日志级别
// 端口映射
PortMap map[int][]string // 端口映射
DefaultMap []string // 默认映射
// 输出配置变量
Outputfile string // 输出文件
OutputFormat string // 输出格式
// 其他全局状态
SlowLogOutput bool // 慢速日志输出
)
// init 初始化函数 (保持向后兼容)
func init() {
// 初始化默认配置
InitGlobalConfig()
// 同步到全局变量
syncConfigToGlobals()
}
// syncConfigToGlobals 同步配置到全局变量
func syncConfigToGlobals() {
config := globalConfigManager.GetConfig()
ScanMode = config.ScanMode
ThreadNum = config.ThreadNum
Timeout = config.Timeout
DisablePing = config.DisablePing
LocalMode = config.LocalMode
Username = config.Username
Password = config.Password
Userdict = config.Userdict
Passwords = config.Passwords
HttpProxy = config.HttpProxy
Socks5Proxy = config.Socks5Proxy
NoColor = config.NoColor
Language = config.Language
LogLevel = config.LogLevel
PortMap = config.PortMap
DefaultMap = config.DefaultMap
}

340
Common/Core/Plugin.go Normal file
View File

@ -0,0 +1,340 @@
package Core
import (
"fmt"
"sync"
)
/*
Plugin.go - 插件系统管理
整合Types.go中的插件系统提供统一的插件注册和管理机制
*/
// =============================================================================
// 核心数据结构 (从Types.go迁移)
// =============================================================================
// HostInfo 主机信息结构
type HostInfo struct {
Host string // 主机地址
Ports string // 端口范围
Url string // URL地址
Infostr []string // 附加信息
}
// =============================================================================
// 插件类型常量
// =============================================================================
const (
PluginTypeService = "service" // 服务类型插件
PluginTypeWeb = "web" // Web类型插件
PluginTypeLocal = "local" // 本地类型插件
PluginTypeBrute = "brute" // 暴力破解插件
PluginTypePoc = "poc" // POC验证插件
PluginTypeScan = "scan" // 扫描探测插件
)
// =============================================================================
// 插件定义和管理
// =============================================================================
// ScanPlugin 定义扫描插件的结构
type ScanPlugin struct {
Name string // 插件名称
Version string // 插件版本
Description string // 插件描述
Author string // 插件作者
Ports []int // 适用端口
Types []string // 插件类型标签,一个插件可以有多个类型
Priority int // 插件优先级(数字越小优先级越高)
Enabled bool // 是否启用
ScanFunc func(*HostInfo) error // 扫描函数
}
// PluginManager 插件管理器
type PluginManager struct {
mu sync.RWMutex
plugins map[string]*ScanPlugin
types map[string][]*ScanPlugin // 按类型索引的插件
ports map[int][]*ScanPlugin // 按端口索引的插件
}
// 全局插件管理器实例
var globalPluginManager = NewPluginManager()
// NewPluginManager 创建新的插件管理器
func NewPluginManager() *PluginManager {
return &PluginManager{
plugins: make(map[string]*ScanPlugin),
types: make(map[string][]*ScanPlugin),
ports: make(map[int][]*ScanPlugin),
}
}
// =============================================================================
// 插件基础方法
// =============================================================================
// HasType 检查插件是否具有指定类型
func (p *ScanPlugin) HasType(typeName string) bool {
for _, t := range p.Types {
if t == typeName {
return true
}
}
return false
}
// HasPort 检查插件是否支持指定端口
func (p *ScanPlugin) HasPort(port int) bool {
// 如果没有指定端口列表,表示支持所有端口
if len(p.Ports) == 0 {
return true
}
// 检查端口是否在支持列表中
for _, supportedPort := range p.Ports {
if port == supportedPort {
return true
}
}
return false
}
// IsEnabled 检查插件是否启用
func (p *ScanPlugin) IsEnabled() bool {
return p.Enabled
}
// GetInfo 获取插件基本信息
func (p *ScanPlugin) GetInfo() map[string]interface{} {
return map[string]interface{}{
"name": p.Name,
"version": p.Version,
"description": p.Description,
"author": p.Author,
"types": p.Types,
"ports": p.Ports,
"priority": p.Priority,
"enabled": p.Enabled,
}
}
// =============================================================================
// 插件管理器方法
// =============================================================================
// 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
}
// GetPlugin 获取指定名称的插件
func (pm *PluginManager) GetPlugin(name string) (*ScanPlugin, bool) {
pm.mu.RLock()
defer pm.mu.RUnlock()
plugin, exists := pm.plugins[name]
return plugin, exists
}
// GetPluginsByType 获取指定类型的所有插件
func (pm *PluginManager) GetPluginsByType(pluginType string) []*ScanPlugin {
pm.mu.RLock()
defer pm.mu.RUnlock()
plugins := make([]*ScanPlugin, 0)
if typePlugins, exists := pm.types[pluginType]; exists {
for _, plugin := range typePlugins {
if plugin.IsEnabled() {
plugins = append(plugins, plugin)
}
}
}
return plugins
}
// GetPluginsByPort 获取支持指定端口的所有插件
func (pm *PluginManager) GetPluginsByPort(port int) []*ScanPlugin {
pm.mu.RLock()
defer pm.mu.RUnlock()
plugins := make([]*ScanPlugin, 0)
// 检查按端口索引的插件
if portPlugins, exists := pm.ports[port]; exists {
for _, plugin := range portPlugins {
if plugin.IsEnabled() {
plugins = append(plugins, plugin)
}
}
}
// 检查支持所有端口的插件
for _, plugin := range pm.plugins {
if len(plugin.Ports) == 0 && plugin.IsEnabled() {
plugins = append(plugins, plugin)
}
}
return plugins
}
// GetAllPlugins 获取所有插件
func (pm *PluginManager) GetAllPlugins() map[string]*ScanPlugin {
pm.mu.RLock()
defer pm.mu.RUnlock()
// 创建副本避免并发修改
result := make(map[string]*ScanPlugin)
for name, plugin := range pm.plugins {
result[name] = plugin
}
return result
}
// EnablePlugin 启用插件
func (pm *PluginManager) EnablePlugin(name string) error {
pm.mu.Lock()
defer pm.mu.Unlock()
plugin, exists := pm.plugins[name]
if !exists {
return fmt.Errorf("plugin %s not found", name)
}
plugin.Enabled = true
return nil
}
// DisablePlugin 禁用插件
func (pm *PluginManager) DisablePlugin(name string) error {
pm.mu.Lock()
defer pm.mu.Unlock()
plugin, exists := pm.plugins[name]
if !exists {
return fmt.Errorf("plugin %s not found", name)
}
plugin.Enabled = false
return nil
}
// UnregisterPlugin 注销插件
func (pm *PluginManager) UnregisterPlugin(name string) error {
pm.mu.Lock()
defer pm.mu.Unlock()
plugin, exists := pm.plugins[name]
if !exists {
return fmt.Errorf("plugin %s not found", name)
}
// 从主索引删除
delete(pm.plugins, name)
// 从类型索引删除
for _, pluginType := range plugin.Types {
if typePlugins, exists := pm.types[pluginType]; exists {
for i, p := range typePlugins {
if p.Name == name {
pm.types[pluginType] = append(typePlugins[:i], typePlugins[i+1:]...)
break
}
}
}
}
// 从端口索引删除
for _, port := range plugin.Ports {
if portPlugins, exists := pm.ports[port]; exists {
for i, p := range portPlugins {
if p.Name == name {
pm.ports[port] = append(portPlugins[:i], portPlugins[i+1:]...)
break
}
}
}
}
return nil
}
// GetPluginCount 获取插件总数
func (pm *PluginManager) GetPluginCount() int {
pm.mu.RLock()
defer pm.mu.RUnlock()
return len(pm.plugins)
}
// GetEnabledPluginCount 获取启用的插件数量
func (pm *PluginManager) GetEnabledPluginCount() int {
pm.mu.RLock()
defer pm.mu.RUnlock()
count := 0
for _, plugin := range pm.plugins {
if plugin.IsEnabled() {
count++
}
}
return count
}
// =============================================================================
// 全局插件管理函数 (保持向后兼容)
// =============================================================================
// RegisterPlugin 注册插件到全局管理器
func RegisterPlugin(name string, plugin ScanPlugin) error {
// 转换为新的插件结构
newPlugin := &ScanPlugin{
Name: name,
Ports: plugin.Ports,
Types: plugin.Types,
Enabled: true,
ScanFunc: plugin.ScanFunc,
}
return globalPluginManager.RegisterPlugin(newPlugin)
}
// GetGlobalPluginManager 获取全局插件管理器
func GetGlobalPluginManager() *PluginManager {
return globalPluginManager
}
// 向后兼容的全局变量 (已废弃建议使用PluginManager)
var LegacyPluginManager = make(map[string]ScanPlugin)

View File

@ -1,7 +1,15 @@
package Common
// 预定义端口组常量
import "github.com/shadow1ng/fscan/Common/Core"
/*
Ports.go - 端口常量向后兼容层
此文件保持向后兼容实际常量定义已迁移到Core/Constants.go
*/
// 向后兼容的端口常量 - 引用Core包中的定义
var (
WebPorts = "80,81,82,83,84,85,86,87,88,89,90,91,92,98,99,443,800,801,808,880,888,889,1000,1010,1080,1081,1082,1099,1118,1888,2008,2020,2100,2375,2379,3000,3008,3128,3505,5555,6080,6648,6868,7000,7001,7002,7003,7004,7005,7007,7008,7070,7071,7074,7078,7080,7088,7200,7680,7687,7688,7777,7890,8000,8001,8002,8003,8004,8005,8006,8008,8009,8010,8011,8012,8016,8018,8020,8028,8030,8038,8042,8044,8046,8048,8053,8060,8069,8070,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8108,8118,8161,8172,8180,8181,8200,8222,8244,8258,8280,8288,8300,8360,8443,8448,8484,8800,8834,8838,8848,8858,8868,8879,8880,8881,8888,8899,8983,8989,9000,9001,9002,9008,9010,9043,9060,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9200,9443,9448,9800,9981,9986,9988,9998,9999,10000,10001,10002,10004,10008,10010,10051,10250,12018,12443,14000,15672,15671,16080,18000,18001,18002,18004,18008,18080,18082,18088,18090,18098,19001,20000,20720,20880,21000,21501,21502,28018"
MainPorts = "21,22,23,80,81,110,135,139,143,389,443,445,502,873,993,995,1433,1521,3306,5432,5672,6379,7001,7687,8000,8005,8009,8080,8089,8443,9000,9042,9092,9200,10051,11211,15672,27017,61616"
WebPorts = Core.WebPorts // Web服务端口组
MainPorts = Core.MainPorts // 主要服务端口组
)

View File

@ -1,59 +1,49 @@
// Config/types.go
package Common
type HostInfo struct {
Host string
Ports string
Url string
Infostr []string
}
import "github.com/shadow1ng/fscan/Common/Core"
/*
Types.go - 类型定义向后兼容层
此文件保持向后兼容实际类型定义和插件系统已迁移到Core/Plugin.go
*/
// =============================================================================
// 向后兼容的类型别名
// =============================================================================
// HostInfo 主机信息结构 - 引用Core包中的定义
type HostInfo = Core.HostInfo
// ScanPlugin 扫描插件结构 - 引用Core包中的定义
type ScanPlugin = Core.ScanPlugin
// =============================================================================
// 向后兼容的插件类型常量
// =============================================================================
// 在 Common/const.go 中添加
// 插件类型常量
const (
PluginTypeService = "service" // 服务类型插件
PluginTypeWeb = "web" // Web类型插件
PluginTypeLocal = "local" // 本地类型插件
PluginTypeService = Core.PluginTypeService // 服务类型插件
PluginTypeWeb = Core.PluginTypeWeb // Web类型插件
PluginTypeLocal = Core.PluginTypeLocal // 本地类型插件
PluginTypeBrute = Core.PluginTypeBrute // 暴力破解插件
PluginTypePoc = Core.PluginTypePoc // POC验证插件
PluginTypeScan = Core.PluginTypeScan // 扫描探测插件
)
// ScanPlugin 定义扫描插件的结构
type ScanPlugin struct {
Name string // 插件名称
Ports []int // 适用端口
Types []string // 插件类型标签,一个插件可以有多个类型
ScanFunc func(*HostInfo) error // 扫描函数
}
// =============================================================================
// 向后兼容的插件管理函数
// =============================================================================
// 添加一个用于检查插件类型的辅助方法
func (p ScanPlugin) HasType(typeName string) bool {
for _, t := range p.Types {
if t == typeName {
return true
}
}
return false
}
// HasPort 检查插件是否支持指定端口
func (p *ScanPlugin) HasPort(port int) bool {
// 如果没有指定端口列表,表示支持所有端口
if len(p.Ports) == 0 {
return true
}
// 检查端口是否在支持列表中
for _, supportedPort := range p.Ports {
if port == supportedPort {
return true
}
}
return false
}
// PluginManager 管理插件注册
var PluginManager = make(map[string]ScanPlugin)
// RegisterPlugin 注册插件
// RegisterPlugin 注册插件到全局管理器 - 保持向后兼容
func RegisterPlugin(name string, plugin ScanPlugin) {
PluginManager[name] = plugin
Core.RegisterPlugin(name, plugin)
}
// GetGlobalPluginManager 获取全局插件管理器
func GetGlobalPluginManager() *Core.PluginManager {
return Core.GetGlobalPluginManager()
}
// 向后兼容的全局变量 - 引用Core包中的定义
var PluginManager = Core.LegacyPluginManager

View File

@ -1,71 +1,96 @@
package Common
/*
Variables.go - 核心全局变量
import "github.com/shadow1ng/fscan/Common/Core"
只保留最核心的10-15个变量其他变量直接内联到使用点或移除
/*
Variables.go - 全局变量向后兼容层
此文件保持向后兼容实际变量管理已迁移到Core/Manager.go
建议新代码使用Core.GetGlobalConfigManager()获取配置管理器
*/
import "github.com/shadow1ng/fscan/Common/config"
// =============================================================================
// 向后兼容的全局变量 - 直接引用Core包中的定义
// =============================================================================
// 核心扫描配置 (保留最关键的)
// 核心扫描配置
var (
ScanMode string // 扫描模式
ThreadNum int // 线程数
Timeout int64 // 超时时间
DisablePing bool // 禁用ping
LocalMode bool // 本地模式
ScanMode = Core.ScanMode // 扫描模式
ThreadNum = Core.ThreadNum // 线程数
Timeout = Core.Timeout // 超时时间
DisablePing = Core.DisablePing // 禁用ping
LocalMode = Core.LocalMode // 本地模式
)
// 基础认证配置 (合并最常用的)
// 基础认证配置
var (
Username string // 用户名
Password string // 密码
Userdict map[string][]string // 用户字典
Passwords []string // 密码列表
Username = Core.Username // 用户名
Password = Core.Password // 密码
Userdict = Core.Userdict // 用户字典
Passwords = Core.Passwords // 密码列表
)
// 网络配置
var (
HttpProxy string // HTTP代理
Socks5Proxy string // SOCKS5代理
HttpProxy = Core.HttpProxy // HTTP代理
Socks5Proxy = Core.Socks5Proxy // SOCKS5代理
)
// 显示控制
var (
NoColor bool // 禁用颜色
Language string // 语言
LogLevel string // 日志级别
NoColor = Core.NoColor // 禁用颜色
Language = Core.Language // 语言
LogLevel = Core.LogLevel // 日志级别
)
// 端口映射 (核心功能)
// 端口映射
var (
PortMap map[int][]string
DefaultMap []string
PortMap = Core.PortMap // 端口映射
DefaultMap = Core.DefaultMap // 默认映射
)
// 初始化函数
func init() {
// 设置默认值
ScanMode = "all"
ThreadNum = 600
Timeout = 3
LogLevel = LogLevelBaseInfoSuccess
Language = "zh"
// 输出配置 (已在Bridge.go中定义此处不重复声明)
// var Outputfile, OutputFormat
// 初始化映射和切片
Userdict = make(map[string][]string)
PortMap = make(map[int][]string)
DefaultMap = make([]string, 0)
// 其他全局状态 (已在Flag.go中定义此处不重复声明)
// var SlowLogOutput
// 从config模块获取字典和映射
if serviceDict := config.GetGlobalServiceDict(); serviceDict != nil {
Userdict = serviceDict.GetAllUserDicts()
Passwords = serviceDict.GetPasswords()
// =============================================================================
// 向后兼容的访问函数
// =============================================================================
// GetGlobalConfigManager 获取全局配置管理器
func GetGlobalConfigManager() *Core.ConfigManager {
return Core.GetGlobalConfigManager()
}
if probeMapping := config.GetGlobalProbeMapping(); probeMapping != nil {
PortMap = probeMapping.GetAllPortMappings()
DefaultMap = probeMapping.GetDefaultProbes()
// InitGlobalConfig 初始化全局配置
func InitGlobalConfig() {
Core.InitGlobalConfig()
}
// GetScanMode 获取扫描模式
func GetScanMode() string {
return Core.GetScanMode()
}
// SetScanMode 设置扫描模式
func SetScanMode(mode string) {
Core.SetScanMode(mode)
}
// GetThreadNum 获取线程数
func GetThreadNum() int {
return Core.GetThreadNum()
}
// SetThreadNum 设置线程数
func SetThreadNum(num int) {
Core.SetThreadNum(num)
}
// =============================================================================
// 向后兼容的日志级别常量 (已在Bridge.go中定义此处不重复声明)
// =============================================================================
// const LogLevelAll, LogLevelError, etc. - 已在Bridge.go中定义