Descritores USB, VID/PID e o que significa clonar um descritor
O que um descritor USB HID guarda e quais campos identificam um dispositivo, por que existem listas de mouses compatíveis, e por que um descritor genérico é uma identidade mais fraca do que um clonado.
Resposta curta
Um descritor USB HID é como um dispositivo se descreve ao ser conectado: vendor ID, product ID, strings e formato dos relatórios. Clonar o descritor significa que o dispositivo de entrada apresenta a identidade do mouse real ligado a ele, em vez da sua própria identidade genérica.
Nesta página10
- O que é um descritor USB?
- Quais campos do descritor identificam um dispositivo
- Por que mudar só o VID e o PID não basta
- Por que existem listas de mouses compatíveis
- Como funciona a clonagem de descritor
- Identidades de fábrica, genéricas e clonadas lado a lado
- Como auditar o seu próprio dispositivo
- O que um descritor clonado não esconde
- Perguntas comuns sobre descritores
- Fontes
O que é um descritor USB?
Quando qualquer dispositivo USB é conectado, o host pede que ele se descreva, e nada mais acontece até que ele responda. O dispositivo responde com um conjunto de descritores. Um device descriptor diz quem o fabricou e qual é o modelo, e um configuration descriptor diz quantas interfaces ele tem. Os descritores de interface e de endpoint dizem o que cada interface faz e com que frequência ela quer ser consultada. Tudo o que é teclado, mouse ou gamepad envia também um HID report descriptor, que descreve o layout exato em bytes das mensagens que vai mandar. Essa troca se chama enumeração, e acontece em milissegundos, antes de qualquer driver ser carregado. Tudo o que o sistema operacional acredita depois sobre o dispositivo vem desses milissegundos. O seu dispositivo de entrada responde às mesmas perguntas, e pode respondê-las bem ou mal.
Quais campos do descritor identificam um dispositivo
Isto não é a especificação USB inteira, mas qualquer software no host consegue ler todos os campos listados aqui sem privilégios especiais.
| Campo | O que guarda | O que revela |
|---|---|---|
| idVendor (VID) | Um número de 16 bits atribuído a uma empresa pelo órgão de padronização do USB | Quem fabricou o dispositivo. O VID de um fabricante de mouse conhecido em uma máquina que tem aquele mouse não chama atenção. O VID de um fabricante de placas de desenvolvimento é uma pergunta |
| idProduct (PID) | Um número de 16 bits que o fabricante atribui a um modelo específico | Qual modelo. VID e PID juntos são a identidade pública do dispositivo e o par em que o casamento de drivers, a telemetria e as ferramentas de inventário se apoiam |
| iManufacturer e iProduct | Índices para descritores de string, lidos de volta como texto | O nome legível que aparece no Gerenciador de Dispositivos. É o campo mais esquecido, e o sinal mais fácil quando diz algo que nenhum mouse diria |
| iSerialNumber | Um índice opcional para uma string de número de série | Um identificador por unidade. Alguns mouses têm, muitos não. O Windows o usa para decidir se um dispositivo reconectado em outra porta é o mesmo dispositivo |
| bcdDevice | Um número de revisão do dispositivo definido pelo fabricante | A revisão de firmware. Produtos reais mudam esse número entre versões. Um valor que nunca muda em nenhuma unidade do mundo já é um padrão |
| bcdUSB | A versão da especificação USB que o dispositivo diz implementar | De que época de especificação ele se apresenta, e se o comportamento full speed ou high speed combina com o resto do que ele alega |
| bDeviceClass e bInterfaceClass | Códigos de classe. A classe 3 é HID | Que isto é um dispositivo de interface humana, e não armazenamento, áudio ou um adaptador serial |
| Número de interfaces | Quantas funções um único dispositivo físico expõe | Se isto é um mouse, ou um gadget composto que é mouse mais porta serial mais outra coisa. Um mouse comum não costuma ser três coisas |
| bInterval no endpoint | O intervalo de polling que o dispositivo pede ao host | A taxa de relatórios que ele diz querer. Um dispositivo cujo descritor pede um intervalo modesto enquanto reporta muito mais rápido está se contradizendo |
| HID report descriptor | Usage page e usages, tamanho dos campos de eixo, contagem de botões, roda, quaisquer collections definidas pelo fabricante | O formato do dispositivo. Contagem de botões, se os eixos de movimento são de 8 ou de 16 bits, se existe roda horizontal, e se falta um bloco específico do fabricante que aquele modelo deveria ter |
Nenhum desses campos é secreto, e nenhum exige driver para ser lido. Qualquer processo no host consegue enumerar os dispositivos conectados a ele e ler todos esses campos.
Atenção
Por que mudar só o VID e o PID não basta
As pessoas tratam o vendor ID e o product ID como se fossem a identidade inteira, e eles são a primeira coisa que qualquer um confere, mas são só dois números entre muitos. Imagine um dispositivo que carrega o VID e o PID de um fabricante de mouse conhecido enquanto a string de produto dele ainda nomeia uma placa de microcontrolador. O report descriptor dele declara um número de botões diferente do que aquele modelo tem, e o endpoint pede um intervalo que aquele modelo nunca usa. Isso fica pior do que deixar o dispositivo em paz, porque uma identidade copiada pela metade não fecha, e uma incoerência é exatamente o que uma verificação procura. Se você mudar os IDs, mude tudo o que vem com eles.
Por que existem listas de mouses compatíveis
Os firmwares de passthrough mais antigos não liam o descritor do mouse conectado. Em vez disso, traziam perfis fixos: uma tabela de layouts de relatório para modelos específicos, escrita à mão. Se você ligasse um mouse da lista, o firmware sabia decodificar os relatórios dele e copiar a identidade. Se ligasse outra coisa, você tinha ou nada ou movimento embaralhado. É daí que vem a pergunta sobre mouses compatíveis, e em firmware daquela geração ela é uma limitação real que você tem que conferir antes de comprar um mouse. Firmware mais novo lê o layout do próprio dispositivo durante a enumeração e se adapta, e a leitura automática do HID report descriptor no MAKCM é o exemplo mais claro. É por isso que as listas deixaram de importar nos dispositivos atuais, embora você ainda deva conferir a que geração o seu firmware pertence em vez de adivinhar.
Como funciona a clonagem de descritor
A clonagem de descritor funciona em dois passos. O dispositivo de entrada enumera o mouse real no lado host dele e lê o que aquele mouse disse sobre si mesmo, e depois apresenta as mesmas respostas ao PC de jogo pelo lado device. A identidade que o PC de jogo vê pertence, portanto, a um mouse que existe de verdade e está de fato conectado, uma camada atrás. A clonagem completa cobre os IDs, as strings, a revisão, o layout de interfaces e o report descriptor, então as respostas combinam entre si porque vieram de um único dispositivo real. A clonagem parcial cobre os IDs mas deixa as strings ou o report descriptor como os do próprio dispositivo de passthrough, o que traz de volta o problema da incoerência. Então a pergunta útil sobre qualquer firmware não é se ele consegue falsificar um VID, e sim quanto do descritor ele copia.
Dica
Identidades de fábrica, genéricas e clonadas lado a lado
Uma identidade de fábrica é a placa de passthrough se anunciando como o que ela é. Em um Teensy deixado como veio, isso significa o vendor ID e as strings de produto de uma placa de desenvolvimento em uma máquina que não tem outro motivo para ter uma. Uma identidade genérica é um mouse inventado que parece real o bastante: um mouse HID compatível com a classe e com strings neutras. Sozinha ela não chama atenção, mas não corresponde a nenhum produto que alguém venda, e é igual para todo mundo que roda aquele firmware. Uma identidade clonada é o descritor do mouse que está de fato na sua mão. Ela é coerente, corresponde a um produto que existe e difere entre usuários porque os mouses deles diferem. São três posições diferentes, e elas formam uma escala. Nenhuma delas, porém, é prova contra nada, porque a escala é sobre o quanto de anomalia você apresenta, não sobre segurança.
Como auditar o seu próprio dispositivo
Faça isso a partir do PC de jogo, com um visualizador de dispositivos USB, para ver o seu dispositivo de entrada do jeito que o PC de jogo o vê. Leva cinco minutos e diz mais do que qualquer tópico de fórum.
- As strings de produto e de fabricante se leem como um mouse, e não como um microcontrolador ou uma placa de desenvolvimento
- O vendor ID e o product ID combinam entre si e correspondem a um produto que existe de verdade
- A contagem de botões e a roda no report descriptor batem com o modelo que está sendo alegado
- O dispositivo apresenta uma interface HID de mouse, e não um mouse mais uma porta serial mais um teclado que você nunca usa
- O intervalo de polling pedido é um que o modelo alegado usaria de forma plausível
- A string de número de série está presente ou ausente exatamente como no modelo alegado
- Nada no Gerenciador de Dispositivos mostra um nome que você não esperaria ver em um PC gamer normal
Atenção
O que um descritor clonado não esconde
Um descritor perfeitamente clonado deixa o dispositivo sem chamar atenção durante a enumeração, mas não faz nada quanto ao tempo e ao formato do movimento que ele injeta depois. É nessa camada posterior que a análise acontece, e é ela que as pessoas de fato temem. Movimento que salta é visível não importa o que o descritor disse, e movimento suave demais também. O mesmo vale para movimento com uma curva de aceleração idêntica em cada flick, ou movimento que corrige a posição de um alvo mais rápido do que uma mão consegue. O trabalho de descritor elimina uma classe de sinal fácil. Você precisa dele, mas ele não basta sozinho, e tratá-lo como suficiente é como gente com setups excelentes acaba pega se comportando como software.
Perguntas comuns sobre descritores
Um jogo consegue ler o descritor do meu mouse?
Um processo na máquina consegue enumerar os dispositivos USB conectados e ler os descritores deles sem privilégios especiais, e um anticheat rodando com acesso ao kernel certamente consegue. Se um título específico faz isso, e o que faz com o resultado, não é algo que alguém de fora daquela empresa possa te dizer com honestidade.
Se eu clonar o descritor do meu mouse real, vão existir dois dispositivos idênticos?
Não, porque o seu mouse real está ligado ao lado host do dispositivo de entrada, e não ao PC de jogo, então o PC de jogo só vê um dispositivo com aquela identidade. Se você também ligar o mouse real direto no PC de jogo, você cria exatamente a duplicata que queria evitar.
Clonar um descritor é ilegal?
Apresentar o vendor ID de outra empresa usa indevidamente um identificador que foi atribuído àquela empresa, e também é uma questão de termos de serviço com o jogo. Não somos advogados e isto não é orientação jurídica. Tecnicamente, porém, é possível.
Mudar o descritor afeta o desempenho?
O report descriptor afeta. Se você declarar eixos relativos de 16 bits em vez de 8 bits, deltas de movimento maiores cabem em um único relatório em vez de serem saturados e divididos. É essa a diferença entre movimento suave e movimento em degraus em flicks grandes, enquanto os campos de identidade não têm efeito nenhum sobre desempenho.
O meu cheat tem uma opção de spoof de descritor. Ligar já basta?
É melhor do que deixar desligado, mas não é uma resposta completa sozinha. Descubra o que a opção muda de fato: só os IDs, ou também as strings e o report descriptor. Depois audite o resultado a partir do PC de jogo com um visualizador de dispositivos, em vez de confiar no rótulo da caixinha.
Devo usar um mouse barato como doador?
Use o mouse com que você realmente joga. O sentido da clonagem é que a identidade corresponda a um dispositivo que você plausivelmente tem e usa, e o seu mouse real é o mais plausível que existe.
Fontes
A classificação entre identidades de fábrica, genéricas e clonadas é leitura nossa, assim como a checklist de auditoria, que vem de testes de bancada.
- 01Microsoft Learn, USB device descriptors
os campos idvendor, idproduct, string e classe da tabela, e como o windows faz o casamento por eles
learn.microsoft.com
- 02Microsoft, Windows debugging tools (WDK)
de onde vem o usb device viewer usado na checklist de auditoria
learn.microsoft.com
- 03MAKCM firmware, GPL-3.0
que o firmware makcm atual lê o hid report descriptor do mouse conectado em vez de usar uma lista de modelos
github.com
Leia em seguida
Ainda travado? Abra um ticket no Discord
Todos os guias