Skip to content

Commit 4797e18

Browse files
committed
[#] 并发算法修改
1 parent 70fd1cd commit 4797e18

File tree

3 files changed

+68
-12
lines changed

3 files changed

+68
-12
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@ require (
3232
gopkg.in/olivere/elastic.v3 v3.0.75
3333
gopkg.in/yaml.v2 v2.2.2 // indirect
3434
)
35+
36+
go 1.13

iplist.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1 @@
1-
127.0.0.1:3306|mysql
2-
8.8.8.8:2222|ssh
3-
9.9.9.9:6379
4-
127.0.0.1:161
1+
10.211.55.3:22|ssh

util/task.go

Lines changed: 65 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,20 @@ THE SOFTWARE.
2525
package util
2626

2727
import (
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+
117173
func 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

Comments
 (0)