
Dumper/explorateur Python pour les projets runtime MCD utilisés par ODIS
Fil de discussion du forum Nefarious Motorsports : http://nefariousmotorsports.com/forum/index.php?topic=23836.0
Ce projet Python a pour but de décompresser (et d'utiliser) les données stockées dans les projets MCD Runtime (communément appelés « fichiers *.db et .key * »).
Normalement, ces fichiers sont utilisés par le noyau MCD, qui est ensuite utilisé par ODIS ou iDEX ou autre.
Chaque installation d'ODIS fournit une application MCD-Kernel/VWMCDClient.exe qui permet de manipuler les projets à un niveau beaucoup plus bas.
Pour utiliser ces données, on utiliserait normalement les bibliothèques de Include_Libs et MCD-Kernel pour écrire sa propre application C++/Java qui analyse les objets.
Cette approche présente cependant quelques problèmes :
Avec cet outil, vous pouvez aborder les bases de données depuis le niveau le plus bas possible.
J'espère qu'il sera utile pour l'étude d'ODX, J2534, UDS et tout autre chose.
[!NOTE] Aucun projet/base de données ne sera jamais fourni !
Veuillez apporter les vôtres :)
Le fonctionnement de ces projets est que les paires de fichiers .db et .key représentent des « Pools » (et « PoolID » fait référence au nom de fichier sans extension).
Chaque pool contient des Objets.
Tout objet est stocké sous forme de flux de données, dont les octets seront lus comme des drapeaux/chaînes/nombres, etc.
Chacun est stocké différemment, donc... beaucoup de temps a été investi dans Ghidra et x64dbg.
Vous pouvez probablement apprécier le travail nécessaire en jetant un coup d'œil dans le dossier object_loaders.
En aucun cas je ne garantis que je charge correctement chaque type d'objet.
Au contraire, de nombreux champs ont été nommés selon ce que je pensais qu'ils représentaient.
En gros, chaque classe de la bibliothèque C++ hérite d'autres classes et je dois admettre que je n'ai pas vraiment pu comprendre le schéma une fois décompilé.
Pour la traduction de texte, HSQLDB est nécessaire, qui ne peut être utilisé qu'avec Java.
Par conséquent, JPype devra être installé :
pip install jpype1
Pour obtenir des informations d'utilisation sur chaque script, appelez-les avec l'argument '-h' (ou regardez simplement le code source).
Les scripts qui ont l'option de traduction de texte (dumpDTC et parseMWB) auront besoin d'une base de données.
C:/ProgramData), il devrait y avoir un dossier DIDB/db.didb_Base-..., où '...' est une langue comme 'en_US'.Si vous ne fournissez pas une telle base de données, pour dumpDTC vous n'aurez pas la « description plus détaillée », et pour parseMWB tout utilisera son LONG-NAME par défaut d'ODX.
dumpProject / dumpAllProjectsCes modules vident tous les Objets de chaque Pool (de chaque Projet).
Sachez que vider tous les projets nécessitera quelques dizaines de gigaoctets et prendra quelques heures.
Personnellement, j'ai travaillé avec une partition séparée que je pouvais formater pour supprimer rapidement tous les fichiers.
Dans l'état actuel, tous mes projets sont vidés sans erreur.
J'ai essayé des projets de 2020 et 2022.
Il est possible que des projets plus anciens/plus récents échouent pour diverses raisons, très probablement des types d'objets non gérés, ou des champs non gérés dans des types d'objets gérés (que j'ai codés en dur car ils étaient identiques dans tous les projets).
[!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"
dumpECUVariantPatternsCe script videra les « modèles de correspondance ECU-VARIANT », nécessaires à la procédure d'« identification de variante » (sélection du fichier approprié pour un 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"
dumpDTCCe script videra les « définitions de DTC ».
Il videra uniquement les objets nécessaires aux DTC (= codes de diagnostic) - service 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
dumpFreezeFramesCe script videra les « définitions d'images figées ».
Il videra uniquement les objets nécessaires aux enregistrements de données étendus des DTC - service 0x19, mode 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
dumpAdaptationsCe script videra les « définitions d'adaptation ».
Il videra uniquement les objets nécessaires à l'écriture de données de calibration (= valeurs que vous pouvez modifier dans l'ECU) - service 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"
dumpCodingCe script videra les « définitions de codage ».
Il videra uniquement les objets nécessaires au codage de variante - service 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"
dumpMWBCe script videra les « définitions MWB ».
Il videra uniquement les objets nécessaires aux MWB (= Messwertblöcke - Blocs de mesure) - service 0x22.
C'est de loin la partie la plus importante et non standardisée du diagnostic UDS, l'un des objectifs principaux de ce projet.
[!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"
parseMWBCe script prendra une réponse du service UDS 0x22 et l'analysera de manière similaire au noyau MCD.
C'est probablement ce qui a demandé le plus de travail, en dehors des chargeurs d'objets.
[!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
Quelques exemples supplémentaires sont fournis dans docs/mwb_examples.txt.
dumpHSQLDBCe script videra le contenu de toutes les tables d'une base de données HSQLDB.
Le nom d'utilisateur et le mot de passe sont codés en dur, mais je ne m'attends pas à ce qu'ils changent un jour.
Si vous rencontrez des problèmes, consultez le chapitre suivant.
[!TIP]
python dumpHSQLDB.py "C:/ProgramData/OE/DIDB/db" "didb_Base-en_US" "O:\HSQLDB"
Le fichier bin/hsqldb.jar inclus est une version non modifiée de SourceForge, version 1.8.0.
Si vous rencontrez des erreurs comme « l'utilisateur n'existe pas » lors de la fourniture d'une base de données de traduction, vous pouvez renommer hsqldb.jar en autre chose et renommer hsqldb_mod.jar en hsqldb.jar.
Celui-ci a été modifié pour vider automatiquement tous les utilisateurs et mots de passe d'une base de données au démarrage.
[!NOTE] L'erreur « l'utilisateur n'existe pas » peut également apparaître si la base de données a été chargée incorrectement.
Veuillez vous assurer d'avoir fourni le bon chemin.
Le .jar modifié écrira quelque chose comme ceci sur la sortie standard :
Name: PUBLIC, password: null
Name: _SYSTEM, password: null
Name: SA, password: ENMGZIRN
Name: VAUDASISTSUPER, password: ENMGZIRN
Par effet secondaire, cela sera toujours imprimé lorsque HSQLDB est utilisé depuis l'un des scripts qui en ont besoin.
[!TIP] Si vous souhaitez démarrer un serveur à partir d'une base de données (pour vos propres expériences), exécutez ceci depuis le dossier
bin:java -cp hsqldb.jar org.hsqldb.Server -database.0 file:"C:/ProgramData/OE/DIDB/db/didb_Base-en_US" -dbname.0 testdbVous vous y connecterez en utilisant l'URL
jdbc:hsqldb:hsql://localhost/testdb.
Si quelqu'un d'autre est suffisamment dévoué/ennuyé, il est le bienvenu pour contribuer à ce projet, ne serait-ce qu'en soumettant un problème.
Si vous souhaitez ajouter des fonctionnalités (comme vider d'autres éléments importants), vous êtes libre de jeter un coup d'œil à la façon dont les choses sont vidées actuellement, comme les MWB ou les DTC, puis d'utiliser dumpProject et de rechercher avec un éditeur de texte des noms d'objets, des champs, etc.
Dans docs/MCD-2D.md, vous trouverez la documentation utilisée pour la validation des données, joliment formatée.
Le fichier bin/pbl.dll inclus est simplement compilé à partir de la bibliothèque PBL par Mission-Base.
Il est nécessaire pour accéder aux fichiers .key.
Aucune IA n'a été blessée dans la réalisation de ce gaspillage de ressources. Juste un peu d'aide pour le module LongNameTranslation. Je n'ai pas eu envie de comprendre l'intégration Java et SQL moi-même.