Page personnelle de Nicolas Favre-Félix

Protocole Net Send


Description simple

Le serveur

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

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.


Description du paquet

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.

L'en-tête DCE-RPC

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

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 :

padding-after = 3- ((x-1) % 4)

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 :

  • Taille max : 4 octets, little-endian (La taille totale des messages de tous les paquets) .
  • Offset : 4 octets, little-endian (L'offset dans le total, 0x00 pour un seul paquet).
  • Taille actuelle : 4 octets, little-endian (Le nombre d'octets dans ce paquet).
  • Valeur : la chaîne, terminée par un zéro.

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.