@@ -25,20 +25,20 @@ THE SOFTWARE.
2525package util
2626
2727import (
28- "github.com/urfave/cli"
2928 "github.com/sirupsen/logrus"
30-
29+ "github.com/urfave/cli"
3130 "gopkg.in/cheggaaa/pb.v2"
3231
33- "x-crack/models"
3432 "x-crack/logger"
35- "x-crack/vars"
36- "x-crack/util/hash"
33+ "x-crack/models"
3734 "x-crack/plugins"
35+ "x-crack/util/hash"
36+ "x-crack/vars"
3837
39- "sync"
40- "strings"
4138 "fmt"
39+ "runtime"
40+ "strings"
41+ "sync"
4242 "time"
4343)
4444
@@ -114,6 +114,62 @@ func ExecuteTask(tasks []models.Service) () {
114114 waitTimeout (& wg , vars .TimeOut )
115115}
116116
117+ func RunTask (tasks []models.Service ) {
118+ totalTask := len (tasks )
119+ vars .ProgressBar = pb .StartNew (totalTask )
120+ vars .ProgressBar .SetTemplate (`{{ rndcolor "Scanning progress: " }} {{ percent . "[%.02f%%]" "[?]"| rndcolor}} {{ counters . "[%s/%s]" "[%s/?]" | rndcolor}} {{ bar . "「" "-" (rnd "ᗧ" "◔" "◕" "◷" ) "•" "」" | rndcolor }} {{rtime . | rndcolor}} ` )
121+
122+ wg := & sync.WaitGroup {}
123+
124+ // 创建一个buffer为vars.threadNum * 2的channel
125+ taskChan := make (chan models.Service , vars .ScanNum * 2 )
126+
127+ // 创建vars.ThreadNum个协程
128+ for i := 0 ; i < vars .ScanNum ; i ++ {
129+ go crackPassword (taskChan , wg )
130+ }
131+
132+ // 生产者,不断地往taskChan channel发送数据,直到channel阻塞
133+ for _ , task := range tasks {
134+ wg .Add (1 )
135+ taskChan <- task
136+ }
137+
138+ close (taskChan )
139+ waitTimeout (wg , vars .TimeOut * 2 )
140+ }
141+
142+ // 每个协程都从channel中读取数据后开始扫描并保存
143+ func crackPassword (taskChan chan models.Service , wg * sync.WaitGroup ) {
144+ for task := range taskChan {
145+ vars .ProgressBar .Increment ()
146+
147+ if vars .DebugMode {
148+ logger .Log .Debugf ("checking: Ip: %v, Port: %v, [%v], UserName: %v, Password: %v, goroutineNum: %v" , task .Ip , task .Port ,
149+ task .Protocol , task .Username , task .Password , runtime .NumGoroutine ())
150+ }
151+
152+ var k string
153+ protocol := strings .ToUpper (task .Protocol )
154+
155+ if protocol == "REDIS" || protocol == "FTP" || protocol == "SNMP" {
156+ k = fmt .Sprintf ("%v-%v-%v" , task .Ip , task .Port , task .Protocol )
157+ } else {
158+ k = fmt .Sprintf ("%v-%v-%v" , task .Ip , task .Port , task .Username )
159+ }
160+
161+ h := hash .MakeTaskHash (k )
162+ if hash .CheckTashHash (h ) {
163+ wg .Done ()
164+ continue
165+ }
166+
167+ fn := plugins .ScanFuncMap [protocol ]
168+ models .SaveResult (fn (task ))
169+ wg .Done ()
170+ }
171+ }
172+
117173func Scan (ctx * cli.Context ) (err error ) {
118174 if ctx .IsSet ("debug" ) {
119175 vars .DebugMode = ctx .Bool ("debug" )
@@ -155,7 +211,8 @@ func Scan(ctx *cli.Context) (err error) {
155211 aliveIpList := CheckAlive (ipList )
156212 if uErr == nil && pErr == nil {
157213 tasks , _ := GenerateTask (aliveIpList , userDict , passDict )
158- DistributionTask (tasks )
214+ RunTask (tasks )
215+ // DistributionTask(tasks)
159216 }
160217 return err
161218}
0 commit comments