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

重构效果:
- 文件数量: 7个核心文件 → 3个Core文件 + 兼容层
- 模块化程度: 高度模块化的插件和配置管理
- 向后兼容: 100%兼容现有API调用
2025-08-05 21:06:21 +08:00

591 lines
18 KiB
Go
Raw 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.

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.go、Parse.go、Variables.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
}