Apprenez le français ou comment obtenir un adaptateur universel à partir d'un scanner de diagnostic PSA

Pour éviter une diminution du QI pendant l'auto-isolement, il y avait un désir de faire quelque chose d'utile pour eux-mêmes, et si vous avez de la chance - pas seulement. Coupant le nième cercle autour de l'appartement, mes yeux se sont posés sur un scanner de voiture, que j'ai pris à un ami pour une étude plus approfondie, à savoir Lexia 3, alias Actia XS Evolution. En voici un:
image
son énorme inconvénient était que seul le logiciel DiagBox conçu pour diagnostiquer les voitures Peugeout / Citroën pouvait fonctionner avec. Il était impossible de supporter ce (s) dernier (s), donc l’idée est apparue que si ce scanner était obligé d’envoyer et de recevoir des messages arbitraires vers le bus CAN du véhicule, le transformant ainsi en un adaptateur universel.

Ainsi, le plan d'action:

  1. Collectez la communication USB entre le PC et notre patient.
  2. Comprenez comment la communication se produit entre le pilote de l'adaptateur et le logiciel.
  3. Répétez l'échange et sentez-vous bien (spoiler: cela s'est avéré être un peu plus compliqué).

1. Échange


Le complexe logiciel DiagBox surfe librement sur Internet, donc il n'y a eu aucune difficulté avec l'étape 1, d'autant plus qu'il est livré avec un petit utilitaire pour identifier l'adaptateur, ce qui a quelque peu simplifié la tâche à partir de l'étape 2. Lors de la réception d'un échange via USB, une version d'essai d' USBLyzer a aidé .
Nous allons au succès. Dans l'image, le paquet de données envoyé, le type de périphérique dans le répartiteur et le même utilitaire.

image

En regardant les IRP lors de l'ouverture de l'appareil et de l'échange avec lui, nous pouvons conclure que le travail est effectué via le mécanisme standard d'E / S Windows, à savoir, pour ouvrir le fichier virtuel de l'appareil, la fonction CreateFile et pour l'échange DeviceIOControl.

image

2. Débriefing


Les données sont collectées, l'ID IOCTL et les drapeaux sont reçus, cela reste le cas pour les petits, ouvrez le périphérique de fichiers et envoyez-y un paquet d'octets. Il suffit de l'ouvrir? La recherche via WinObj n'a donné aucun résultat, une fois connecté, l'adaptateur n'a pas de nom exact, seul un lien implicite avec un ID en constante évolution, c'est-à-dire, simplement ouvrir un appareil comme un port COM ne fonctionnera pas

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

L'étude des fichiers du programme l'a montré clairement, tout s'est avéré assez simple - l'adaptateur a son propre GUID unique, à l'aide duquel le système d'exploitation est demandé une liste de tous les appareils avec un tel GUID et s'ils sont présents, nous obtiendrons un lien vers l'appareil, dont l'
\\?\USB#VID_103A&PID_F000#6&268bff9b&0&7#{75a835f4-d77d-4402-8585-c42247f25b76}\vcommusb0ouverture sera réussie.

Fonction renvoyant le chemin au lieu du GUID:

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

Le "fichier" s'ouvre avec succès, n'oubliez pas les drapeaux obtenus via USBLyzer

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

3. Finale


Nous envoyons un paquet d'octets, et en réponse - silence ...

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

Pendant longtemps, je me suis assis et j'ai regardé le moniteur, voici le même échange, voici les réponses de l'appareil, voici les drapeaux, exactement les mêmes que je l'ai répétés, mais rien ne vient.

image

Ayant finalement perdu tout espoir de réussite, j'avais une dernière chose - de l'artillerie lourde sous la forme d'un disque du magazine Hacker avec le programme OllyDbg. Nous commençons, nous attachons au processus, mettons le point d'arrêt sur les fonctions DeviceIoControl et ce que nous voyons.

image

Le roi n'est pas réel. Un code IOCTL complètement différent, les données ne sont pas du tout comme celles vues via USBLyzer.

Ce qui a été envoyé à l'appareil:

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

Et cela est passé par 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

L'astuce était au nom du périphérique visible dans le gestionnaire de tâches. J'ai trouvé un article sur le site Web de Microsoft sur ce qu'est un pilote USB UMDF. Diagramme fonctionnel clair:

image

il s'avère que ce que nous voyons dans USBLyzer est la couche de transport du transfert de données client, qui est implémentée dans le pilote UMDF (direction 7 dans l'image), tandis que nous transférons les données vers l'appareil (direction 2 dans l'image), qui ira d'abord au pilote, puis au bus USB. J'espère que je l'ai clairement expliqué.

Maintenant, tout est clair d'où viennent les autres ID et données IOCTL. Eh bien, c'est encore plus simple, vous n'avez pas besoin de creuser la tête pour implémenter le transport, nous avons l'interface de demande-réponse la plus simple. Également dans les fichiers du programme, la description du protocole d'échange (partiel) a été accidentellement surchargée, c'est dommage uniquement en français.

image

Selon lui, dans le message ci-dessus, la version du firmware (00 FA) a été demandée, à laquelle une réponse a été reçue avec la ligne APPLI_XS_Fuji_ P106138A V4.3.0 @ACTIA 02.01.12.

TOUT. Nous configurons CAN, envoyons des adresses de demande-réponse pour la communication en utilisant le protocole ISO-TP et obtenons un adaptateur pleinement fonctionnel avec la voiture. Pour faciliter l'utilisation, un wrapper a été écrit qui, dans la mesure du possible, est conforme à la norme PassThru J2534, de sorte que cet adaptateur peut être utilisé avec divers logiciels automobiles, y compris sa propre conception.

Vidéo du travail (stdout est sortie sur la console pour faciliter le débogage):


Les sources peuvent être trouvées ici

All Articles