1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| package main
import ( "bufio" "flag" "fmt" "io/ioutil" "net/http" "os" "sync" )
var urls chan string var no404URL = make(chan string) var wg sync.WaitGroup
func main() {
var baseURL string var dicPath string var threadCount int flag.StringVar(&baseURL, "u", "https://www.baidu.com", "website which you want to burst") flag.StringVar(&dicPath, "d", "asp.txt", "dic which you want to use") flag.IntVar(&threadCount, "t", 5, "number of Thread") flag.Parse()
if len(os.Args) == 1 { fmt.Println("------------------------------------") fmt.Println(" Author | Akkuamn") fmt.Println("------------------------------------") fmt.Println(" Update-v1.0 | 2017-02-07") fmt.Println("-------------------------------------") fmt.Printf("\nUsage : \n\tExample : %s -u=https://www.baidu.com -d=asp.txt -t=5\n\n", os.Args[0]) fmt.Printf("View more help via %s -h\n\n", os.Args[0]) listDic("dic") } else { dicPath = "./dic/" + dicPath start(baseURL, dicPath, threadCount) wg.Wait() } }
func start(baseURL string, dicPath string, threadCount int) {
dicFile, dicError := os.OpenFile(dicPath, os.O_RDONLY, 0) if dicError != nil { fmt.Printf("\nOpenFile Error:文件打开出错,请检查字典文件是否存在,或文件名是否准确\n") return } defer dicFile.Close()
ReturnBurstURL(dicFile, baseURL)
go func() { resultTxt, err := os.OpenFile("result.txt", os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0660) if err != nil { fmt.Println("OpenFile Error:" + err.Error()) } resultWriter := bufio.NewWriter(resultTxt) defer resultTxt.Close() for { _, err = resultWriter.WriteString(<-no404URL) if err != nil { fmt.Println("resultWriter Error:" + err.Error()) } resultWriter.Flush() } }()
for i := 0; i < threadCount; i++ { wg.Add(1) go func(i int) { for len(urls) > 0 { url := <-urls status := HTTPStatus(url) fmt.Printf("[%d]%s-----%s\n", i, status, url) if status != "404 Not Found" { no404URL <- status + "-----" + url + "\n" } } wg.Done() }(i) } }
func HTTPStatus(url string) (status string) { client := http.DefaultClient reqest, err := http.NewRequest("HEAD", url, nil) if err == nil { reqest.Header.Set("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:51.0) Gecko/20100101 Firefox/51.0") reqest.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") response, err1 := client.Do(reqest) if err1 != nil { fmt.Println("HTTPRequest Error:" + err1.Error()) }
defer response.Body.Close() return response.Status } else { fmt.Println("NewRequest Error:" + err.Error()) return "400 Bad Request" } }
func ReturnBurstURL(fURL *os.File, baseurl string) { var urlList []string allURLTxt := bufio.NewScanner(fURL) for allURLTxt.Scan() { newurl := baseurl + "/" + allURLTxt.Text() urlList = append(urlList, newurl) } urls = make(chan string, len(urlList)) for _, url := range urlList { urls <- url } fmt.Printf("\n读取字典完成,准备开始,请等待...\n") }
func listDic(dicDir string) { dirList, err := ioutil.ReadDir(dicDir) if err != nil { fmt.Println("ReadDir Error : " + err.Error() + "\n") } fmt.Println("Dic you can select : ") for _, file := range dirList { fmt.Printf(" %s\n", file.Name()) } }
|