Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. import socket
  2.  
  3. from threading import Thread
  4. from enum import Enum
  5.  
  6.  
  7. class Direction(Enum):
  8.     CLIENT_TO_PROXY = '->'
  9.     PROXY_TO_SERVER = '<-'
  10.  
  11.  
  12. getPacketsSize = {
  13.     0xC1: lambda packet: packet[1],
  14.     0xC2: lambda packet: packet[1] << 8 | packet[2],
  15.     0xC3: lambda packet: packet[1],
  16.     0xC4: lambda packet: packet[1] << 8 | packet[2]
  17. }
  18.  
  19.  
  20. class PacketReader(Thread):
  21.     def __init__(self, direction, port):
  22.         super(PacketReader, self).__init__()
  23.         self.input = None
  24.         self.output = None
  25.         self.port = port
  26.         self.direction = direction
  27.  
  28.     def run(self):
  29.         queue = []
  30.         while True:
  31.             data = self.input.recv(4096)
  32.             if data:
  33.                 if self.direction == Direction.CLIENT_TO_PROXY:
  34.                      print(f"BUFFER [{self.port}] {self.direction.value} {data.hex()}")
  35.                 self.parse(queue, data)
  36.                 while len(queue) > 0:
  37.                     packet = queue.pop(0)
  38.                     if self.direction == Direction.CLIENT_TO_PROXY:
  39.                         print(f"PACKET [{self.port}] {self.direction.value} {packet.hex()}")
  40.                     self.output.sendall(packet)
  41.                 print("\n")
  42.  
  43.     def parse(self, queue, data):
  44.         while len(data) > 2:
  45.             header = data[0:3]
  46.             size = getPacketsSize[header[0]](data)
  47.             if len(data) < size:
  48.                 break
  49.             queue.append(data[0:size])
  50.             data = data[size:]
  51.  
  52.  
  53. class Proxy2Server(PacketReader):
  54.     def __init__(self, host, port):
  55.         super(Proxy2Server, self).__init__(Direction.CLIENT_TO_PROXY, port)
  56.         self.input = None  # game client socket
  57.         self.output = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  58.         self.output.connect((host, port))
  59.  
  60.  
  61. class Client2Proxy(PacketReader):
  62.     def __init__(self, host, port):
  63.         super(Client2Proxy, self).__init__(Direction.PROXY_TO_SERVER, port)
  64.         self.input = None  # real server socket
  65.         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  66.         sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  67.         sock.bind((host, port))
  68.         sock.listen(1)
  69.         # waiting for a connection
  70.         self.output, addr = sock.accept()
  71.  
  72.  
  73. class Proxy(Thread):
  74.     def __init__(self, from_host, to_host, port):
  75.         super(Proxy, self).__init__()
  76.         self.from_host = from_host
  77.         self.to_host = to_host
  78.         self.port = port
  79.  
  80.     def run(self):
  81.         while True:
  82.             print("[proxy({}) started]".format(self.port))
  83.             self.client2Proxy = Client2Proxy(self.from_host, self.port)
  84.             self.proxy2Server = Proxy2Server(self.to_host, 55901)
  85.             print('[proxy({}) connection established]'.format(self.port))
  86.             self.client2Proxy.input = self.proxy2Server.output
  87.             self.proxy2Server.input = self.client2Proxy.output
  88.  
  89.             self.client2Proxy.start()
  90.             self.proxy2Server.start()
  91.  
  92.  
  93. proxy = Proxy('127.0.0.1', 'serverIp', 20439)
  94. proxy.start()