
Python-Dumper/Explorer für MCD Runtime-Projekte, die von ODIS verwendet werden
Nefarious Motorsports Forum-Thread: http://nefariousmotorsports.com/forum/index.php?topic=23836.0
Dieses Python-Projekt dient dazu, die in MCD Runtime Projects gespeicherten Daten zu entpacken (und zu nutzen) (umgangssprachlich als "*.db and .key files" bekannt).
Normalerweise werden diese Dateien vom MCD-Kernel verwendet, der dann von ODIS oder iDEX oder ähnlichem genutzt wird.
Mit jeder ODIS-Installation wird eine App MCD-Kernel/VWMCDClient.exe bereitgestellt, mit der man auf einer viel niedrigeren Ebene mit den Projekten herumspielen kann.
Um diese Daten zu nutzen, würde man normalerweise die Bibliotheken aus Include_Libs und MCD-Kernel verwenden, um eine eigene C++/Java-App zu schreiben, die die Objekte parst.
Es gibt jedoch einige Probleme mit diesem Ansatz:
Mit diesem Tool können Sie die Datenbanken von der niedrigstmöglichen Ebene aus angehen. Ich hoffe, es ist für das Studium von ODX, J2534, UDS und was auch immer sonst nützlich.
[!NOTE] Es werden niemals Projekte/Datenbanken bereitgestellt! Bitte bringen Sie Ihre eigenen mit :)
Die Funktionsweise dieser Projekte ist, dass die Paare von .db- und .key-Dateien "Pools" darstellen (und "PoolID" bezieht sich auf den Dateinamen ohne Erweiterung). Jeder Pool enthält Objekte.
Jedes Objekt wird als Datenstrom gespeichert, dessen Bytes als Flags/Zeichenfolgen/Zahlen usw. gelesen werden.
Jedes ist anders gespeichert, also... viel Zeit wurde in Ghidra und x64dbg gesteckt.
Sie können die geleistete Arbeit wahrscheinlich würdigen, wenn Sie einen Blick in den Ordner object_loaders werfen.
Unter keinen Umständen garantiere ich, dass ich jeden Objekttyp korrekt lade. Im Gegenteil, viele Felder wurden so benannt, wie ich das Gefühl hatte, was sie darstellen. Grundsätzlich erbt jede Klasse in der C++-Bibliothek von anderen Klassen, und ich muss zugeben, dass ich es beim Dekompilieren nicht wirklich verstanden habe.
Für die Textübersetzung wird HSQLDB benötigt, das nur über Java verwendet werden kann. Daher muss JPype installiert werden:
pip install jpype1
Für Nutzungsinformationen zu jedem Skript rufen Sie es mit dem Argument '-h' auf (oder schauen Sie einfach in den Quellcode).
Die Skripte, die die Option der Textübersetzung haben (dumpDTC und parseMWB), benötigen eine Datenbank.
C:/ProgramData) nach, dort sollte ein DIDB/db-Ordner sein.didb_Base-... enthalten, wobei '...' eine Sprache wie 'en_US' ist.Wenn Sie keine solche Datenbank angeben, haben Sie bei dumpDTC keine "detailliertere Beschreibung",
und bei parseMWB verwendet alles seinen standardmäßigen LONG-NAME aus ODX.
dumpProject / dumpAllProjectsDiese Module werden jedes Objekt aus jedem Pool (aus jedem Projekt) ausgeben. Seien Sie sich bewusst, dass das Ausgeben aller Projekte einige zehn Gigabyte erfordert und ein paar Stunden dauert. Ich persönlich habe mit einer separaten Partition gearbeitet, die ich formatieren konnte, um alle Dateien schnell zu löschen.
Im aktuellen Zustand werden alle meine Projekte fehlerfrei ausgegeben. Ich habe Projekte von 2020 und 2022 getestet. Es ist möglich, dass ältere/neuere Projekte aus verschiedenen Gründen nicht ausgegeben werden können, höchstwahrscheinlich aufgrund nicht behandelter Objekttypen oder nicht behandelter Felder in behandelten Objekttypen (die ich fest codiert habe, da sie in allen Projekten gleich waren).
[!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"
dumpECUVariantPatternsDieses Skript wird "ECU-VARIANT-Abgleichmuster" ausgeben, die für die "Variantenidentifikations"-Prozedur (Auswahl der geeigneten Datei für ein Steuergerät) notwendig sind.
[!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"
dumpDTCDieses Skript wird "DTC-Definitionen" ausgeben. Es wird nur die für DTCs (= Diagnose-Fehlercodes) notwendigen Objekte ausgeben - 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
dumpFreezeFramesDieses Skript wird "Freeze Frame-Definitionen" ausgeben. Es wird nur die für erweiterte DTC-Datensätze notwendigen Objekte ausgeben - Service 0x19, Modus 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
dumpAdaptationsDieses Skript wird "Adaptionsdefinitionen" ausgeben. Es wird nur die für das Schreiben von Kalibrierdaten (= Werte, die Sie im Steuergerät ändern können) notwendigen Objekte ausgeben - 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"
dumpCodingDieses Skript wird "Coding-Definitionen" ausgeben. Es wird nur die für das Varianten-Coding notwendigen Objekte ausgeben - 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"
dumpMWBDieses Skript wird "MWB-Definitionen" ausgeben. Es wird nur die für MWBs (= Messwertblöcke) notwendigen Objekte ausgeben - Service 0x22.
Dies ist mit Abstand der wichtigste und nicht standardisierte Teil der UDS-Diagnose, einer der Hauptzwecke dieses Projekts.
[!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"
parseMWBDieses Skript nimmt eine UDS-Service-0x22-Antwort entgegen und parst sie ähnlich wie der MCD-Kernel. Es hat wahrscheinlich die meiste Arbeit erfordert, abgesehen von den Objektladern.
[!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
Einige weitere Beispiele finden Sie in docs/mwb_examples.txt.
dumpHSQLDBDieses Skript wird den Inhalt aller Tabellen einer HSQLDB-Datenbank ausgeben. Der Benutzername und das Passwort sind fest codiert, aber ich erwarte nicht, dass sie sich jemals ändern. Wenn Sie auf Probleme stoßen, schauen Sie sich das folgende Kapitel an.
[!TIP]
python dumpHSQLDB.py "C:/ProgramData/OE/DIDB/db" "didb_Base-en_US" "O:\HSQLDB"
Das enthaltene bin/hsqldb.jar ist eine unveränderte Version von SourceForge, Version 1.8.0.
Wenn Sie beim Bereitstellen einer Übersetzungsdatenbank auf Probleme wie "user does not exist" stoßen, können Sie hsqldb.jar in etwas anderes umbenennen und hsqldb_mod.jar in hsqldb.jar umbenennen.
Diese wurde modifiziert, um beim Start automatisch alle Benutzer und Passwörter einer Datenbank auszugeben.
[!NOTE] Der Fehler "user does not exist" kann auch angezeigt werden, wenn die Datenbank irgendwie falsch geladen wurde. Bitte stellen Sie sicher, dass Sie den richtigen Pfad angegeben haben.
Die modifizierte .jar wird etwa Folgendes auf die Standardausgabe schreiben:
Name: PUBLIC, password: null
Name: _SYSTEM, password: null
Name: SA, password: ENMGZIRN
Name: VAUDASISTSUPER, password: ENMGZIRN
Als Nebeneffekt wird dies immer gedruckt, wenn HSQLDB von einem der Skripte verwendet wird, die es benötigen.
[!TIP] Wenn Sie einen Server aus einer Datenbank starten möchten (für eigene Experimente), führen Sie dies aus dem
bin-Ordner aus:java -cp hsqldb.jar org.hsqldb.Server -database.0 file:"C:/ProgramData/OE/DIDB/db/didb_Base-en_US" -dbname.0 testdbSie verbinden sich mit der URL
jdbc:hsqldb:hsql://localhost/testdb.
Wenn jemand anderes engagiert/gelangweilt genug ist, ist er herzlich willkommen, zu diesem Projekt beizutragen, auch nur durch das Einreichen eines Issues.
Wenn Sie Funktionalität hinzufügen möchten (z.B. andere wichtige Dinge auszugeben), können Sie sich gerne ansehen, wie Dinge derzeit ausgegeben werden, wie MWBs oder DTCs, dann dumpProject verwenden und mit einem Texteditor nach Objektnamen, Feldern und ähnlichem suchen.
In docs/MCD-2D.md finden Sie die für die Validierung der Daten verwendete Dokumentation, schön formatiert.
Das enthaltene bin/pbl.dll ist einfach aus der PBL-Bibliothek von Mission-Base kompiliert.
Es ist für den Zugriff auf die .key-Dateien erforderlich.
Es wurde keine KI bei der Herstellung dieser Ressourcenverschwendung verletzt. Nur ein wenig Hilfe für das LongNameTranslation-Modul. Ich hatte keine Lust, die Java- und SQL-Integration selbst herauszufinden.