Aprenda francés o cómo obtener un adaptador universal de un escáner de diagnóstico PSA

Para evitar una disminución en el coeficiente intelectual durante el autoaislamiento, había un deseo de hacer algo útil por sí mismos, y si tienes suerte, no solo. Al cortar el enésimo círculo alrededor del apartamento, mis ojos se encontraron con el escáner de un automóvil, que tomé de un amigo para estudiarlo más a fondo, es decir, Lexia 3, también conocida como Actia XS Evolution. Aquí hay uno:
imagen
su gran inconveniente fue que solo el software DiagBox diseñado para diagnosticar automóviles Peugeout / Citroen puede funcionar con él. Era imposible soportar el último (s), por lo tanto, surgió la idea de que si este escáner se veía obligado a enviar y recibir mensajes arbitrarios al bus CAN del vehículo, convirtiéndolo en un adaptador universal.

Entonces, el plan de acción:

  1. Recopile la comunicación USB entre la PC y nuestro paciente.
  2. Comprenda cómo se produce la comunicación entre el controlador del adaptador y el software.
  3. Repite el intercambio y siéntete bien (spoiler: resultó ser un poco más complicado).

1. Intercambio


El complejo de software DiagBox navega libremente por Internet, por lo que no hubo dificultades con el paso 1, especialmente porque viene con una pequeña utilidad para identificar el adaptador, lo que simplificó un poco la tarea del paso 2. Al recibir un intercambio a través de USB, ayudó una versión de prueba de USBLyzer .
Vamos al exito. En la imagen, el paquete de datos enviado, el tipo de dispositivo en el despachador y la misma utilidad.

imagen

Al observar los IRP al abrir el dispositivo e intercambiar con él, podemos concluir que el trabajo se realiza a través del mecanismo estándar de E / S de Windows, es decir, para abrir el archivo virtual del dispositivo, la función CreateFile y para el intercambio, DeviceIOControl.

imagen

2. Debriefing


Se recopilan los datos, se reciben el ID de IOCTL y los indicadores, sigue siendo el caso para los pequeños, abre el dispositivo de archivo y envía un paquete de bytes allí. ¿Solo ábrelo? La búsqueda a través de WinObj no dio ningún resultado, cuando está conectado, el adaptador no tiene un nombre exacto, solo un enlace implícito con una identificación que cambia constantemente, es decir, simplemente abrir un dispositivo como un puerto COM no funcionará

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

El estudio de los archivos del programa dejó en claro que todo resultó ser bastante simple: el adaptador tiene su propio GUID único, con la ayuda del cual se solicita al sistema operativo una lista de todos los dispositivos con dicho GUID y, si están presentes, obtendremos un enlace al dispositivo,
\\?\USB#VID_103A&PID_F000#6&268bff9b&0&7#{75a835f4-d77d-4402-8585-c42247f25b76}\vcommusb0cuya apertura será exitosa.

Función que devuelve la ruta en lugar del GUID:

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

El "archivo" se abre con éxito, no se olvide de las banderas que se obtuvieron a través de USBLyzer

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

3. Final


Enviamos un paquete de bytes y, en respuesta, silencio ...

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

Durante mucho tiempo me senté y miré el monitor, aquí está el mismo intercambio, aquí están las respuestas del dispositivo, aquí están las banderas, exactamente lo mismo que repetí, pero no sale nada.

imagen

Finalmente había perdido toda esperanza de éxito, tenía una última cosa: artillería pesada en forma de disco de la revista Hacker con el programa OllyDbg. Comenzamos, nos unimos al proceso, ponemos el punto de interrupción en las funciones de DeviceIoControl y lo que vemos.

imagen

El rey no es real. Un código IOCTL completamente diferente, los datos no se parecen en nada al que se ve a través de USBLyzer.

Lo que se envió al dispositivo:

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

Y eso pasó 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

La pista estaba en el nombre del dispositivo visible en el administrador de tareas. Encontré un artículo en el sitio web de Microsoft sobre qué es un controlador USB UMDF. Diagrama de bloques claro:

imagen

Resulta que lo que vemos en USBLyzer es la capa de transporte de la transferencia de datos del cliente, que se implementa en el controlador UMDF (dirección 7 en la imagen), mientras transferimos datos al dispositivo (dirección 2 en la imagen), que primero irá al controlador y luego al bus USB. Espero haberlo explicado claramente.

Ahora está claro de dónde provienen los otros ID y datos de IOCTL. Bueno, es aún más simple, no tiene que esforzarse por cómo implementar el transporte, tenemos la interfaz de solicitud-respuesta más simple. También en los archivos del programa, la descripción del protocolo de intercambio (parcial) se sobrecargó accidentalmente, es una pena solo en francés.

imagen

Según él, la versión de firmware (00 FA) se solicitó en el mensaje anterior, al que se recibió una respuesta con la línea APPLI_XS_Fuji_ P106138A V4.3.0 @ACTIA 02.01.12.

TODAS. Configuramos CAN, enviamos direcciones de solicitud-respuesta para la comunicación utilizando el protocolo ISO-TP y obtenemos un adaptador que funciona completamente con el automóvil. Para facilitar su uso, se escribió un envoltorio que, en la medida de lo posible, cumple con el estándar PassThru J2534, de modo que este adaptador se puede usar con varios programas de automoción, incluido su propio diseño.

Video de trabajo (stdout se emite a la consola para facilitar la depuración):


Las fuentes se pueden encontrar aquí

All Articles