@@ -8,17 +8,26 @@ import (
88 _ "github.com/miekg/dns"
99 "io"
1010 "log"
11+ "net"
1112 "os"
1213 "strings"
14+ "sync"
1315)
1416
1517const DEBUG = false
1618const A uint16 = 0x01
19+ const MaxThread int = 100
20+
21+ var tmpChain = make (chan struct {}, MaxThread )
22+ var waitGroup sync.WaitGroup
1723
1824func GetAName (DNSServer , domain string ) bool {
25+ defer waitGroup .Done ()
1926 msg := new (dns.Msg )
2027 msg .SetQuestion (dns .Fqdn (domain ), dns .TypeA )
28+ tmpChain <- struct {}{}
2129 in , err := dns .Exchange (msg , DNSServer + ":53" )
30+ <- tmpChain
2231 if err != nil {
2332 if DEBUG {
2433 log .Printf ("[x] %s" , err )
@@ -38,7 +47,7 @@ func usage() {
3847 fmt .Fprintf (os .Stderr ,
3948 `GoDigDomain: A Domain Name Burst Tool
4049
41- Usage: gdd -dn Domain [-ds DNSServer] [-dt DictFile]
50+ Usage: gdd -dn Domain [-ds DNSServer(s) ] [-dt DictFile]
4251
4352Options:
4453` )
@@ -53,11 +62,23 @@ func isFileExist(path string) bool {
5362 return true
5463}
5564
65+ func createDNSServerList (DNSServers string ) []string {
66+ dnsServers := strings .Split (DNSServers , "," )
67+ ret := make ([]string , len (dnsServers ))
68+ for i := 0 ; i < len (dnsServers ); i ++ {
69+ if net .ParseIP (dnsServers [i ]) == nil {
70+ continue
71+ }
72+ ret [i ] = dnsServers [i ]
73+ }
74+ return ret
75+ }
76+
5677func main () {
5778 log .SetFlags (log .Lshortfile )
5879 flag .Usage = usage
5980
60- dnsServer := flag .String ("ds" , "114.114.114.114" , "DNS服务器" )
81+ dnsServer := flag .String ("ds" , "114.114.114.114" , "DNS服务器(多个服务器用逗号[,]隔开) " )
6182 domain := flag .String ("dn" , "" , "域名" )
6283 dict := flag .String ("dt" , "./dict.txt" , "域名字典" )
6384 flag .Parse ()
@@ -82,6 +103,8 @@ func main() {
82103 defer f .Close ()
83104
84105 lines := bufio .NewReader (f )
106+ dnsServers := createDNSServerList (* dnsServer )
107+
85108 for {
86109 line , _ , err := lines .ReadLine ()
87110 if err != nil {
@@ -96,7 +119,10 @@ func main() {
96119 return
97120 }
98121 domainPrefix := string (line )
99- GetAName (* dnsServer , fmt .Sprintf ("%s.%s" , strings .TrimPrefix (domainPrefix , "\n \r " ), * domain ))
122+ for i := 0 ; i < len (dnsServers ); i ++ {
123+ waitGroup .Add (1 )
124+ go GetAName (dnsServers [i ], fmt .Sprintf ("%s.%s" , strings .TrimPrefix (domainPrefix , "\n \r " ), * domain ))
125+ }
100126 }
101-
127+ waitGroup . Wait ()
102128}
0 commit comments