Aprenda francês ou como obter um adaptador universal em um scanner de diagnóstico PSA

Para evitar uma diminuição no QI durante o auto-isolamento, havia um desejo de fazer algo útil para si mesmos, e se você tiver sorte - não apenas. Cortando o nono círculo em torno do apartamento, meus olhos se depararam com um scanner de carro, que eu peguei de um amigo para um estudo mais aprofundado, o Lexia 3, também conhecido como Actia XS Evolution. Aqui está uma:
imagem
sua grande desvantagem foi que apenas o software DiagBox projetado para diagnosticar carros Peugeout / Citroen pode trabalhar com ele. Não foi possível atendê-los, portanto surgiu a ideia de que, se esse scanner fosse forçado a enviar e receber mensagens arbitrárias para o barramento CAN do veículo, transformando-o em um adaptador universal.

Então, o plano de ação:

  1. Colete a comunicação USB entre o PC e nosso paciente.
  2. Entenda como ocorre a comunicação entre o driver do adaptador e o software.
  3. Repita a troca e sinta-se bem (spoiler: acabou por ser um pouco mais complicado).

1. Troca


O complexo de software DiagBox navega livremente na Internet, portanto não houve dificuldades com a etapa 1, especialmente porque ele vem com um pequeno utilitário para identificar o adaptador, o que simplificou um pouco a tarefa da etapa 2. Ao receber uma troca via USB, uma versão de avaliação do USBLyzer ajudou .
Nós estamos indo para o sucesso. Na figura, o pacote de dados enviado, o tipo de dispositivo no expedidor e o mesmo utilitário.

imagem

Observando os IRPs ao abrir o dispositivo e trocar com ele, podemos concluir que o trabalho é realizado através do mecanismo padrão de E / S do Windows, a saber, para abrir o arquivo virtual do dispositivo, a função CreateFile e para a troca DeviceIOControl.

imagem

2. Debriefing


Os dados são coletados, o ID IOCTL e os sinalizadores são recebidos; ainda é pequeno, abra o dispositivo de arquivo e envie um pacote de bytes para lá. Basta abrir? A pesquisa no WinObj não deu nenhum resultado; quando conectado, o adaptador não tem um nome exato, apenas um link implícito com um ID que muda constantemente, ou seja, simplesmente abrir um dispositivo como uma porta COM não funcionará.

CreateFile("\\\\.\\COM1", ...)

O estudo dos arquivos do programa deixou claro que tudo se tornou bastante simples - o adaptador possui seu próprio GUID exclusivo, com a ajuda de que o sistema operacional solicita uma lista de todos os dispositivos com esse GUID e, se houver, obteremos um link para o dispositivo, cuja
\\?\USB#VID_103A&PID_F000#6&268bff9b&0&7#{75a835f4-d77d-4402-8585-c42247f25b76}\vcommusb0abertura será bem-sucedida.

Função retornando o caminho em vez do GUID:

CM_Get_Device_Interface_List(InterfaceClassGuid, pDeviceID, Buffer, BufferLen, ulFlags);

O "arquivo" abre com sucesso, não se esqueça das bandeiras que foram obtidas via USBLyzer

Device = CreateFile(DeviceName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

3. Final


Enviamos um pacote de bytes e, em resposta - silêncio ...

bStatus = DeviceIoControl(Device, 0x220003, send_buf, send_len, out_buf, max_out_len, &returned_len, NULL);

Por um longo tempo, sentei-me e olhei para o monitor, aqui está a mesma troca, aqui estão as respostas do dispositivo, aqui estão as bandeiras, exatamente as mesmas que eu repeti, mas nada resulta disso.

imagem

Tendo finalmente perdido toda a esperança de sucesso, eu tinha uma última coisa - artilharia pesada na forma de um disco da revista Hacker com o programa OllyDbg. Começamos, anexamos ao processo, colocamos o ponto de interrupção nas funções DeviceIoControl e o que vemos.

imagem

O rei não é real. Um código IOCTL completamente diferente, os dados não são como os vistos pelo USBLyzer.

O que foi enviado ao dispositivo:

<b>00 FA</b> <i>AA</i> BA 7C 15 00 00 00 00 00 00

E isso passou por USB:

40 05 15 C0 <b>00 FA</b> 00 00 <i>AA</i> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41

A dica estava no nome do dispositivo visível no gerenciador de tarefas. Encontrei um artigo no site da Microsoft sobre o que é um driver USB UMDF. Diagrama de bloco claro:

imagem

verifica-se que o que vemos no USBLyzer é a camada de transporte de transferência de dados do cliente, que é implementada no driver UMDF (direção 7 na figura), enquanto transferimos dados para o dispositivo (direção 2 na figura), que primeiro vai para o driver e depois para o barramento USB. Espero ter explicado claramente.

Agora está claro de onde vêm os outros IDs e dados da IOCTL. Bem, é ainda mais simples: você não precisa se preocupar em como implementar o transporte, temos a interface mais simples de solicitação e resposta. Também nos arquivos do programa a descrição do protocolo de troca (parcial) foi acidentalmente sobrecarregada, é uma pena apenas em francês.

imagem

Segundo ele, na mensagem acima, foi solicitada a versão do firmware (00 FA), à qual foi recebida uma resposta com a linha APPLI_XS_Fuji_ P106138A V4.3.0 @ACTIA 02.01.12.

TODOS. Configuramos o CAN, enviamos endereços de solicitação-resposta para comunicação usando o protocolo ISO-TP e obtemos um adaptador totalmente funcional com o carro. Para facilitar o uso, foi escrito um invólucro que, na medida do possível, está em conformidade com o padrão PassThru J2534, para que este adaptador possa ser usado com vários softwares automotivos, incluindo seu próprio design.

Vídeo do trabalho (stdout é enviado para o console para facilitar a depuração):


As fontes podem ser encontradas aqui

All Articles