iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >简单实现Socks5代理(Python&
  • 637
分享到

简单实现Socks5代理(Python&

简单Python 2023-01-31 02:01:05 637人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

只实现了CONNECT功能 参考:点击打开链接 python版: import Socket import threading import select import time IsNeedAuth=False Username=

只实现了CONNECT功能

参考:点击打开链接


python版:

import Socket
import threading
import select
import time

IsNeedAuth=False
Username='admin'
PassWord='123456'
Port=7456

def prxoy(sock,address): 
    cs = sock  
    DspPort=0
    DspAddr=''    
    try:
        recv= cs.recv(512)
        VER=recv[0:1]
        #MethodNum=ord(recv[1:2])
        #Methods=[]
        #for i in range(0,MethodNum):
           # Methods.append(ord(recv[2+i:3+i]))
        if(IsNeedAuth):          #Need AUTHENICATioN
            cs.send(b'\x05\x02')     #Reply
            recv= cs.recv(1024)
            Ver=recv[0:1]
            UserLen=ord(recv[1:2])
            User=recv[2:2+UserLen]
            PassLen=ord(recv[2+UserLen:3+UserLen])
            Pass=recv[3+UserLen:3+UserLen+PassLen]
            if (User==Username and Pass==Password):
                cs.send(Ver+'\x00')
            else:
                cs.send(Ver+'\xff')
                cs.close()
                return 
        else:
            cs.send(VER+'\x00')  #  NO AUTHENICATION REQUEST
        try :
            recv= cs.recv(1024)
        except Exception,ex:
             print 'Client is Closed'
             return
        CMD=ord(recv[1:2])
        ATYP=ord(recv[3:4])
        if(CMD ==0x01):             # CONNECT CMD
            if (ATYP==03):                      # DOMaiNNAME
                AddrLen=ord(recv[4:5])
                DspPort=256*ord(recv[5+AddrLen:5+AddrLen+1])+ord(recv[1+5+AddrLen:5+AddrLen+2])
                DspAddr=socket.gethostbyname(recv[5:5+AddrLen])
            elif (ATYP==01):                     #IPV4
                if (recv.count('.')==4):    # Asiic  fORMat  split by  '.'
                    AddrLen=ord(recv[4:5])
                    DspAddr=recv[5:5+AddrLen]
                    DspPort=256*ord(recv[5+AddrLen:5+AddrLen+1])+ord(recv[5+AddrLen+1:5+AddrLen+2])
                else:                                      #four hex number format
                    DspAddr=recv[4:8]
                    DspAddrr=''
                    for i in DspAddr:
                        DspAddrr +=str(ord(i))+'.'
                    DspAddr=DspAddrr[:-1]
                    DspPort=256*ord(recv[4+4:4+4+1])+ord(recv[4+4+1:4+4+2])
            else:
                print "IPV6 is not support"
                return
            cs.send(VER+'\x00\x00\x01\x00\x00\x00\x00\x00\x00')   # REPLY
            forward(cs,DspAddr,DspPort)
        else :
            print "Don't suport  this Cmd",CMD
    except Exception,e:
        print e

def forward(cs,DspAddr,DspPort):
    try:
        #print DspAddr +'\n'
        ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        
        ss.connect((DspAddr, DspPort))
    except Exception,e:
                print "Connect to ",DspAddr,"Fail"
                return
    socks=[]
    socks.append(cs)
    socks.append(ss)
    while(True):
       try:
        r, w, e = select.select(socks, [], [])
        for s in r:
            if s is cs:
                recv=cs.recv(2048)
                caddr,cport= cs.getpeername()
                if (len(recv) >0):
                    saddr,sport=ss.getpeername()
                    print caddr,':',cport,'<',len(recv),'>',saddr,':',sport
                    ss.send(recv)
                    
                else:
                    for sock in socks:
                        sock.close()
                    return
            elif s is ss:           
                recv=ss.recv(2048)
                saddr,sport= ss.getpeername()                
                if (len(recv) >0):
                    caddr,cport= cs.getpeername()
                    print saddr,':',sport,'<',len(recv),'>',caddr,':',cport
                    cs.send(recv)
                else:
                    for sock in socks:
                        sock.close()
                    return
       except Exception,e:
            print "Translate data error"
            break            

if __name__ == "__main__":
    ls = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ls.bind(('0.0.0.0',Port))
    ls.listen(500)
    while (True):
        clientSock, address = ls.accept()
        thread = threading.Thread(target=prxoy, args=(clientSock,address))
        thread.start()


C#版:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.net.Sockets;
using System.Net;
using System.Threading;
using System.Collections;

namespace ProxyTest
{
    class Program
    {
        static string Username = "test";

        static string Password = "test";

        static public bool IsRun = false;
        static bool IsNeedAuth = false;
        static Socket ProxySocket;
        static int ListenPort = 1080;
        static ArrayList ClientSocks = new ArrayList();
        static int SockNum = 0;
        static object obj = new object();
        static void BeginProxy()
        {
            IsRun = true;
            IPAddress ip = IPAddress.Parse("0.0.0.0");
            ProxySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.tcp);
            ProxySocket.Bind(new IPEndPoint(ip, ListenPort));
            ProxySocket.Listen(100);
            Console.WriteLine("Bind On 0.0.0.0:" + ListenPort.ToString());
            while (IsRun)
            {
                try
                {
                    Socket clientSocket = ProxySocket.Accept();
                    Console.WriteLine(" 接受了来自 " + ((IPEndPoint)clientSocket.RemoteEndPoint).Address.ToString() +":" +((IPEndPoint)clientSocket.RemoteEndPoint).Port.ToString() + "的连接");
                    ClientSocks.Add(clientSocket);
                    Thread T = new Thread(ProcessClient);
                    T.Start(clientSocket);
                }
                catch
                {
                    break;
                }
            }

        }



        static void StartTransData(Socket clisock, Socket sersock)
        {
            int SocketNum;
            byte[] RecvBuf = new byte[1024*4];
            lock (obj)
            {
                SocketNum = ++SockNum;
            }
            int Len;


            String DstHost = ((IPEndPoint)sersock.RemoteEndPoint).Address.ToString() + ":";
            DstHost += ((IPEndPoint)sersock.RemoteEndPoint).Port.ToString();
            String SrcHost = ((IPEndPoint)sersock.LocalEndPoint).Address.ToString() + ":";
            SrcHost += ((IPEndPoint)sersock.LocalEndPoint).Port.ToString();
            while (IsRun)
            {

                try
                {
                    if (clisock.Poll(1000, SelectMode.SelectRead))
                    {

                        Len = clisock.Receive(RecvBuf);



                        if (Len == 0)
                        {
                            clisock.Shutdown(SocketShutdown.Both);
                            clisock.Close();
                            sersock.Shutdown(SocketShutdown.Both);
                            sersock.Close();
                            break;
                        }
                        else
                        {
                            Len = sersock.Send(RecvBuf, 0, Len, 0);
                            Console.WriteLine("【" + SockNum.ToString() + "】" +  SrcHost + "==>" + DstHost + "[发送" + Len.ToString() + "字节]");


                        }

                    }
                    if (sersock.Poll(1000, SelectMode.SelectRead))
                    {

                        Len = sersock.Receive(RecvBuf);


                        if (Len == 0)
                        {
                            sersock.Shutdown(SocketShutdown.Both);
                            sersock.Close();
                            clisock.Shutdown(SocketShutdown.Both);
                            clisock.Close();
                            break;
                        }
                        else
                        {
                            Len = clisock.Send(RecvBuf, 0, Len, 0);
                            Console.WriteLine("【" + SockNum.ToString() + "】" + DstHost + " ==> " + SrcHost + " [接收" + Len.ToString() + "字节]");


                        }



                    }
                }
                catch
                {

                    break;


                }
            }


        }
        static void ProcessClient(object sock)
        {
            byte[] RecvBuf = new byte[1024];
            Socket CliSock = (Socket)sock;
            Socket ServerSock;
            IPAddress ip = null;
            int Port = 0;
            byte[] buf = new byte[1024];
            int Len = 0;
            try
            {
                Len = CliSock.Receive(buf);

                byte SockVer = buf[0];

                if (IsNeedAuth)
                {
                    CliSock.Send(new byte[] { 0x05, 0x02 });  //需要验证
                    Len = CliSock.Receive(buf);
                    byte UserLen = buf[1];
                    byte[] User = new byte[UserLen];
                    Buffer.BlockCopy(buf, 2, User, 0, UserLen);



                    byte PassLen = buf[2 + UserLen];
                    byte[] Pass = new byte[PassLen];

                    Buffer.BlockCopy(buf, 3 + PassLen, Pass, 0, PassLen);
                    if (Encoding.ASCII.GetString(User) == Username && Encoding.ASCII.GetString(Pass) == Password)
                    {
                        CliSock.Send(new byte[] { 0x05, 0x00 });
                    }
                    else
                    {
                        CliSock.Send(new byte[] { 0x05, 0xff });
                        CliSock.Close();
                    }
                }
                else
                {
                    CliSock.Send(new byte[] { 0x05, 0x00 });
                }
            }
            catch
            {

            }
            try
            {
                Len = CliSock.Receive(RecvBuf);
                byte CMD = RecvBuf[1];
                byte ATYP = RecvBuf[3];
                if (CMD == 0x01)
                {
                    if (ATYP == 0x01)
                    {
                        if (RecvBuf.ToString().Split('.').Length == 5)
                        {
                            byte AddrLen = RecvBuf[4];
                            byte[] Addr = new byte[AddrLen];
                            Buffer.BlockCopy(RecvBuf, 5, Addr, 0, AddrLen);
                            IPAddress[] ips = Dns.GetHostAddresses(Addr.ToString());
                            ip = ips[0];
                            Port = 256 * RecvBuf[AddrLen + 5] + RecvBuf[AddrLen + 6];
                        }
                        else
                        {
                            byte[] Addr = new byte[4];
                            Buffer.BlockCopy(RecvBuf, 4, Addr, 0, 4);
                            String sip = "";
                            foreach (byte b in Addr)
                            {
                                sip += b.ToString() + ".";
                            }
                            IPAddress[] ips = Dns.GetHostAddresses(sip.Remove(sip.Length - 1));
                            ip = ips[0];
                            Port = 256 * RecvBuf[9] + RecvBuf[10];
                        }
                    }
                    else if (ATYP == 0x03)
                    {
                        byte AddrLen = RecvBuf[4];
                        byte[] Addr = new byte[AddrLen];
                        Buffer.BlockCopy(RecvBuf, 5, Addr, 0, AddrLen);

                        String HostName = System.Text.Encoding.Default.GetString(Addr);
                        IPAddress[] ips = Dns.GetHostAddresses(HostName);
                        ip = ips[0];
                        Port = 256 * RecvBuf[AddrLen + 5] + RecvBuf[AddrLen + 6];
                    }

                    else
                    {

                        return;
                    }

                    CliSock.Send(new byte[] { 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
                }
            }
            catch
            {
                return;
            }

            try
            {
                ServerSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                ServerSock.Connect(ip, Port);

                StartTransData(CliSock, ServerSock);
            }
            catch
            {
                CliSock.Shutdown(SocketShutdown.Both);
                CliSock.Close();
                return;
            }


        }

        static void Main(string[] args)
        {
            BeginProxy();
        }
    }
}





--结束END--

本文标题: 简单实现Socks5代理(Python&

本文链接: https://www.lsjlt.com/news/187006.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 简单实现Socks5代理(Python&
    只实现了CONNECT功能 参考:点击打开链接 Python版: import socket import threading import select import time IsNeedAuth=False Username=...
    99+
    2023-01-31
    简单 Python
  • 如何实现socks5全局代理
    要实现socks5全局代理,需要进行以下步骤:1. 安装socks5服务器:首先需要在你的服务器或者本地机器上搭建一个socks5服...
    99+
    2023-08-18
    socks5
  • 怎么实现socks5全局代理
    要实现Socks5全局代理,你可以按照以下步骤进行操作:1. 首先,你需要一个Socks5代理服务器。你可以使用开源的Socks5服...
    99+
    2023-08-19
    socks5
  • python 使用socks5 设置全局代理
    要设置全局代理,可以使用 `socks` 库来实现。下面是一个示例代码,可以将全局代理设置为 SOCKS5 代理:```python...
    99+
    2023-09-16
    python
  • GBDT算法原理以及实例理解(含Python代码简单实现版)
    一、算法简介: GBDT 的全称是 Gradient Boosting Decision Tree,梯度提升树,在传统机器学习算法中,GBDT算的上是TOP前三的算法。 想要理解GBDT的真正意义,那...
    99+
    2023-09-01
    python 算法 机器学习
  • Python实现简单的API
    代码实现 # coding:utf-8 import json from urlparse import parse_qs from wsgiref.simple_server import make_server # 定...
    99+
    2023-01-31
    简单 Python API
  • python实现socket简单通信的示例代码
    首先先来简单介绍下socket: (具体更详细介绍的可以在网上找找,都讲得非常详细),这里主要是我自己的一些理解。 socket是在应用层与传输层之间的一个抽象层,它的本质是编程接...
    99+
    2024-04-02
  • Java代码实现简单酒店管理系统
    本文实例为大家分享了Java实现简单酒店管理系统的具体代码,供大家参考,具体内容如下 为某个酒店编写程序:酒店管理系统,模拟订房、退房和打印所有房间状态等功能 1.该系统的用户是:酒...
    99+
    2024-04-02
  • C++简单实现shared_ptr的代码
    一、一些说明 1.智能指针用于资源管理,为了保证资源的操作得到顺利的执行防止资源泄露,因此大多数实现都以noexcept在参数列表后声明为不抛出异常。 2.对于有些明确不需要更改调用...
    99+
    2024-04-02
  • Python实现简单的图书管理系统
    本文实例为大家分享了Python实现图书管理系统的具体代码,供大家参考,具体内容如下 题目要求: 利用Python写一个简易的图书管理系统 需求: 图书管理系统 1.查询图书2.增加...
    99+
    2024-04-02
  • Python+Django实现简单HelloWord网页的示例代码
    目录安装Django创建Django项目默认文件创建APP实现简单HelloWord网页启动django项目安装Django 使用anaconda在python环境中安装django...
    99+
    2024-04-02
  • python实现简单通讯录管理系统
    本文实例为大家分享了python实现通讯录管理系统的具体代码,供大家参考,具体内容如下 =====欢迎使用通讯录管理系统=====1.添加2.修改3.册除4.查询5.排序6.退出==...
    99+
    2024-04-02
  • 实现的简单python例子
    尊重作者,本文转载自:http://blog.csdn.net/oMuYeJingFeng1/article/details/23822279 1、输入3个数字,从小到大输出:x = int(input('please input x:')...
    99+
    2023-01-31
    例子 简单 python
  • python 多线程简单实现
    1. 线程是什么?线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。2 为什么要用线程?a 单个线程可以在进程中独立运行c 并行操作,适用于C/S架构3 python怎么生成线程(将函数生...
    99+
    2023-01-31
    多线程 简单 python
  • 简单实现并发:python concur
    可以使用python 3中的concurrent模块,如果python环境是2.7的话,需要下载https://pypi.python.org/packages/source/f/futures/futures-2.1.6.tar.gz#m...
    99+
    2023-01-31
    简单 python concur
  • 有哪些简单实用Python代码
    这篇文章主要讲解了“有哪些简单实用Python代码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些简单实用Python代码”吧!1. 交换两个变量# a = ...
    99+
    2023-06-16
  • python简单构建可用IP代理池
    以下为简单示例: import requests import re import telnetlib url='http://www.66ip.cn/nmtq.phpgetnum...
    99+
    2024-04-02
  • python用c/s实现服务器简单管理
    由于有大量的windows虚拟机用来做一些任务。这些windows上的机器程序要经常更新。每次部署升级,需要一台台的远程桌面上去操作,进行简单升级操作。这样讲花费大量时间。并且伴随windows机器的增加,将更加难管理。 无需远程桌面,...
    99+
    2023-01-31
    简单 服务器 python
  • 利用Python实现简单的验证码处理
    目录序言环境模块代码展示完整代码序言 我们在做采集数据的时候,过快或者访问频繁,或者一访问就给弹出验证码,然后就蚌珠了~ 今天就给大家来一个简单处理验证码的方法 环境模块 这里需要用...
    99+
    2024-04-02
  • PID原理与python的简单实现和调参
    目录一、前言二、PID控制算法详解2.1 比例控制算法2.1.1 比例控制python简单示意2.1.2 比例控制存在的一些问题2.2 积分控制算法(消除稳态误差)2.2.1 pyt...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作