Lernen Sie Französisch oder wie Sie einen Universaladapter von einem PSA-Diagnosescanner erhalten

Um eine Abnahme des IQ während der Selbstisolation zu verhindern, bestand der Wunsch, etwas Nützliches für sich selbst zu tun, und wenn Sie Glück haben - nicht nur. Als ich den n-ten Kreis um die Wohnung schnitt, fiel mein Blick auf einen Autoscanner, den ich von einem Freund zur weiteren Untersuchung mitgenommen hatte, nämlich Lexia 3, auch bekannt als Actia XS Evolution. Hier ist einer:
Bild
Der große Nachteil war, dass nur DiagBox-Software zur Diagnose von Peugeout / Citroen-Fahrzeugen damit arbeiten kann. Es war unmöglich, sich mit letzteren abzufinden, daher entstand die Idee, dass dieser Scanner gezwungen war, beliebige Nachrichten an den CAN-Bus des Fahrzeugs zu senden und zu empfangen, wodurch er zu einem universellen Adapter wurde.

Also der Aktionsplan:

  1. Sammeln Sie die USB-Kommunikation zwischen dem PC und unserem Patienten.
  2. Verstehen Sie, wie die Kommunikation zwischen dem Adaptertreiber und der Software erfolgt.
  3. Wiederholen Sie den Austausch und fühlen Sie sich gut (Spoiler: es stellte sich als etwas komplizierter heraus).

1. Austausch


Der DiagBox-Softwarekomplex surft frei im Internet, sodass es bei Schritt 1 keine Schwierigkeiten gab, zumal er ein kleines Dienstprogramm zur Identifizierung des Adapters enthält, das die Aufgabe ab Schritt 2 etwas vereinfacht. Beim Empfang eines Austauschs über USB half eine Testversion von USBLyzer .
Wir werden zum Erfolg führen. In der Abbildung das gesendete Datenpaket, der Gerätetyp im Dispatcher und dasselbe Dienstprogramm.

Bild

Wenn wir uns die IRPs beim Öffnen und Austauschen des Geräts ansehen, können wir den Schluss ziehen, dass die Arbeit über den Standard-Windows-E / A-Mechanismus erfolgt, nämlich das Erstellen der virtuellen Datei des Geräts, der CreateFile-Funktion und für den Austausch DeviceIOControl.

Bild

2. Nachbesprechung


Die Daten werden gesammelt, die IOCTL-ID und die Flags werden empfangen, es bleibt der Fall für kleine, öffnen Sie das Dateigerät und senden Sie dort ein Paket von Bytes. Einfach aufmachen? Die Suche in WinObj ergab keine Ergebnisse. Wenn die Verbindung hergestellt ist, hat der Adapter keinen genauen Namen, nur eine implizite Verknüpfung mit einer sich ständig ändernden ID. Das einfache Öffnen eines Geräts wie eines COM-Anschlusses funktioniert nicht

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

Das Studium der Programmdateien machte deutlich, dass sich alles als recht einfach herausstellte - der Adapter verfügt über eine eigene eindeutige GUID, mit deren Hilfe das Betriebssystem nach einer Liste aller Geräte mit dieser GUID gefragt wird. Wenn diese vorhanden sind, erhalten wir einen Link zum Gerät, dessen
\\?\USB#VID_103A&PID_F000#6&268bff9b&0&7#{75a835f4-d77d-4402-8585-c42247f25b76}\vcommusb0Eröffnung erfolgreich sein wird.

Funktion, die den Pfad anstelle der GUID zurückgibt:

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

Die "Datei" wird erfolgreich geöffnet. Vergessen Sie nicht die Flags, die über USBLyzer erhalten wurden

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

3. Finale


Wir senden ein Paket von Bytes und als Antwort - Stille ...

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

Lange habe ich gesessen und auf den Monitor geschaut, hier ist der gleiche Austausch, hier sind die Antworten vom Gerät, hier sind die Flaggen, genau die gleichen, die ich wiederholt habe, aber es kommt nichts heraus.

Bild

Nachdem ich endlich alle Hoffnung auf Erfolg verloren hatte, hatte ich noch eine letzte Sache - schwere Artillerie in Form einer Scheibe aus dem Hacker-Magazin mit dem OllyDbg-Programm. Wir starten, hängen an den Prozess an, setzen den Haltepunkt auf die DeviceIoControl-Funktionen und was wir sehen.

Bild

Der König ist nicht real. Bei einem völlig anderen IOCTL-Code sind die Daten überhaupt nicht mit denen von USBLyzer vergleichbar.

Was wurde an das Gerät gesendet:

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

Und das ging über 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

Der Hinweis befand sich im Namen des Geräts, das im Task-Manager angezeigt wurde. Ich habe auf der Microsoft-Website einen Artikel darüber gefunden, was ein UMDF-USB-Treiber ist. Klares Blockdiagramm:

Bild

Es stellt sich heraus, dass wir in USBLyzer die Transportschicht für die Client-Datenübertragung sehen, die im UMDF-Treiber implementiert ist (Richtung 7 im Bild), während wir Daten zum Gerät übertragen (Richtung 2 im Bild). Das geht zuerst zum Treiber und dann zum USB-Bus. Ich hoffe ich habe es klar erklärt.

Jetzt ist klar, woher die anderen IOCTL-IDs und -Daten stammen. Nun, es ist noch einfacher, Sie müssen sich nicht die Mühe machen, den Transport zu implementieren. Wir haben die einfachste Anforderungs-Antwort-Schnittstelle. Auch in den Programmdateien wurde die Beschreibung des Austauschprotokolls (teilweise) versehentlich überladen, schade nur auf Französisch.

Bild

Ihm zufolge wurde in der obigen Nachricht die Firmware-Version (00 FA) angefordert, auf die eine Antwort mit der Zeile APPLI_XS_Fuji_ P106138A V4.3.0 @ACTIA 02.01.12 empfangen wurde.

ALLE. Wir konfigurieren CAN, senden Anforderungs-Antwort-Adressen für die Kommunikation unter Verwendung des ISO-TP-Protokolls und erhalten einen voll funktionsfähigen Adapter mit dem Auto. Zur Vereinfachung der Verwendung wurde ein Wrapper geschrieben, der so weit wie möglich dem PassThru J2534-Standard entspricht, sodass dieser Adapter mit verschiedenen Automobilsoftware einschließlich seines eigenen Designs verwendet werden kann.

Video der Arbeit (stdout wird zum bequemen Debuggen an die Konsole ausgegeben):


Quellen finden Sie hier

All Articles