Bonjour tout le monde.
Premier post sur un forum, je ne suis pas vraiment dans mon élément, je compte sur votre bienveillance ! Depuis plusieurs semaines j'essaie de développer un bot MITM en python sur mon temps libre. Mais là je bloque.
Pour l'instant Mon objectif est d'échanger des données avec le serveur jusqu'à la réception du SelectedServerDataMessage.
Je suis plutôt au fait sur le protocole de communication utilisé par le jeu, la lecture des ID et des paquets ne me pose pas trop de problèmes.
Voila ce que j'ai fait jusqu'à maintenant :
- Utilisation de proxifier sur windows pour rediriger la connexion du D sur mon IP locale
-Création d'un thread socket vers le serveur et d'un thread socket vers le client, forward des données de l'un vers l'autre et vice versa
Le problème est le suivant : Lorsque le client reçoit des données (en l’occurrence "PorocolRequired" et "HelloConnectMessage") il coupe directement la connexion avec mon proxy.
[proxy(5555)] setting up
[proxy(5555)] connection established
Serveur à reçu : 050100
Client à reçu : 8ae50f000d312e302e332d64643630383137720e015500206c357770646a79774f60335644396b454579562e5176623c43345d782e67635db102760801a7c5a1e75eb6b892e5d2166946894ff00279cd5be386cb326b2058b6bb0d0ad58b89d2793b0d7666292140eaf1587c515bbdac086b2b8f95dd867250e7b8916f2419485d40b5133bf99812a499804b72470d25b9503d29eb9f0981171bab5bcf24f41827302536482fd1148b7fce05f519079fdc634bcf3b2af1480703e56c0da9a833579d08d6ce8952a5163da2854a8b6f44b0fec027d168a7c5ff0e22bde15bc11fe6aee7b3c3a2e566d2cc43a5a87ea38447b8157453be3b4caa784eef94ca1b0b104d740f81d24356ee0a68d494fe7357c38c628a3d0c07c341a89c2a28f97facc970745a136d2a94be03bc886bb5fca2c673d4ade201b4ae2d6fb6c974a3e262a0b83f1693365ecfdfc8f486ce85e061427280050c7dcc5adbf5da81f0c52199eaeca1e2b21c896f0e2d23
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\..\Programs\Python\Python39\lib\threading.py", line 973, in _bootstrap_inner
self.run()
File "c:\..\Mon_fichier.py", line 55, in run
data = self.game.recv(4096)
ConnectionResetError: [WinError 10054] Une connexion existante a dû être fermée par l’hôte distant
Cette erreur ressemble fortement à ce sujet : https://cadernis.com/d/2511-probleme-serveur-mitm/3
Grandi des conseils de BlueDream j'ai pensé que le soucis était dû au fait que j'utilisais du "little endian" j'ai alors codé le passage au "Big endian" mais cela n'a pas fonctionné non plus. (Peut être l'ais-je mal programmé ?).
Mon code :
import socket
import os
from threading import Thread
import Reader as r
import struct
flag = 0
class Proxy2Server(Thread):
def __init__(self, host, port):
super(Proxy2Server, self).__init__()
self.game = None # game client socket not known yet
self.port = port
self.host = host
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.connect((host, port))
# run in thread
def run(self):
while True:
data = self.server.recv(4096)
if data:
# data2 = int.from_bytes(data, "little")
# data = data2.to_bytes((data2.bit_length() + 7) // 8, 'big')
self.game.sendall(data)
print("Client à reçu : ", data.hex())
class Game2Proxy(Thread):
def __init__(self, host, port):
super(Game2Proxy, self).__init__()
self.server = None # real server socket not known yet
self.port = port
self.host = host
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((host, port))
sock.listen(1)
# waiting for a connection
self.game, addr = sock.accept()
def run(self):
while True:
data = self.game.recv(4096)
if data:
# data2 = int.from_bytes(data, "little")
# data = data2.to_bytes((data2.bit_length() + 7) // 8, 'big')
self.server.sendall(data)
print("Serveur à reçu : ", data.hex())
class Proxy(Thread):
def __init__(self, from_host, to_host, port):
super(Proxy, self).__init__()
self.from_host = from_host
self.to_host = to_host
self.port = port
def run(self):
print ("[proxy({})] setting up".format(self.port))
self.g2p = Game2Proxy(self.from_host, self.port) # waiting for a client
self.p2s = Proxy2Server(self.to_host, self.port)
print ("[proxy({})] connection established".format(self.port))
self.g2p.server = self.p2s.server
self.p2s.game = self.g2p.game
self.g2p.start()
self.p2s.start()
master_server = Proxy('127.0.0.1', '34.249.202.222', 5555)
master_server.start()
Voila pour la présentation de mon "avancement". J'aurais quelque questions :
- Pourquoi le jeu envoie-t-il 050100 ?
- Pourquoi le client se déconnecte-t-il et que pourrais-je faire pour le corriger ?
- J'entends beaucoup parler du HelloConnectMessage et du chiffrement AES. Sont ils automatiquement gérés par le client lors d'une connexion en MITM ? (Je suppose oui mais j'aimerais bien avoir une confirmation)
Merci de m'avoir lu jusqu'au bout. En espérant que vous saurez m'aider