Python Assemblage correct des segments TCP pour reconstituer les paquets de la couche application

Inscrit
22 Decembre 2018
Messages
3
Reactions
0
#1
Bonjour à tous,

Je me suis plongé récemment dans l'univers du reverse engineering sur D2, et je commence donc en douceur avec avec un sniffer en python, mais je rencontre quelques soucis.

Je mets ici le lien du repo pour que vous puissiez éventuellement jeter un oeil au code : https://github.com/Okhr/d2sniffer
Ainsi que la capture wireshark que j'utilise pour travailler : https://www.mediafire.com/file/z18ksugp5tblgxs/port-5555.pcap/file

Dans les grandes lignes, j'utilises pyshark pour sniffer une interface (ou lire un .pcap pendant le dev). Je m'intéresse uniquement aux segments TCP qui contiennent un payload. D'après ce que j'ai compris un segment TCP peut contenir plusieurs paquet D2 et un paquet D2 peut être séparé sur deux segments TCP différents.

La sortie de mon script :

Packet 4
Segment payload size : 18
Message length : 15
<server : ProtocolRequired - length : 15> - instance_id : -1
Segment payload size : 0

Packet 6
Segment payload size : 345
Message length : 341
<server : HelloConnectMessage - length : 341> - instance_id : -1
Segment payload size : 0

Packet 8
Segment payload size : 284
Message length : 276
<client : IdentificationMessage - length : 276> - instance_id : 3
Segment payload size : 0

Packet 10
Segment payload size : 30
Message length : 23
<client : ClientKeyMessage - length : 23> - instance_id : 4
Segment payload size : 0

Packet 11
Segment payload size : 7
Message length : 4
<server : LoginQueueStatusMessage - length : 4> - instance_id : -1
Segment payload size : 0

Packet 13
Segment payload size : 2
Message length : 0
<server : CredentialsAcknowledgementMessage - length : 0> - instance_id : -1
Segment payload size : 0

Packet 15
Segment payload size : 7
Message length : 4
<server : LoginQueueStatusMessage - length : 4> - instance_id : -1
Segment payload size : 0

Packet 17
Segment payload size : 493
Message length : 117
<server : IdentificationSuccessMessage - length : 117> - instance_id : -1
Segment payload size : 373
Message length : 369
<server : SelectedServerDataExtendedMessage - length : 369> - instance_id : -1
Segment payload size : 0

Packet 25
Segment payload size : 20
Message length : 15
<server : ProtocolRequired - length : 15> - instance_id : -1
Segment payload size : 2
Message length : 0
<server : HelloGameMessage - length : 0> - instance_id : -1
Segment payload size : 0

Packet 27
Segment payload size : 45
Message length : 38
<client : AuthenticationTicketMessage - length : 38> - instance_id : 12
Segment payload size : 0

Packet 29
Segment payload size : 1460
Message length : 11338713661440
Segment payload size : 0

Packet 31
Segment payload size : 2048
Segment payload size : 0

Packet 33
Segment payload size : 4096
Segment payload size : 0

Packet 35
Segment payload size : 2920
Segment payload size : 0

Packet 37
Segment payload size : 2920
Segment payload size : 0

Packet 39
Segment payload size : 1156
Segment payload size : 0

Packet 41
Segment payload size : 1460
Segment payload size : 0

Packet 43
Segment payload size : 1460
Segment payload size : 0

Packet 45
Segment payload size : 1460
Segment payload size : 0

Packet 47
Segment payload size : 2920
Segment payload size : 0

Packet 49
Segment payload size : 3812
Segment payload size : 0

Packet 51
Segment payload size : 2920
Segment payload size : 0

Packet 53
Segment payload size : 2920
Segment payload size : 0

Packet 55
Segment payload size : 4380
Segment payload size : 0

Packet 57
Segment payload size : 2920
Segment payload size : 0

Packet 59
Segment payload size : 1460
Segment payload size : 0

Packet 60
Segment payload size : 1460
Segment payload size : 0

Packet 62
Segment payload size : 2028
Segment payload size : 0

Packet 64
Segment payload size : 1460
Segment payload size : 0

Packet 65
Segment payload size : 2920
Segment payload size : 0

Packet 67
Segment payload size : 1460
Segment payload size : 0

Packet 68
Segment payload size : 1460
Segment payload size : 0

Packet 70
Segment payload size : 2920
Segment payload size : 0

Packet 72
Segment payload size : 2920
Segment payload size : 0

Packet 74
Segment payload size : 2920
Segment payload size : 0

Packet 76
Segment payload size : 2920
Segment payload size : 0

Packet 78
Segment payload size : 2920
Segment payload size : 0

Packet 80
Segment payload size : 2920
Segment payload size : 0

Packet 82
Segment payload size : 2920
Segment payload size : 0

Packet 84
Segment payload size : 2920
Segment payload size : 0

Packet 86
Segment payload size : 2920
Segment payload size : 0

Packet 88
Segment payload size : 2920
Segment payload size : 0

Packet 90
Segment payload size : 4212
Segment payload size : 0

Packet 92
Segment payload size : 266
Segment payload size : 0

Packet 94
Segment payload size : 137
Segment payload size : 0

Packet 96
Segment payload size : 24
Segment payload size : 0

Packet 98
Segment payload size : 6
Segment payload size : 0

Packet 100
Segment payload size : 41
Segment payload size : 0

Process finished with exit code 0

Chaque paragraphe représente un segment TCP, que je "consomme" et quand un message est complet je l'ajoute à un liste et je l'affiche. Tout va bien au début, je recupère bien les messages et j'extrais leurs noms grâce au parser Botofu, jusqu'au segment 29 (même numéro dans la capture wireshark si jamais) ou la taille du message lue semble pas bonne et ça fout tout en l'air.

Voilà je me casse les dents là dessus depuis plusieurs jours et j'ai l'impression de tourner en rond. Trop stylé si vous pouvez me donner une piste.

Okhr
 
Inscrit
13 Janvier 2021
Messages
23
Reactions
28
#2
ServerConnection.as

Ligne 644, méthode LowReceive() si ça peut t'aider.
 
Inscrit
22 Decembre 2018
Messages
3
Reactions
0
#3
J'ai regardé la fonction en question, dans l'idée c'est ce que je fais non ?
 
Inscrit
10 Mai 2015
Messages
345
Reactions
39
#4
Traduis ce que @Echandra ta conseillé de traduire et n'utilise pas des vieilles sources pour vérifier que tu fais bien quelque chose. Base toi uniquement sur les sources officielles de Dofus.
 
Inscrit
20 Juillet 2019
Messages
4
Reactions
1
#5
Je sais pas si ça peux t'aider mais j'ai fais un truc comme ça qui marche

https://pastebin.com/mp9M2NqJ

l'argument packet_data correspond aux données de ton segment tcp
sender est un bool pour savoir si c'est un paquet que t'envoie ou que tu reçoit (True = paquet que t'envoies)
 
Inscrit
22 Decembre 2018
Messages
3
Reactions
0
#6
@Echandra et @Brizze je me suis plongé dans la méthode lowReceive comme vous l'avez conseillé, ya un truc que je capte pas : la méthode prend en argument un byteArray src, mais on retrouve dans la méthode cette instructions :
src.readBytes(this._inputBuffer,0,src.bytesAvailable). Je suis allé voir la doc AS3 et apparemment ça lit dans tous les bytes de _inputBuffer pour les mettre dans src. Mais on est pensé consommer src plutot que de lui ajouter des trucs ?
 
Inscrit
13 Janvier 2021
Messages
23
Reactions
28
#7
Code:
src.readBytes(this._inputBuffer,0,src.bytesAvailable)
Lis le restant des bytes disponibles de src et ajoute ça dans _inputBuffer.
 
Haut Bas