Socks5代码的一点解析
来源:互联网 发布:windows上软件无法卸载 编辑:程序博客网 时间:2024/06/06 00:22
最近,看了一下Socks5的RFC,在网上找了一下Scoks5的Python实现,有几个地方自己看得不是很明白,就多查看了一下,Wireshark抓包也看了一下,稍微记录一下。
网上找的源码如下:其中我不是很明白的地方在如下:
1: #!/usr/bin/python2: # Filename s5.py3: # Python Dynamic Socks5 Proxy4: # Usage: python s5.py 10805: # Background Run: nohup python s5.py 1080 &6:7: import socket, sys, select, SocketServer, struct, time8:9: class ThreadingTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass
10: class Socks5Server(SocketServer.StreamRequestHandler):
11: def handle_tcp(self, sock, remote):
12: fdset = [sock, remote]13: while True:14: r, w, e = select.select(fdset, [], [])15: if sock in r:
16: if remote.send(sock.recv(4096)) <= 0: break
17: if remote in r:
18: if sock.send(remote.recv(4096)) <= 0: break
19: def handle(self):
20: try:21: pass # print 'from ', self.client_address nothing to do.
22: sock = self.connection23: # 1. Version24: sock.recv(262)25: sock.send("\x05\x00");
26: # 2. Request27: data = self.rfile.read(4)28: mode = ord(data[1])
29: addrtype = ord(data[3])
30: if addrtype == 1: # IPv4
31: addr = socket.inet_ntoa(self.rfile.read(4))
32: elif addrtype == 3: # Domain name
33: addr = self.rfile.read(ord(sock.recv(1)[0]))
34: port = struct.unpack('>H', self.rfile.read(2))35: reply = "\x05\x00\x00\x01"
36: try:37: if mode == 1: # 1. Tcp connect
38: remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM)39: remote.connect((addr, port[0]))40: pass # print 'To', addr, port[0] nothing do to.
41: else:
42: reply = "\x05\x07\x00\x01" # Command not supported
43: local = remote.getsockname()44: reply += socket.inet_aton(local[0]) + struct.pack(">H", local[1])45: except socket.error:46: # Connection refused47: reply = '\x05\x05\x00\x01\x00\x00\x00\x00\x00\x00'48: sock.send(reply)49: # 3. Transfering50: if reply[1] == '\x00': # Success
51: if mode == 1: # 1. Tcp connect
52: self.handle_tcp(sock, remote)53: except socket.error:54: pass #print 'error' nothing to do .
55: except IndexError:56: pass57: def main():
58: filename = sys.argv[0];
59: if len(sys.argv)<2:60: print 'usage: ' + filename + ' port'
61: sys.exit()62: socks_port = int(sys.argv[1]);
63: server = ThreadingTCPServer(('', socks_port), Socks5Server)64: print 'bind port: %d' % socks_port + ' ok!'
65: server.serve_forever()66: if __name__ == '__main__':67: main()68:
为啥要接收262个字节的数据,抓包发现其实没有这么多,可以看下抓包的结果。
首先是TCP三次握手建立连接:
客户端给服务器发送05 01 00共三个字节,要求匿名代理:
服务器端发送05 00两个字节,表示允许匿名代理。
客户端如果发送05 01 00 03 表示后面跟的是域名而不是IP地址,由Socks5服务器进行DNS解析。
RFC中有这样一句。
The programming interface for a SOCKS-aware UDP MUST report anavailable buffer space for UDP datagrams that is smaller than theactual space provided by the operating system:o if ATYP is X'01' - 10+method_dependent octets smaller
o if ATYP is X'03' - 262+method_dependent octets smaller
o if ATYP is X'04' - 20+method_dependent octets smaller
我琢磨是不是这个的原因,recv那里写的是262字节了。我把262改的很小也是可以的,但是改的太小,比如10就报错了。如果有知道原因的朋友,请留言告诉我。
还有几个是Python语法相关的问题,在源码中看到了第39行的port[0],就是因为struct.unpack返回的是一个元组,即使返回值只要一个元素。recv(1)的意思是接收<=1个byte的数据,[0]取第一个byte也就是后续域名的长度。
上面源码实现的只是Socks5的TCP连接方式。
参考链接:http://blog.csdn.net/liujiayu2/article/details/51691778
0 0
- Socks5代码的一点解析
- socks5解析地址
- socks5协议代理解析
- Socks5配置文件Socks5.conf – socks5 daemon 的配置文件
- 穿透Socks5的UDP
- socks5代理服务器的配置
- socks5的配置
- socks5
- 找的一点代码
- 关于socks5代理的编写
- 穿透SOCKS5的UDP编程
- 关于socks5代理的编写
- socks5,快速强大的代理
- socks5代理服务器协议的说明
- shadow的socks5服务器搭建
- spring aop的一点解析
- asp.net的一点代码
- Gravatar.com的一点代码
- 1087
- maven介绍及常用命令(一)
- MySQL基本操作
- 第十三章 线程安全与锁优化
- Struts
- Socks5代码的一点解析
- 4.ZooKeeper 3.0.0发行说明及版本升级
- (4)深坑之MyBatis只能查询一条记录
- 利用 Memory Analyer分析JVM内存问题
- 蓝牙音频编码和压缩
- 机器学习中常见的损失函数
- git 常见命令
- 软件测试(十)软件测试年终报告模版
- Hexo 3.x ERROR Deployer not found github