Le serveur écoute sur le port UDP 135. Lorsqu'il reçoit un paquet UDP correctement formé, il vérifie l'état du service. S'il est lancé, le paquet est décodé et son contenu affiché dans une boite de message. Une confirmation ou un rejet du paquet peut être envoyé à l'expéditeur.
Le client envoie un paquet UDP au serveur, compsé de 3 champs : FROM, TO, et MESSAGE. Ces champs sont décodés par le serveur et présentés à l'utilisateur. Peu importe la source de ce paquet, c'est le contenu du champ FROM qui sera affiché, au lieu de la véritable adresse de l'expéditeur.
Le paquet est composé de deux parties principales : l'en-tête DCE RPC (Distributed Computing
Environment Remote Procedure Call), et le message lui-même.
Les exemples ci-dessous proviennent de paquets réels. Si quelques champs sont changés, le fonctionnement pourra
ne pas être perturbé (dans certains cas). Nous ne décrirons que les encodages little-endian,
ne disposant pas de machine big-endian pour tester le programme.
Sa taille est toujours égale à 0x50=80 octets (offset 0x00 à 0x4f)
OFFSET | NOM | TAILLE | EXEMPLE | DESCRIPTION |
0x00 | RPC Version | 0x01 | 0x04 | Doit être 0x04 |
0x01 | Type de paquet | 0x01 | 0x00 | Doit être 0x00 (requête) |
0x02 | Flags 1 | 0x01 | 0x78 | Options du paquet |
0x03 | Flags 2 | 0x01 | 0x00 | Réservé (doit être 0) |
0x04 | Format de données | 0x100000 | Little-endian | |
0x07 | S/N haut | 0x00 | Doit être 0 | |
0x08 | UUID de l'objet | 0x10 | 0x00 (*16) | Doit être 0 |
0x18 | Interface | 0x10 | Voir la source | |
0x28 | Activité | 0x10 | Voir la source | |
0x38 | Heure serveur | 0x04 | 0x00000000 | Heure de démarrage (0 ok) |
0x3C | Interface v | 0x04 | 0x01000000 | Version de l'interface(1 ok) |
0x40 | Séquence | 0x00 | 0x00000000 | Numéro de séquence (0 ok) |
0x44 | Opnum | 0x02 | 0x0000 | Numéro d'opération (0 ok) |
0x46 | If Hint | 0x02 | 0xffff | Interface Hint (0xffff) |
0x48 | Activity Ht | 0x02 | 0xffff | Activity Hint (0xffff) |
0x4a | Taille | 0x02 | 0x1000 | Taille de la seconde partie |
0x4c | Numéro de fragment | 0x01 | 0x00 | Pour les longs messages |
0x4d | Proto d'autentification | 0x01 | 0x00 | Aucun -> 0x00 |
0x4e | S/N bas | 0x01 | 0x00 | Doit être 0 |
Le message est compsé de trois parties (FROM, TO, MESSAGE). Entre FROM et TO,
ainsi qu'entre TO et MESSAGE, il y a un blanc. Vous pouvez y mettre n'importe quoi, mais Microsoft le laisse à 0.
Sa taille est étrange :
où x est la taille de la chaîne terminée par un zéro.
Par exemple, si vous voulez envoyer un message de "SantaClaus\x00", à
"LittleKid\x00", le blanc après FROM sera de : 3-((11-1) % 4) = 3-2 = 1 octet.
Et le blanc après TO sera de 3-((10-1) % 4) = 3-1 = 2 octets.
Chaque partie est composée de quatre champs :
Il peut y avoir plus d'un paquet si le message est très long. Dans ce cas, l'offset est la postion des données dans le total envoyé, la taille actuelle est le nombre d'octets transmis dans le paquet courant, et la taille max le nombre d'octets transmis pour l'ensemble des paquets.