-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproxy.py
More file actions
154 lines (108 loc) · 4.66 KB
/
proxy.py
File metadata and controls
154 lines (108 loc) · 4.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import socket
import asyncore
import struct
import time
import json
from modify_data import get_modify_data
# length + pid + data
HEAD_SIZE = struct.calcsize(">II")
class Proxy(asyncore.dispatcher):
def __init__(self, host, port, gs_address):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.bind(("0.0.0.0", port))
self.listen(5)
self.gs_address = gs_address
self.host = host
self.port = port
def handle_accepted(self, sock, addr):
print('Incoming connection from %s' % repr(addr))
def handle_accept(self):
client, addr = self.accept()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.connect(self.gs_address)
# 接收到来自客户端的链接client,创建链接服务端的链接server
# 互相持有对象引用,并加入异步特性
# 核心功能 单纯的转发协议,所以只需实现handle read接口,读取所有数据,转发出去即可
# 拓展功能 读取协议、改写协议并将改写之后的协议转发出去(具体是改写从客户端发往服务器的协议,因为假设服务器的行为为正确行为)
ProxyClientHandle(client, server)
ProxyServerHandle(client, server)
class ProxyClientHandle(asyncore.dispatcher):
def __init__(self, client, server):
asyncore.dispatcher.__init__(self, client)
self.server = server
self.recvStat = 1
self.recvHeader = b""
self.recvBody = b""
self.length = -1
self.pid = -1
def handle_read(self):
if self.recvStat == 1:
self.recvHeader = self.recvHeader + self.recv(HEAD_SIZE - len(self.recvHeader))
if len(self.recvHeader) < HEAD_SIZE:
return
self.length, self.pid = struct.unpack(">II", self.recvHeader)
self.recvStat = 2
else:
self.recvBody = self.recvBody + self.recv(self.length - len(self.recvBody))
if len(self.recvBody) < self.length:
return
# modify protocol
data = self.recvHeader+self.recvBody
##################################################################
# 修改客户端协议的位置
data = modify_protocol(data)
##################################################################
self.server.send(data)
# self.server.send(self.recvHeader+self.recvBody)
print("send: ", self.pid, self.length, self.recvBody)
self.recvStat = 1
self.recvHeader = b""
self.recvBody = b""
self.length = -1
self.pid = -1
def handle_close(self):
self.close()
class ProxyServerHandle(asyncore.dispatcher):
def __init__(self, client, server):
asyncore.dispatcher.__init__(self, server)
self.client = client
self.recvStat = 1
self.recvHeader = b""
self.recvBody = b""
self.length = -1
self.pid = -1
def handle_read(self):
if self.recvStat == 1:
self.recvHeader = self.recvHeader + self.recv(HEAD_SIZE - len(self.recvHeader))
if len(self.recvHeader) < HEAD_SIZE:
return
self.length, self.pid = struct.unpack(">II", self.recvHeader)
self.recvStat = 2
else:
self.recvBody = self.recvBody + self.recv(self.length - len(self.recvBody))
if len(self.recvBody) < self.length:
return
self.client.send(self.recvHeader+self.recvBody)
print("recv: ", self.pid, self.length, self.recvBody)
self.recvStat = 1
self.recvHeader = b""
self.recvBody = b""
self.length = -1
self.pid = -1
def handle_close(self):
self.close()
def modify_protocol(protocol_data):
data = protocol_data
_, pid = struct.unpack(">II", protocol_data[:HEAD_SIZE])
# data_body = protocol_data[HEAD_SIZE:]
modify_data_dict = get_modify_data()
if str(pid) in modify_data_dict:
modify_data_body = modify_data_dict[str(pid)]
data = struct.pack('>II', len(modify_data_body), pid) + bytes(modify_data_body, "ascii")
return data
if __name__ == "__main__":
print("Proxy")
gs_address = ("0.0.0.0", 60000)
proxy = Proxy("0.0.0.0", 60001, gs_address)
asyncore.loop()