以前用Python写过这个工具,前两天看了golang的基础,就想着用这个语言把这个工具重写一遍

先放张图

用法

    Example : Buster.exe -u=https://www.baidu.com -d=asp.txt -t=5
Buster是你的程序名字
-u后面填网址参数,格式如上
-d选字典
-t是线程数
当你第一次运行请直接在命令行运行你的程序,什么参数都别加,他会有提示信息告诉你怎么做的

话不多说,直接上代码,字典采用的以前搜集的一个珍藏的大字典,跑起来可能耗时比较久,文件外链会放在底下

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 //等待goroutine完成 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() //等待goroutine完成
}
} 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() //把处理后的需要爆破的url全部传到信道urls
ReturnBurstURL(dicFile, baseURL) //单独开goroutine从信道no404URL取数据写入文件
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()
}
}() //并发访问网址并将状态码不为404的网址加入信道no404URL
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)
}
} //返回HTTP访问状态码
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"
}
} //把处理后的需要爆破的url全部传到信道urls
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())
}
}

只编译了win平台下的,如果有需要可以自行编译

源码及字典及win程序

密码: g1gd

Golang初练手-多线程网站路径爆破的更多相关文章

  1. Windows API初练手 -- 疯狂写文件代码

    警告:恶作剧软件,慎用!仅供初学者研究代码所用!!! 提示:默认文件创建目录在"D:\test",如果需要使用的话请自行更改目录. 1. Windows API 版本 (调用系统函 ...

  2. Selenium_WebDriver登录模拟鼠标移动切换窗体等操作练习(cssSelector初练手)_Java

    cssSelector 据说cssSelector比xpath快. 所以,有固定ID属性的页面元素用By.id或者By.cssSelector("#id属性值")来找,有class ...

  3. Java学习路径及练手项目合集

    Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 实验楼上的[Java 学习路径]中将首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE ...

  4. Golang简易版 网站路径扫描demo

    package main import ( "bufio" "fmt" "net/http" "os" "re ...

  5. Python之路【第二十四篇】:Python学习路径及练手项目合集

      Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...

  6. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

  7. 微信小程序初体验,入门练手项目--通讯录,部署上线(二)

    接上一篇<微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器>:https://www.cnblogs.com/chengxs/p/9898670.html 开发微信小程序最尴尬 ...

  8. 微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器(一)

    内容: 一.前言 二.相关概念 三.开始工作 四.启动项目起来 五.项目结构 六.设计理念 七.路由 八.部署线上后端服务 同步交流学习社区: https://www.mwcxs.top/page/4 ...

  9. thinkphp5项目--练手--企业单车网站(九)(友情链接)

    thinkphp5项目--练手--企业单车网站(九)(友情链接) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Webs ...

随机推荐

  1. Spark核心RDD:combineByKey函数详解

    https://blog.csdn.net/jiangpeng59/article/details/52538254 为什么单独讲解combineByKey? 因为combineByKey是Spark ...

  2. latex 公式 和排版

    http://bbs.chinatex.org/forum.php?mod=viewthread&tid=7423 http://blog.sina.com.cn/s/blog_5e16f17 ...

  3. BestCoder Round #55 ($)

    C 构造一个矩阵,然后采用矩阵快速幂 #include <iostream> #include <algorithm> #include <string.h> #i ...

  4. XML系列之--创建电文格式的XML(一)

    关于XML,学校那会,老师在口中仅仅提及,自己也未曾深入接触过,仅是些将最基本XML文件内容显示在web定义的表格中之类的简单操作,如今项目中的收发电文涉及到复杂XML的操作.趁此契机好好回顾下XML ...

  5. 计算属性(computed)、方法(methods)和侦听属性(watch)的区别与使用场景

    1,computed 能实现的,methods 肯定也能够实现. 2,不同之处在于,computed 是基于他的依赖进行缓存的,computed 只有在他的的相关依赖发生改变的时候才会重新计算. 如果 ...

  6. python中的作用域以及内置函数globals()-全局变量、locals()-局部变量

    在python中,函数会创建一个自己的作用域,也称为为命名空间.这意味着在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 通过内置函数globals()返回的是python解释器能知道的变 ...

  7. Linux基础命令---文本编辑tee

    tee 将标准输入的内容复制到指定的文件中,同时在标准输出中显示. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora.   1.语法   ...

  8. JustOj 1936: 小明A+B

    题目描述 小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算. 对于大于等于100的整数, 小明仅保留该数的最后两位进行计算, 如果计算结果大于等于 ...

  9. js 实现复制粘贴时注意方法中需要两次点击实现的bug

    方法一:利用ZeroClipboard 详见 :http://www.jb51.net/article/22403.htm 1先引入 <script type="text/javasc ...

  10. PXC备份方式总结

    记录一下. 1.mysqldump数据导出 关于GTID: GTID是MySQL5.6以后,加入了全局事务 ID (GTID) 来强化数据库的主备一致性,故障恢复,以及容错能力. A global t ...