diff --git a/Common/Flag.go b/Common/Flag.go index 1557e12..2316bbd 100644 --- a/Common/Flag.go +++ b/Common/Flag.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/fatih/color" "strings" - "time" ) func Banner() { @@ -31,109 +30,28 @@ func Banner() { } } - // 清屏并隐藏光标 - fmt.Print("\033[H\033[2J\033[?25l") - defer fmt.Print("\033[?25h") - // 创建边框 topBorder := "┌" + strings.Repeat("─", maxLength+2) + "┐" bottomBorder := "└" + strings.Repeat("─", maxLength+2) + "┘" - // 呼吸灯效果循环 - for cycle := 0; cycle < 2; cycle++ { // 2个完整循环 - // 亮度由暗到亮 - for i := 0; i <= 10; i++ { - fmt.Print("\033[H") - dim := float64(i) / 10.0 - - printDimmed(topBorder, colors[0], dim) - fmt.Println() - - for lineNum, line := range lines { - printDimmed("│ ", colors[0], dim) - for _, char := range line { - printDimmed(string(char), colors[lineNum%2], dim) - } - padding := maxLength - len(line) - printDimmed(strings.Repeat(" ", padding)+" │", colors[0], dim) - fmt.Println() - } - - printDimmed(bottomBorder, colors[0], dim) - fmt.Println() - - vStr := fmt.Sprintf(" Fscan Version: %s", version) - printDimmed(vStr, colors[1], dim) - fmt.Print("\n\n") - - time.Sleep(50 * time.Millisecond) - } - - // 亮度由亮到暗 - for i := 10; i >= 0; i-- { - fmt.Print("\033[H") - dim := float64(i) / 10.0 - - printDimmed(topBorder, colors[0], dim) - fmt.Println() - - for lineNum, line := range lines { - printDimmed("│ ", colors[0], dim) - for _, char := range line { - printDimmed(string(char), colors[lineNum%2], dim) - } - padding := maxLength - len(line) - printDimmed(strings.Repeat(" ", padding)+" │", colors[0], dim) - fmt.Println() - } - - printDimmed(bottomBorder, colors[0], dim) - fmt.Println() - - vStr := fmt.Sprintf(" Fscan Version: %s", version) - printDimmed(vStr, colors[1], dim) - fmt.Print("\n\n") - - time.Sleep(50 * time.Millisecond) - } - } - - // 最后显示完整亮度的版本 - fmt.Print("\033[H") - printDimmed(topBorder, colors[0], 1.0) - fmt.Println() + // 打印banner + fmt.Println(topBorder) for lineNum, line := range lines { - printDimmed("│ ", colors[0], 1.0) - for _, char := range line { - printDimmed(string(char), colors[lineNum%2], 1.0) - } + fmt.Print("│ ") + // 使用对应的颜色打印每个字符 + c := color.New(colors[lineNum%2]) + c.Print(line) + // 补齐空格 padding := maxLength - len(line) - printDimmed(strings.Repeat(" ", padding)+" │", colors[0], 1.0) - fmt.Println() + fmt.Printf("%s │\n", strings.Repeat(" ", padding)) } - printDimmed(bottomBorder, colors[0], 1.0) - fmt.Println() + fmt.Println(bottomBorder) - vStr := fmt.Sprintf(" Fscan Version: %s", version) - printDimmed(vStr, colors[1], 1.0) - fmt.Print("\n\n") -} - -// 辅助函数:打印带透明度的文字 -func printDimmed(text string, col color.Attribute, dim float64) { - if dim < 0.2 { - fmt.Print(strings.Repeat(" ", len(text))) - return - } - - intensity := int(255 * dim) - fmt.Printf("\033[38;2;%d;%d;%dm%s\033[0m", - int(float64(0)*dim), - intensity, - int(float64(0)*dim), - text) + // 打印版本信息 + c := color.New(colors[1]) + c.Printf(" Fscan Version: %s\n\n", version) } func Flag(Info *HostInfo) { diff --git a/Core/Scanner.go b/Core/Scanner.go index 69e6131..3ccb0d8 100644 --- a/Core/Scanner.go +++ b/Core/Scanner.go @@ -33,11 +33,56 @@ func Scan(info Common.HostInfo) { switch { case Common.LocalMode: // 本地信息收集模式 - Common.LogInfo("执行本地信息收集") + LocalScan = true + + // 定义本地模式允许的插件 + validLocalPlugins := map[string]bool{ + "localinfo": true, + // 添加其他 ModeLocal 中定义的插件 + } + + if Common.ScanMode != "" && Common.ScanMode != Common.ModeLocal { + // 如果指定了模式但不是 ModeLocal,检查是否是合法的单插件 + if !validLocalPlugins[Common.ScanMode] { + Common.LogError(fmt.Sprintf("无效的本地模式插件: %s, 仅支持 localinfo", Common.ScanMode)) + return + } + // ScanMode 保持为单插件名 + } else { + // 没有指定模式或指定了 ModeLocal,使用完整的本地模式 + Common.ScanMode = Common.ModeLocal + } + + if Common.ScanMode == Common.ModeLocal { + Common.LogInfo("执行本地信息收集 - 使用全部本地插件") + } else { + Common.LogInfo(fmt.Sprintf("执行本地信息收集 - 使用插件: %s", Common.ScanMode)) + } + executeScans([]Common.HostInfo{info}, &ch, &wg) case len(Common.URLs) > 0: // Web模式 + WebScan = true + + // 定义Web模式允许的插件 + validWebPlugins := map[string]bool{ + "webtitle": true, + "webpoc": true, + } + + if Common.ScanMode != "" && Common.ScanMode != Common.ModeWeb { + // 如果指定了模式但不是 ModeWeb,检查是否是合法的单插件 + if !validWebPlugins[Common.ScanMode] { + Common.LogError(fmt.Sprintf("无效的Web插件: %s, 仅支持 webtitle 和 webpoc", Common.ScanMode)) + return + } + // ScanMode 保持为单插件名 + } else { + // 没有指定模式或指定了 ModeWeb,使用完整的Web模式 + Common.ScanMode = Common.ModeWeb + } + var targetInfos []Common.HostInfo for _, url := range Common.URLs { urlInfo := info @@ -47,7 +92,12 @@ func Scan(info Common.HostInfo) { urlInfo.Url = url targetInfos = append(targetInfos, urlInfo) } - Common.LogInfo("开始Web扫描") + + if Common.ScanMode == Common.ModeWeb { + Common.LogInfo("开始Web扫描 - 使用全部Web插件") + } else { + Common.LogInfo(fmt.Sprintf("开始Web扫描 - 使用插件: %s", Common.ScanMode)) + } executeScans(targetInfos, &ch, &wg) default: