louisabraham / LaBot

Bot Dofus 2 en Python 3
MIT License
79 stars 37 forks source link

[Question]Comment faire passer le traffic par mon serveur sous linux #11

Closed Greenlamp2 closed 5 years ago

Greenlamp2 commented 5 years ago

Coucou, J'ai lu +- tout ce que tu as écrit sur un certain forum, mais je suis toujours bloqué à cette étape, je n'arrive pas à faire en sorte que lorsque je lance le client dofus, le traffic passe par le serveur local.

Je suis sous linux, donc ton code ne marche pas dans mon cas, sauf si j'ai mal compris quelque chose.

Merci !

PS: as-tu un Discord sur lequel je pourrais éventuellement te poser directement mes questions ? ou préfères-tu que je le fasse ici comme ça si quelqu'un d'autre est intéressé par les réponses, il peut les voir ?

Greenlamp2 commented 5 years ago

J'ai réussi à comprendre qu'il fallait utiliser proxychains4 :p Alors déja, j'ai du export LD_Preload=/usr/lib/i386-linux-gnu/libproxychains.so.3 la version 32-bits car dofus est en 32-bits. sadly, même en donnant mon fichier de configuration, ça ne marche toujours pas comme voulu, en effet, je vois ça: selection_157 alors que dans mon proxychains.conf je dis bien d'utiliser le port 8000, hors, ici j'ai l'impression qu'il utilise le port 9050. Je perd espoir :p

(Ma supposition est que wine marche pas bien avec proxychains)

louisabraham commented 5 years ago

Bonjour, j'aurai plus de temps dans 2 semaines. Je suis inscrit sur le discord de Cadernis, j'y passe quelques fois par mois.

Je n'ai pas utilisé mon code depuis plusieurs mois.

Le sniffeur fonctionne (à l'exception de certains paquets), mais le MITM est encore en phase de développement. Le mieux est donc de lire le code. Il y a des instructions à la fin du README.md.

https://github.com/louisabraham/LaBot/blob/master/labot/mitm/proxychains.py est codé pour macos, il faut donc légèrement modifier la commande pour que ça fonctionne. Il y a une config proxychain qui est fournie https://github.com/louisabraham/LaBot/blob/master/labot/mitm/proxychains.conf

Toutes les connexions du jeu sont redirigées pour passer par un proxy http sur le port 8000, lequel est codé dans https://github.com/louisabraham/LaBot/blob/master/labot/mitm/proxy.py. Il faut donc lancer à la fois le jeu et le proxy pour que cela fonctionne. C'est ce que fait le module https://github.com/louisabraham/LaBot/blob/master/labot/mitm/launch.py

Greenlamp2 commented 5 years ago

yep merci, au final mon probleme venait du fait que wine marchait pas correctement avec proxychains, j'ai donc installer le launcher ankama et là c'est bon j'ai l'impression qu'il y a un début de communication J'arrive toujours pas à passer la connection, mais je pense que je suis sur la bonne voie :D

voici pour linux ce qu'il faut mettre:

newenv = {**os.environ,
          'LD_PRELOAD':
          '/usr/lib/libproxychains4.so'}

selection_158

selection_159

louisabraham commented 5 years ago

Est-ce que tu utilises bien launch.py ?

Tu peux essayer de vérifier si proxychains marche en lançant proxychains.py (donc sans serveur proxy http) avec un serveur bidon ncat -lk 8000 qui affichera les requêtes CONNECT.

Greenlamp2 commented 5 years ago

oui, et proxychains fonctionne bien, car je vois bien la connection http s'établir, mais je vois que data = r.recv(8192) reçois tjrs ceci: data: b''

Greenlamp2 commented 5 years ago

ncat -lk 8000

CONNECT 127.0.0.1:0 HTTP/1.0
Host: 127.0.0.1:0

CONNECT dl.ak.ankama.com:80 HTTP/1.0
Host: dl.ak.ankama.com:80

CONNECT ankama.akamaized.net:443 HTTP/1.0
Host: ankama.akamaized.net:443

CONNECT sentry.io:443 HTTP/1.0
Host: sentry.io:443

CONNECT api.ankama.com:443 HTTP/1.0
Host: api.ankama.com:443

CONNECT haapi.ankama.com:443 HTTP/1.0
Host: haapi.ankama.com:443

CONNECT www.dofus.com:443 HTTP/1.0
Host: www.dofus.com:443

CONNECT sentry.io:443 HTTP/1.0
Host: sentry.io:443

CONNECT dl.ak.ankama.com:80 HTTP/1.0
Host: dl.ak.ankama.com:80

CONNECT ankama.akamaized.net:443 HTTP/1.0
Host: ankama.akamaized.net:443

CONNECT sentry.io:443 HTTP/1.0
Host: sentry.io:443

CONNECT dl.ak.ankama.com:80 HTTP/1.0
Host: dl.ak.ankama.com:80

CONNECT www.dofus.com:443 HTTP/1.0
Host: www.dofus.com:443

CONNECT 34.252.21.81:5555 HTTP/1.0
Host: 34.252.21.81:5555

CONNECT api.ankama.com:443 HTTP/1.0
Host: api.ankama.com:443

CONNECT 34.252.21.81:5555 HTTP/1.0
Host: 34.252.21.81:5555

CONNECT api.ankama.com:443 HTTP/1.0
Host: api.ankama.com:443

CONNECT 52.17.231.202:5555 HTTP/1.0
Host: 52.17.231.202:5555
louisabraham commented 5 years ago

oui, et proxychains fonctionne bien, car je vois bien la connection http s'établir, mais je vois que data = r.recv(8192) reçois tjrs ceci: data: b''

quelle ligne du code ?

Greenlamp2 commented 5 years ago

et voici ce que j'ai quand je print coJeu et data:

coJeu:
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 51572)>
data: b''
coJeu:
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 51576)>
data: b''
coJeu:
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 51580)>
data: b''

coJeu:
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 51584)>
data: b''

coJeu:
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 51588)>
data: b''

coJeu:
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 51592)>
data: b''

coJeu:
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 51596)>
data: b''

coJeu:
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 51600)>
data: b''
Greenlamp2 commented 5 years ago

Lorsque je fais coSer.recv(8192), je reçois bien quelque chose on dirait.

/home/username/anaconda2/envs/py3/bin/python /home/username/Github/LaBot/launchMitm.py
server started
data: b'\x00\x05\x08\x00\x00\x07c\x00\x00\x07v'
20:36:09.403 DEBUG: Thread-2 - msg.fromRaw(): Trying to parse message from raw buffer... 

20:36:09.403 DEBUG: Thread-2 - msg.fromRaw(): Message has id 1 

20:36:09.404 DEBUG: Thread-2 - msg.fromRaw(): Could not parse message: Not complete 

20:36:09.438 DEBUG: Thread-2 - msg.fromRaw(): Trying to parse message from raw buffer... 

20:36:09.438 DEBUG: Thread-2 - msg.fromRaw(): Message has id 1 

20:36:09.438 DEBUG: Thread-2 - msg.fromRaw(): Parsed message with ID 1 

20:36:09.438 DEBUG: Thread-2 - msg.__init__(): Initialized Msg with id 1 

----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 51630)
Traceback (most recent call last):
  File "/home/username/anaconda2/envs/py3/lib/python3.6/socketserver.py", line 654, in process_request_thread
    self.finish_request(request, client_address)
  File "/home/username/anaconda2/envs/py3/lib/python3.6/socketserver.py", line 364, in finish_request
    self.RequestHandlerClass(request, client_address, self)
data: b'\x00\x0e\x01U\x00 jr5aybou%Q\\q<_h]^t`\'8CXQbrfv@Y/j\xb1\x02\x1aT\xda\x0b*\x1dU\xfb~}\x0e\xda\xbe\xa1\xe7P\xbb\xcbF \xdc\x13\x99Th\xd1[\xff\x00\x0eQ\'T\x10\x01HnG\x08}\x18JD\n\x8d\xf5\xa9\xdc\xca\x14\xc4\xcb\x94\xdf&\xcf\xa5+?F\x07\xb8\xd4H\xe5]\xf45\xda\xdca\xf8\xf8\xd7?\xce\xb0\'\x89\xf0/I\xab\xa9O\x1f\x97\x84$x\t{.l)\xf4q\xc8\xa1\xe7*\xf7\xdf\xdce\x7f\xffd5\x19\xa7\xde|W*\xdd\x0b{zu\x1d\x11\xa8(x\x06PE\xaf"\xd3T\x9f\xa3\xf5\x9c\x04D\xd8\xdc\xa0\xd2\x83\xe9Y\x08\xe4\xf3\xf3\xe8~\x1bI\xa7\x98\x1c\xf7\x82\x0e@NB\xd5eU\xaa)v\xbb\xfcC\xc7m\xe1\xc4\x8c\x820\xc6O\x1c\x86"a\xf9@\xa6\xcf\x9a$\xb9\xb2\x1a@j\x10\xa5\x19\xc4;}_jy\x1b\xd8e\xb4\xe2\xbd\xc00\x13\xcd\xd8\xf4m\xccN\xbc\x16gp\xf3\x82\n|1\xa3\x93Scj\xe6$\xf4\x08\xbd\x99\xaa\xe1\x82\x05\xe6\x83{~\xf5Y\xe8\xa3~\xe2\xe3\xe1\xc9\x905[\x97z\xa0\xb5e\x8fA\xa0N\xffe\x02c\x99\xc1\xfcj\xd0\xfcf|\xdc\xb5\x8fe6\x9f\xff\xc4\xfc\xdbi.\xcc\xce\xbbb\xabUU4\xcbD\'\x15\x9c'
  File "/home/username/anaconda2/envs/py3/lib/python3.6/socketserver.py", line 724, in __init__
    self.handle()
  File "/home/username/anaconda2/envs/py3/lib/python3.6/http/server.py", line 418, in handle
    self.handle_one_request()
  File "/home/username/anaconda2/envs/py3/lib/python3.6/http/server.py", line 406, in handle_one_request
    method()
  File "/home/username/Github/LaBot/labot/mitm/proxy.py", line 33, in do_CONNECT
    Bridge(self.connection, coServ, MsgBridgeHandler).run()
  File "/home/username/Github/LaBot/labot/mitm/bridge.py", line 128, in run
    self.bridge_handler.handle(data, origin=r)
  File "/home/username/Github/LaBot/labot/mitm/bridge.py", line 82, in handle
    % (msgType, parsedMsg, msg.data)
AssertionError: All content of {'name': 'ProtocolRequired', 'path': PosixPath('/home/username/Github/LaBot/sources/scripts/com/ankamagames/dofus/network/messages/handshake/ProtocolRequired.as'), 'parent': None, 'protocolId': 1, 'vars': [{'name': 'requiredVersion', 'length': None, 'type': 'Int'}, {'name': 'currentVersion', 'length': None, 'type': 'Int'}], 'boolVars': []} have not been read into {'__type__': 'ProtocolRequired', 'requiredVersion': 1910, 'currentVersion': 917845}:
 Data(bytearray.fromhex('00000776000e015500206a72356179626f7525515c713c5f685d5e746027384358516272667640592f6ab1021a54da0b2a1d55fb7e7d0edabea1e750bbcb4620dc13995468d15bff000e5127541001486e47087d184a440a8df5a9dcca14c4cb94df26'))
----------------------------------------
Greenlamp2 commented 5 years ago

oui, et proxychains fonctionne bien, car je vois bien la connection http s'établir, mais je vois que data = r.recv(8192) reçois tjrs ceci: data: b''

quelle ligne du code ?

ici: https://github.com/louisabraham/LaBot/blob/7301bfc66ec50b206c153744b577b384865c920f/labot/mitm/bridge.py#L120

J'ai juste rajouter un petit print('data: %s' % str(data)) en dessous

louisabraham commented 5 years ago

Normalement PrintingMsgBridgeHandler est utilisé donc il devrait afficher tous les messages.

Ici, l'erreur déclenchée servait à s'assurer que j'arrivais bien à lire les messages. ProtocolRequired est le premier message donc il n'arrive à rien lire.

Est-ce que tu as pu regénérer le protocole en utilisant une version récente des sources décompilées et en lançant protocolBuilder.py ?

Greenlamp2 commented 5 years ago

Oui j'ai bien générer protocol.pk.

J'ai modifier un peu ce code: https://github.com/louisabraham/LaBot/blob/7301bfc66ec50b206c153744b577b384865c920f/labot/mitm/bridge.py#L115

En ceci: selection_161

Et j'utilise à la place le bridge DummyBridgeHandler, Mais maintenance j'obtiens ces erreurs: File "/home/gknuts/Github/LaBot/labot/mitm/bridge.py", line 44, in handle self.other[origin].sendall(data) BrokenPipeError: [Errno 32] Broken pipe

je suis maudis à rien réussir du premier coup ahah