Descripteurs USB, VID/PID et ce que veut dire cloner un descripteur
Ce que contient un descripteur USB HID et quels champs identifient un appareil, pourquoi les listes de souris compatibles existent, et pourquoi un descripteur générique est une identité plus faible qu'un descripteur cloné.
Réponse courte
Un descripteur USB HID est la façon dont un appareil se décrit au branchement : son vendor ID, son product ID, ses chaînes de caractères et son format de rapport. Cloner un descripteur veut dire que le périphérique d'entrée présente l'identité de la vraie souris qui y est branchée plutôt que la sienne, générique.
Sur cette page10
- Qu'est-ce qu'un descripteur USB ?
- Quels champs du descripteur identifient un appareil
- Pourquoi changer seulement le VID et le PID ne suffit pas
- Pourquoi les listes de souris compatibles existent
- Comment fonctionne le clonage de descripteur
- Identités d'origine, génériques et clonées comparées
- Comment auditer votre propre appareil
- Ce qu'un descripteur cloné ne peut pas cacher
- Questions fréquentes sur les descripteurs
- Sources
Qu'est-ce qu'un descripteur USB ?
Quand un appareil USB est branché, l'hôte lui demande de se décrire, et rien d'autre ne se passe tant qu'il n'a pas répondu. L'appareil répond par un ensemble de descripteurs. Un descripteur de périphérique dit qui l'a fabriqué et de quel modèle il s'agit, et un descripteur de configuration dit combien d'interfaces il possède. Les descripteurs d'interface et de point de terminaison disent ce que fait chaque interface et à quelle fréquence elle veut être interrogée. Tout ce qui est clavier, souris ou manette envoie aussi un HID report descriptor, qui décrit la disposition exacte, octet par octet, des messages qu'il enverra. Cet échange s'appelle l'énumération, il dure quelques millisecondes, et il a lieu avant qu'aucun pilote ne soit chargé. Tout ce que le système d'exploitation croira plus tard de l'appareil vient de ces millisecondes. Votre périphérique d'entrée répond aux mêmes questions, et il peut y répondre bien ou mal.
Quels champs du descripteur identifient un appareil
Ce n'est pas toute la spécification USB, mais un logiciel sur l'hôte peut lire chacun des champs listés ici sans privilèges particuliers.
| Champ | Ce qu'il contient | Ce qu'il révèle |
|---|---|---|
| idVendor (VID) | Un nombre sur 16 bits attribué à une entreprise par l'organisme de normalisation USB | Qui a fabriqué l'appareil. Le VID d'un fabricant de souris connu, sur une machine équipée de cette souris, ne surprend personne. Le VID d'un fabricant de cartes de développement pose question |
| idProduct (PID) | Un nombre sur 16 bits que le fabricant attribue à un modèle précis | Quel modèle. Le VID et le PID forment ensemble l'identité publique de l'appareil, et c'est ce couple qu'utilisent l'association des pilotes, la télémétrie et les outils d'inventaire |
| iManufacturer et iProduct | Des index vers des descripteurs de chaînes, relus sous forme de texte | Le nom lisible affiché dans le gestionnaire de périphériques. Le champ le plus souvent oublié, et l'indice le plus facile quand il annonce une chose qu'aucune souris ne dirait |
| iSerialNumber | Un index optionnel vers une chaîne de numéro de série | Un identifiant propre à l'exemplaire. Certaines souris en ont un, beaucoup n'en ont pas. Windows s'en sert pour décider si un appareil reconnecté sur un autre port est bien le même appareil |
| bcdDevice | Un numéro de révision défini par le fabricant | La révision du firmware. Les vrais produits la font évoluer d'une version à l'autre. Une valeur qui ne change jamais sur tous les exemplaires du monde est en soi un motif |
| bcdUSB | La version de la spécification USB que l'appareil prétend implémenter | L'époque de spécification qu'il affiche, et si son comportement full speed ou haut débit est cohérent avec le reste de ses déclarations |
| bDeviceClass et bInterfaceClass | Des codes de classe. La classe 3, c'est HID | Qu'il s'agit d'un périphérique d'interface humaine plutôt que d'un stockage, d'un appareil audio ou d'un adaptateur série |
| Nombre d'interfaces | Combien de fonctions un même appareil physique expose | S'il s'agit d'une souris, ou d'un gadget composite qui est une souris plus un port série plus autre chose. Une simple souris n'est en général pas trois choses |
| bInterval sur le point de terminaison | L'intervalle d'interrogation que l'appareil demande à l'hôte | La fréquence de rapport qu'il prétend vouloir. Un appareil dont le descripteur demande un intervalle modeste tout en rapportant bien plus vite se contredit lui-même |
| HID report descriptor | Usage page et usages, taille des champs d'axes, nombre de boutons, molette, éventuelles collections définies par le fabricant | La forme de l'appareil. Le nombre de boutons, le fait que les axes de mouvement soient sur 8 ou 16 bits, la présence d'une molette horizontale, et la présence ou l'absence d'un bloc propre au fabricant que ce modèle devrait avoir |
Aucun de ces champs n'est secret, et aucun n'exige de pilote pour être lu. N'importe quel processus sur l'hôte peut énumérer les appareils qui y sont branchés et lire chacun de ces champs.
Attention
Pourquoi changer seulement le VID et le PID ne suffit pas
On traite les identifiants de fabricant et de produit comme s'ils étaient toute l'identité, et ce sont bien les premières choses que l'on vérifie, mais ce ne sont que deux nombres parmi beaucoup d'autres. Imaginez un appareil qui porte le VID et le PID d'un fabricant de souris connu alors que sa chaîne de produit nomme encore une carte microcontrôleur. Son descripteur de rapport déclare un nombre de boutons différent de celui de ce modèle, et son point de terminaison demande un intervalle que ce modèle n'utilise jamais. Cela paraît pire que de ne rien toucher, parce qu'une identité copiée à moitié ne tient pas debout et qu'une incohérence est exactement ce qu'un contrôle cherche. Si vous changez les identifiants, changez tout ce qui va avec.
Pourquoi les listes de souris compatibles existent
Les anciens firmwares de passthrough n'analysaient pas le descripteur de la souris branchée. Ils embarquaient à la place des profils écrits en dur : une table de dispositions de rapports pour des modèles nommés, rédigée à la main. Si vous branchiez une souris de la liste, le firmware savait décoder ses rapports et copier son identité. Si vous branchiez autre chose, vous obteniez soit rien du tout, soit un mouvement incohérent. C'est de là que vient la question des souris compatibles, et sur un firmware de cette génération c'est une vraie contrainte à vérifier avant d'acheter une souris. Les firmwares plus récents lisent la disposition depuis l'appareil pendant l'énumération et s'y adaptent, et la lecture automatique du HID report descriptor par MAKCM en est l'exemple le plus net. C'est pour cela que les listes ont cessé de compter sur les appareils actuels, même si vous devriez toujours vérifier à quelle génération appartient votre firmware plutôt que de le supposer.
Comment fonctionne le clonage de descripteur
Le clonage de descripteur se fait en deux temps. Le périphérique d'entrée énumère la vraie souris de son côté hôte et lit ce que cette souris a dit d'elle-même, puis présente les mêmes réponses au PC de jeu de son côté device. L'identité que voit le PC de jeu appartient donc à une souris qui existe vraiment et qui est vraiment branchée, un cran plus loin. Un clonage complet couvre les identifiants, les chaînes de caractères, la révision, la disposition des interfaces et le descripteur de rapport, si bien que les réponses concordent entre elles puisqu'elles viennent d'un seul appareil réel. Un clonage partiel couvre les identifiants mais laisse les chaînes ou le descripteur de rapport propres à l'appareil de passthrough, ce qui ramène le problème d'incohérence. La bonne question à poser sur un firmware n'est donc pas s'il sait spoofer un VID, mais quelle part du descripteur il copie.
Conseil
Identités d'origine, génériques et clonées comparées
Une identité d'origine, c'est la carte de passthrough qui s'annonce pour ce qu'elle est. Sur un Teensy laissé tel quel, cela veut dire le vendor ID et les chaînes de produit d'une carte de développement, sur une machine qui n'a aucune autre raison d'en avoir une. Une identité générique est une souris inventée qui a l'air assez vraie : une souris HID conforme à la classe, avec des chaînes neutres. Elle ne surprend pas en soi, mais elle ne correspond à aucun produit vendu, et elle est la même pour tous ceux qui font tourner ce firmware. Une identité clonée, c'est le descripteur de la souris réellement posée sous votre main. Elle est cohérente, elle correspond à un produit qui existe, et elle diffère d'un utilisateur à l'autre puisque leurs souris diffèrent. Ce sont trois positions différentes, et elles forment un classement. Aucune d'elles n'est pourtant une preuve de quoi que ce soit, parce que ce classement parle du degré d'anomalie que vous présentez, pas de sécurité.
Comment auditer votre propre appareil
Faites-le depuis le PC de jeu avec un USB device viewer, pour voir votre périphérique d'entrée comme le voit le PC de jeu. Cela prend cinq minutes et vous apprend plus que n'importe quel fil de forum.
- Les chaînes de produit et de fabricant se lisent comme une souris, pas comme un microcontrôleur ou une carte de développement
- Les identifiants de fabricant et de produit vont ensemble et correspondent à un produit qui existe vraiment
- Le nombre de boutons et la molette du descripteur de rapport correspondent au modèle revendiqué
- L'appareil présente une seule interface souris HID, pas une souris plus un port série plus un clavier dont vous ne vous servez jamais
- L'intervalle d'interrogation demandé est un intervalle que le modèle revendiqué utilise de façon plausible
- Une chaîne de numéro de série est présente ou absente, exactement comme sur le modèle revendiqué
- Rien dans le gestionnaire de périphériques n'affiche un nom que vous ne vous attendriez pas à voir sur un PC de jeu normal
Attention
Ce qu'un descripteur cloné ne peut pas cacher
Un descripteur parfaitement cloné rend l'appareil banal pendant l'énumération, mais il ne fait rien sur le rythme et la forme du mouvement que l'appareil injecte ensuite. C'est cette couche-là que l'analyse regarde, et c'est celle qui inquiète réellement les gens. Un mouvement qui claque se voit quoi qu'ait dit le descripteur, et un mouvement trop lisse aussi. Il en va de même d'un mouvement dont la courbe d'accélération est identique à chaque flick, ou d'un mouvement qui corrige la position d'une cible plus vite qu'une main ne le peut. Le travail sur le descripteur supprime une catégorie de signal facile. Vous en avez besoin, mais il ne suffit pas à lui seul, et le croire suffisant est la façon dont des gens très bien équipés se font prendre à se comporter comme un logiciel.
Questions fréquentes sur les descripteurs
Un jeu peut-il lire le descripteur de ma souris ?
Un processus sur la machine peut énumérer les appareils USB branchés et lire leurs descripteurs sans privilèges particuliers, et un anticheat qui tourne avec un accès noyau le peut assurément. Savoir si un titre donné le fait, et ce qu'il fait du résultat, n'est pas quelque chose que quiconque hors de cette entreprise puisse honnêtement vous dire.
Si je clone le descripteur de ma vraie souris, y aura-t-il deux appareils identiques ?
Non, parce que votre vraie souris est branchée du côté hôte du périphérique d'entrée et non sur le PC de jeu, si bien que le PC de jeu ne voit jamais qu'un seul appareil portant cette identité. Si vous branchez en plus la vraie souris directement sur le PC de jeu, vous créez exactement le doublon que vous vouliez éviter.
Cloner un descripteur est-il illégal ?
Présenter le vendor ID d'une autre entreprise détourne un identifiant qui a été attribué à cette entreprise, et c'est aussi une affaire de conditions d'utilisation avec le jeu. Nous ne sommes pas juristes et ceci n'est pas un conseil juridique. C'est en revanche techniquement possible.
Changer le descripteur a-t-il un effet sur les performances ?
Le descripteur de rapport, oui. Si vous déclarez des axes relatifs sur 16 bits au lieu de 8, les écarts de mouvement plus grands tiennent dans un seul rapport au lieu d'être tronqués et découpés. C'est la différence entre un mouvement fluide et un mouvement en escalier sur les grands flicks, tandis que les champs d'identité n'ont aucun effet sur les performances.
Mon cheat a une option de spoof du descripteur. L'activer suffit-il ?
C'est mieux que de la laisser désactivée, mais ce n'est pas une réponse complète à soi seule. Renseignez-vous sur ce qu'elle change réellement : seulement les identifiants, ou aussi les chaînes de caractères et le descripteur de rapport. Auditez ensuite le résultat depuis le PC de jeu avec un device viewer plutôt que de faire confiance à l'étiquette de la case à cocher.
Dois-je utiliser une souris bon marché comme donneuse ?
Utilisez la souris avec laquelle vous jouez vraiment. L'intérêt du clonage, c'est que l'identité corresponde à un appareil que vous possédez et utilisez de façon plausible, et votre vraie souris est la plus plausible dont vous disposiez.
Sources
Le classement des identités d'origine, génériques et clonées est notre propre lecture, tout comme la checklist d'audit, qui vient de nos essais sur table.
- 01Microsoft Learn, USB device descriptors
les champs idvendor, idproduct, chaînes et classe du tableau, et la façon dont windows s'appuie dessus
learn.microsoft.com
- 02Microsoft, Windows debugging tools (WDK)
d'où vient l'usb device viewer utilisé dans la checklist d'audit
learn.microsoft.com
- 03MAKCM firmware, GPL-3.0
que le firmware makcm actuel analyse le hid report descriptor de la souris branchée au lieu d'utiliser une liste de modèles
github.com
À lire ensuite
Toujours bloqué ? Ouvrir un ticket sur Discord
Tous les guides