2.0 Problème de redirection après le SelectedServerDataExtendedMessage

Inscrit
16 Octobre 2019
Messages
9
Reactions
0
#1
Salut,

J'essaie de me connecter au serveur à travers un proxy.
Je reçois le SelectedServerDataExtendedMessage que je modifie pour rediriger le client vers 127.0.0.1:8081
J'envoie le 6469 modifié au client ensuite je coupe la connexion avec le serveur puis avec le client.
Jusqu'ici pas de soucis :cool:.

Le problème cest que le client n'ouvre pas une nouvelle connexion sur le socket que je précise.
J'ai un ncat qui tourne dessus mais je ne reçois rien :'(.

Voilà le code:
P.S. J'utilise le [de]serializer de @Labo.
Modification du 6469:
frag # contient le message 6469
buff # bytearray()  contient d'autre msgs reçu + le 6469

header = frag.readUnsignedShort()

lenlen = header & 3
oldlen = int.from_bytes(frag.read(lenlen),"big")

oldheader = bytearray(header.to_bytes(2,"big")) #  = header + datalen
for b in oldlen.to_bytes(lenlen,"big"):
    oldheader.append(b)

# je modifie l'@/port
buff = buff.replace(real_addr, fake_addr)
buff = buff.replace(real_port, fake_port)

# l'adresse local fait 4 octet en moins que @ du serveur du jeu
newlen = oldlen - 4
# vérifie qu'ils ont la même taille en octet sinon je maj le header
checkBytes(newlen, oldlen)


newheader = bytearray(header.to_bytes(2,"big"))  # =  header + newdatalen
for b in newlen.to_bytes(lenlen,"big"):
    newheader.append(b)

# modifie le header + datalen du 6469
buff = buff.replace(oldheader, newheader)
Ensuite j'envoie buff au client, je ferme le socket du serveur puis celui du client.

Je log tout et je vérifie que mes modifs du 6469 ne change pas les autres messages dans buff (avec un hash basique).
Voici les 6469 avant et après modification:
6469 avant modif:
24 00 0d 36 33 2e 33 34 2e 31 30 33 2e 32 31 33 00 02 00 00 15 b3 00 00 01 bb 01 20
62885d6d4ea2dcbda87f27d4ec38ab4df54d5d997ee8aa5a0de3245ccd27ce46001102320403000005000000000000000002d2010003000002000000000000000000cb010003000002000000000000000002ce010003000002000000000000000002d1010003000002000000000000000002d40100030000020000000000000000022400030003054276e66fa100900000c9010003000002000000000000000000cc010003000002000000000000000002cf010003000002000000000000000000160107000005000000000000000003de010003000002000000000000000000630303000005000000000000000000ca010003000002000000000000000002cd010003000002000000000000000002d0010003000002000000000000000002d30100030000020000000000000000
36 33 2e 33 34 2e 31 30 33 2e 32 31 33 correspond bien à 63.34.103.213, 15 b3 à 5555 et 01 bb à 443

6469 après modif:
24 00 0d 31 32 37 2e 30 2e 30 2e 31 00 02 00 00 1f 91 00 00 01 bb 01 20
62885d6d4ea2dcbda87f27d4ec38ab4df54d5d997ee8aa5a0de3245ccd27ce46001102320403000005000000000000000002d2010003000002000000000000000000cb010003000002000000000000000002ce010003000002000000000000000002d1010003000002000000000000000002d40100030000020000000000000000022400030003054276e66fa100900000c9010003000002000000000000000000cc010003000002000000000000000002cf010003000002000000000000000000160107000005000000000000000003de010003000002000000000000000000630303000005000000000000000000ca010003000002000000000000000002cd010003000002000000000000000002d0010003000002000000000000000002d30100030000020000000000000000
et 31 32 37 2e 30 2e 30 2e 31 à 127.0.0.1, 1f 91 à 8081 et 01 bb à 443

Je ne comprends pas pourquoi le client ne réagit pas à mon 6469 modifié !! :mad::'(

Si quelqu'un a des idées ou des tests à proposer je suis grave preneur.
 
Dernière édition:

tazman59

Contributeur
Inscrit
20 Decembre 2012
Messages
148
Reactions
25
#2
Tu as essayer de déconnecter le client manuellement après avoir envoyé le 6469 ?
 
Inscrit
16 Octobre 2019
Messages
9
Reactions
0
#3
Tu as essayer de déconnecter le client manuellement après avoir envoyé le 6469 ?
Manuellement ? comment ?
Je ferme le socket du client juste après avoir renvoyé le 6469.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#5
@da2h Ce n'est pas comme ça que l'on utilise LaBot.

Déjà, tu peux rediriger toute la connexion vers ton code en configurant Dofus avec un proxy http et en utilisant https://github.com/louisabraham/fritm. LaBot utilise aussi le faux proxy de fritm mais n'a pas besoin de configurer le proxy car j'utilise l'injecteur de fritm. L'exemple du README devrait te suffire.

Pour ce qui est de ton problème, essaye le code suivant:

Python:
from labot.data import Msg

# Il est plus élégant d'utiliser la classe labot.data.Buffer
# et de lire le message avec Msg.fromRaw

data = bytearray.fromhex(
    "24000d36332e33342e3130332e3231330002000015b3000001bb012062885d6d4ea2dcbda87f27d4ec38ab4df54d5d997ee8aa5a0de3245ccd27ce46001102320403000005000000000000000002d2010003000002000000000000000000cb010003000002000000000000000002ce010003000002000000000000000002d1010003000002000000000000000002d40100030000020000000000000000022400030003054276e66fa100900000c9010003000002000000000000000000cc010003000002000000000000000002cf010003000002000000000000000000160107000005000000000000000003de010003000002000000000000000000630303000005000000000000000000ca010003000002000000000000000002cd010003000002000000000000000002d0010003000002000000000000000002d30100030000020000000000000000"
)
msg = Msg(6469, data)

j = msg.json()
j["address"] = "127.0.0.1"
j["ports"] = [8081]

new_msg = Msg.from_json(j)

print(new_msg.bytes())
D'ailleurs, avec mon outil en ligne, tu peux récupérer le json de la même manière : https://louisabraham.github.io/LaBo...000000000000002d30100030000020000000000000000

Tu peux ainsi utiliser mon décodeur pour diagnostiquer tes erreurs.
 
Dernière édition:
Inscrit
16 Octobre 2019
Messages
9
Reactions
0
#6
@da2h Ce n'est pas comme ça que l'on utilise LaBot.

Déjà, tu peux rediriger toute la connexion vers ton code en configurant Dofus avec un proxy http et en utilisant https://github.com/louisabraham/fritm. LaBot utilise aussi le faux proxy de fritm mais n'a pas besoin de configurer le proxy car j'utilise l'injecteur de fritm. L'exemple du README devrait te suffire.
J'ai essayé de rediriger la connexion du client avec le hook de fritm mais j'ai pas réussi.
Sur ubuntu 16.04 comme sur windows 7 le client ne se connecte pas sur mon serveur local (j'ai eu l'impression que l'appel connect() n'était pas intercepté).
J'ai fini par crée un proxy TCP et j'utilise NoAnkama pour la première redirection.

EDIT: je viens de m'en rappeler, j'ai pas réussi à configurer le client avec un proxy http --'

Python:
j = msg.json()
j["address"] = "127.0.0.1"
j["ports"] = [8081]
Effectivement c'est plus élégant et plus compacte, je vais tester.
Et merci pour l'exemple, je vois maintenant comment utiliser le décodeur du forum.
 
Inscrit
16 Octobre 2019
Messages
9
Reactions
0
#7
Merci ! Problème résolu avec la méthode que tu propose.
Ce n'était pas une bonne idée de reconstruire le 6469 à la main.

J'ai trouvé que mon 6469 modifié n'était pas correctement lu par Msg.json().
Au lien de voir seulement les octets de "127.0.0.1", je trouve 4 octets en plus dans le champs adresse du 6469.
Ce sont les octets qui séparent le champs @ et le champs port dans le raw du 6496 (00 02 00 00).

Je comprends pas pourquoi ... je pense que les 4 octets en plus correspondent à la différence entre la taille de l'@ du serveuret la taille de l'@ du localhost.
Ca voudrait dire que Msg.json() s'attend à une taille prédéfinie du champ adresse du 6469.
Sauf que ce n'est pas le cas puisque le 6469 modifé avec la nouvelle méthode est lu correctement.
Un truc louche se passe avec le buff = buff.replace(real_port, fake_port) et là je sèche pour trouver une explication.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#8
Regarde la documentation de replace.
 
Haut Bas