
Volcador/explorador en Python para proyectos MCD Runtime utilizados por ODIS
Hilo del foro de Nefarious Motorsports: http://nefariousmotorsports.com/forum/index.php?topic=23836.0
Este proyecto Python está pensado para desempaquetar (y hacer uso de) los datos almacenados en MCD Runtime Projects (coloquialmente conocidos como "archivos *.db y .key").
Normalmente, estos archivos son utilizados por el MCD Kernel, que a su vez es utilizado por ODIS, iDEX o lo que sea.
Cada instalación de ODIS incluye una aplicación MCD-Kernel/VWMCDClient.exe que se puede usar para manipular los proyectos a un nivel mucho más bajo.
Para usar estos datos, normalmente se utilizarían las librerías de Include_Libs y MCD-Kernel para escribir tu propia aplicación en C++/Java que analice los objetos.
Sin embargo, hay algunos problemas con este enfoque:
Con esta herramienta, puedes abordar las bases de datos desde el nivel más bajo posible. Espero que sea útil para el estudio de ODX, J2534, UDS y cualquier otra cosa.
[!NOTE] ¡Nunca se proporcionarán proyectos/bases de datos! Traiga los suyos propios :)
La forma en que funcionan estos proyectos es que los pares de archivos .db y .key representan "Pools" (y "PoolID" se refiere al nombre del archivo sin extensión). Cada pool contiene Objetos.
Cualquier objeto se almacena como un flujo de datos, cuyos bytes se leerán como banderas/cadenas/números, etc.
Cada uno se almacena de manera diferente, así que... se dedicó mucho tiempo a Ghidra y x64dbg.
Probablemente puedas apreciar el trabajo que tomó echando un vistazo dentro de la carpeta object_loaders.
Bajo ninguna circunstancia garantizo que esté cargando correctamente todos los tipos de objetos. Por el contrario, muchos campos fueron nombrados según lo que sentí que representaban. Básicamente, cada clase en la biblioteca C++ hereda de otras clases y debo admitir que no pude entenderlo realmente cuando se descompiló.
Para la traducción de texto, se necesita HSQLDB, que solo se puede usar a través de Java. Por lo tanto, será necesario instalar JPype:
pip install jpype1
Para obtener información de uso de cada script, llámelos con el argumento '-h' (o simplemente mire el código fuente).
Los scripts que tienen la opción de traducción de texto (dumpDTC y parseMWB) necesitarán una base de datos.
C:/ProgramData), debería haber una carpeta DIDB/db.didb_Base-..., donde '...' es un idioma como 'en_US'.Si no proporciona dicha base de datos, para dumpDTC no tendrá la "descripción más detallada",
y para parseMWB todo usará su LONG-NAME predeterminado de ODX.
dumpProject / dumpAllProjectsEstos módulos volcarán todos los Objetos de cada Pool (de cada Proyecto). Tenga en cuenta que volcar todos los proyectos requerirá unas decenas de gigabytes y llevará un par de horas. Personalmente trabajé con una partición separada que podía formatear para eliminar rápidamente todos los archivos.
En el estado actual, todos mis proyectos se vuelcan sin errores. Probé proyectos de 2020 y 2022. Es posible que proyectos más antiguos/nuevos fallen al volcar por varias razones, muy probablemente tipos de objetos no manejados, o campos no manejados en tipos de objetos manejados (que codifiqué manualmente ya que eran los mismos en todos los proyectos).
[!TIP]
python dumpProject.py "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "O:/Projects"python dumpAllProjects.py "C:/ProgramData/OE/MCD-Projects-E/VWMCD" "O:/Projects"
dumpECUVariantPatternsEste script volcará los "patrones de coincidencia ECU-VARIANTE", necesarios para el procedimiento de "identificación de variante" (selección del archivo apropiado para una ECU).
[!TIP]
python dumpECUVariantPatterns.py basevariant "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "0.0.0@BV_DashBoardUDS.bv" "O:/Patterns"python dumpECUVariantPatterns.py project "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "O:/Patterns"python dumpECUVariantPatterns.py projects "C:/ProgramData/OE/MCD-Projects-E/VWMCD" "O:/Patterns"
dumpDTCEste script volcará las "definiciones de DTC". Solo volcará los objetos necesarios para DTCs (= códigos de diagnóstico de problemas) - servicio 0x19.
[!TIP]
python dumpDTC.py basevariant "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "0.0.0@BV_DashBoardUDS.bv" "O:/DTCs" "C:/ProgramData/OE/DIDB/db" en_USpython dumpDTC.py project "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "O:/DTCs" "C:/ProgramData/OE/DIDB/db" en_USpython dumpDTC.py projects "C:/ProgramData/OE/MCD-Projects-E/VWMCD" "O:/DTCs" "C:/ProgramData/OE/DIDB/db" en_US
dumpFreezeFramesEste script volcará las "definiciones de Fotogramas Congelados". Solo volcará los objetos necesarios para los registros de datos extendidos de DTC - servicio 0x19, modo 0x06.
[!TIP]
python dumpFreezeFrames.py basevariant "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "0.0.0@BV_DashBoardUDS.bv" "O:/FFs" "C:/ProgramData/OE/DIDB/db" en_USpython dumpFreezeFrames.py project "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "O:/FFs" "C:/ProgramData/OE/DIDB/db" en_USpython dumpFreezeFrames.py projects "C:/ProgramData/OE/MCD-Projects-E/VWMCD" "O:/FFs" "C:/ProgramData/OE/DIDB/db" en_US
dumpAdaptationsEste script volcará las "definiciones de Adaptación". Solo volcará los objetos necesarios para la Escritura de Datos de Calibración (= valores que puedes cambiar en la ECU) - servicio 0x2E.
[!TIP]
python dumpAdaptations.py basevariant "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "0.0.0@BV_DashBoardUDS.bv" "O:/ADPs"python dumpAdaptations.py project "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "O:/ADPs"python dumpAdaptations.py projects "C:/ProgramData/OE/MCD-Projects-E/VWMCD" "O:/ADPs"
dumpCodingEste script volcará las "definiciones de Codificación". Solo volcará los objetos necesarios para la Codificación de Variantes - servicio 0x2E, DID 0x0600.
[!TIP]
python dumpCoding.py basevariant "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "0.0.0@BV_DashBoardUDS.bv" "O:/VRCs"python dumpCoding.py project "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "O:/VRCs"python dumpCoding.py projects "C:/ProgramData/OE/MCD-Projects-E/VWMCD" "O:/VRCs"
dumpMWBEste script volcará las "definiciones de MWB". Solo volcará los objetos necesarios para MWBs (= Messwertblöcke - Bloques de medición) - servicio 0x22.
Esta es, con diferencia, la parte más importante y no estandarizada del diagnóstico UDS, uno de los principales propósitos de este proyecto.
[!TIP]
python dumpMWB.py basevariant "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "0.0.0@BV_DashBoardUDS.bv" "O:/MWBs"python dumpMWB.py project "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "O:/MWBs"python dumpMWB.py projects "C:/ProgramData/OE/MCD-Projects-E/VWMCD" "O:/MWBs"
parseMWBEste script tomará una respuesta del servicio UDS 0x22 y la analizará de manera similar al MCD Kernel. Probablemente fue la que más trabajo llevó, aparte de los cargadores de objetos.
[!TIP]
python parseMWB.py "C:/ProgramData/OE/MCD-Projects-E/VWMCD/AU21X" "0.0.0@BV_EnginContrModul1UDS.bv" "EV_ECM25TFS0118U0907404C_001" 0xF40C C0E4 "C:/ProgramData/OE/DIDB/db" en_US
Se proporcionan algunos ejemplos más en docs/mwb_examples.txt.
dumpHSQLDBEste script volcará el contenido de todas las tablas de una base de datos HSQLDB. El nombre de usuario y la contraseña están codificados, pero no espero que cambien nunca. Si encuentras problemas, consulta el siguiente capítulo.
[!TIP]
python dumpHSQLDB.py "C:/ProgramData/OE/DIDB/db" "didb_Base-en_US" "O:\HSQLDB"
El bin/hsqldb.jar incluido es una versión sin modificar de SourceForge, versión 1.8.0.
Si encuentras problemas como "el usuario no existe" al proporcionar una base de datos de traducción,
puedes renombrar hsqldb.jar a otra cosa y renombrar hsqldb_mod.jar a hsqldb.jar.
Ese ha sido modificado para volcar automáticamente todos los usuarios y contraseñas de una base de datos al inicio.
[!NOTE] El error "el usuario no existe" también puede mostrarse si la base de datos se cargó incorrectamente. Asegúrate de haber proporcionado la ruta correcta.
El .jar modificado escribirá algo como esto en la salida estándar:
Name: PUBLIC, password: null
Name: _SYSTEM, password: null
Name: SA, password: ENMGZIRN
Name: VAUDASISTSUPER, password: ENMGZIRN
Como efecto secundario, esto siempre se imprimirá cuando se use HSQLDB desde uno de los scripts que lo necesitan.
[!TIP] Si deseas iniciar un servidor desde una base de datos (para tus propios experimentos), ejecuta esto desde dentro de la carpeta
bin:java -cp hsqldb.jar org.hsqldb.Server -database.0 file:"C:/ProgramData/OE/DIDB/db/didb_Base-en_US" -dbname.0 testdbTe conectarás a él usando la URL
jdbc:hsqldb:hsql://localhost/testdb.
Si alguien más está lo suficientemente dedicado/aburrido, es muy bienvenido a contribuir a este proyecto, incluso solo enviando un issue.
Si deseas agregar funcionalidad (como volcar otras cosas importantes), eres libre de mirar cómo se vuelcan las cosas actualmente,
como MWBs o DTCs, luego usa dumpProject y busca con un editor de texto nombres de objetos, campos y demás.
En docs/MCD-2D.md puedes encontrar la documentación utilizada para la validación de datos, bien formateada.
El bin/pbl.dll incluido está simplemente compilado de la biblioteca PBL de Mission-Base.
Es necesario para acceder a los archivos .key.
No se dañó ninguna IA en la creación de este desperdicio de recursos. Solo un poco de ayuda para el módulo LongNameTranslation. No tuve ganas de descubrir la integración de Java y SQL por mí mismo.