
Dumper/esploratore Python per progetti MCD Runtime usati da ODIS
Thread del forum Nefarious Motorsports: http://nefariousmotorsports.com/forum/index.php?topic=23836.0
Questo progetto Python serve a estrarre (e utilizzare) i dati memorizzati nei progetti MCD Runtime (noti colloquialmente come "file .db e .key").
Normalmente, questi file vengono usati dal kernel MCD, che a sua volta viene usato da ODIS o iDEX o qualsiasi altra cosa.
Ogni installazione di ODIS include un'app MCD-Kernel/VWMCDClient.exe che può essere usata per armeggiare con i progetti a un livello molto più basso.
Per usare questi dati, normalmente si userebbero le librerie da Include_Libs e MCD-Kernel per scrivere una propria applicazione C++/Java che analizzi gli oggetti.
Ci sono però alcuni problemi con questo approccio:
Con questo strumento puoi accedere ai database dal livello più basso possibile. Spero che sia utile per lo studio di ODX, J2534, UDS e qualsiasi altra cosa.
[!NOTE] Non verranno mai forniti progetti/database! Portatevi i vostri :)
Il funzionamento di questi progetti è che le coppie di file .db e .key rappresentano dei "Pool" (e "PoolID" si riferisce al nome del file senza estensione). Ogni pool contiene oggetti.
Ogni oggetto è memorizzato come flusso di dati, i cui byte vengono letti come flag/stringhe/numeri ecc.
Ognuno è memorizzato in modo diverso, quindi... è stato dedicato molto tempo a Ghidra e x64dbg.
Probabilmente puoi apprezzare il lavoro che è costato dando un'occhiata alla cartella object_loaders.
In nessun caso garantisco di caricare correttamente ogni tipo di oggetto. Al contrario, molti campi sono stati nominati in base a ciò che pensavo rappresentassero. Praticamente ogni classe nella libreria C++ eredita da altre classi e devo ammettere che quando l'ho decompilata non sono riuscito a venirne a capo.
Per la traduzione dei testi è necessario HSQLDB, che può essere utilizzato solo tramite Java. Pertanto, sarà necessario installare JPype:
pip install jpype1
Per informazioni sull'uso di ogni script, chiamali con l'argomento '-h' (oppure dai un'occhiata al codice sorgente).
Gli script che hanno l'opzione di traduzione dei testi (dumpDTC e parseMWB) necessitano di un database.
C:/ProgramData), dovrebbe esserci una cartella DIDB/db.didb_Base-..., dove '...' è una lingua come 'en_US'.Se non fornisci un database del genere, per dumpDTC non avrai la "descrizione più dettagliata", e per parseMWB tutto userà il suo LONG-NAME predefinito da ODX.
dumpProject / dumpAllProjectsQuesti moduli esportano ogni oggetto da ogni pool (da ogni progetto). Tieni presente che esportare tutti i progetti richiederà alcune decine di gigabyte e un paio d'ore. Personalmente ho lavorato con una partizione separata che potevo formattare per eliminare rapidamente tutti i file.
Nello stato attuale, tutti i miei progetti vengono esportati senza errori. Ho provato progetti del 2020 e del 2022. È possibile che progetti più vecchi o più nuovi non vengano esportati per vari motivi, molto probabilmente tipi di oggetto non gestiti, o campi non gestiti in tipi di oggetto gestiti (che ho hardcodato dato che erano gli stessi in tutti i progetti).
[!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"
dumpECUVariantPatternsQuesto script esporta i "modelli di corrispondenza ECU-VARIANT", necessari per la procedura di "identificazione della variante" (selezione del file appropriato per una centralina).
[!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"
dumpDTCQuesto script esporta le "definizioni DTC". Esporta solo gli oggetti necessari per i DTC (= codici di guasto diagnostici) - servizio 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
dumpFreezeFramesQuesto script esporta le "definizioni dei Freeze Frame". Esporta solo gli oggetti necessari per i record di dati estesi dei DTC - servizio 0x19, modalità 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
dumpAdaptationsQuesto script esporta le "definizioni di adattamento". Esporta solo gli oggetti necessari per la scrittura dei dati di calibrazione (= valori che puoi modificare nella centralina) - servizio 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"
dumpCodingQuesto script esporta le "definizioni di codifica". Esporta solo gli oggetti necessari per la codifica delle varianti (Variant Coding) - servizio 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"
dumpMWBQuesto script esporta le "definizioni MWB". Esporta solo gli oggetti necessari per gli MWB (= Messwertblöcke - blocchi di misura) - servizio 0x22.
Questa è di gran lunga la parte più importante e non standardizzata della diagnostica UDS, uno degli scopi principali di questo progetto.
[!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"
parseMWBQuesto script prende una risposta del servizio UDS 0x22 e la analizza in modo simile al kernel MCD. Probabilmente è quello che ha richiesto più lavoro, a parte gli object loader.
[!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
Qualche altro esempio è fornito in docs/mwb_examples.txt.
dumpHSQLDBQuesto script esporta il contenuto di tutte le tabelle di un database HSQLDB. Nome utente e password sono hardcoded, ma non credo che cambieranno mai. Se incontri problemi, dai un'occhiata al capitolo seguente.
[!TIP]
python dumpHSQLDB.py "C:/ProgramData/OE/DIDB/db" "didb_Base-en_US" "O:\HSQLDB"
Il file bin/hsqldb.jar incluso è una release non modificata da SourceForge, versione 1.8.0.
Se incontri problemi come "user does not exist" quando fornisci un database di traduzione, puoi rinominare hsqldb.jar in qualcos'altro e rinominare hsqldb_mod.jar in hsqldb.jar.
Quest'ultimo è stato modificato per esportare automaticamente tutti gli utenti e le password di un database all'avvio.
[!NOTE] L'errore "user does not exist" potrebbe essere mostrato anche se il database è stato caricato in modo errato. Assicurati di aver fornito il percorso corretto.
Il .jar modificato scriverà qualcosa del genere sull'output standard:
Name: PUBLIC, password: null
Name: _SYSTEM, password: null
Name: SA, password: ENMGZIRN
Name: VAUDASISTSUPER, password: ENMGZIRN
Come effetto collaterale, questo verrà sempre stampato quando HSQLDB viene utilizzato da uno degli script che lo richiedono.
[!TIP] Se desideri avviare un server da un database (per i tuoi esperimenti), esegui questo comando dalla cartella
bin:java -cp hsqldb.jar org.hsqldb.Server -database.0 file:"C:/ProgramData/OE/DIDB/db/didb_Base-en_US" -dbname.0 testdbTi collegherai ad esso usando l'URL
jdbc:hsqldb:hsql://localhost/testdb.
Se qualcun altro è abbastanza dedicato/annoiato, è il benvenuto a contribuire a questo progetto, anche solo aprendo una issue.
Se vuoi aggiungere funzionalità (come esportare altra roba importante), sei libero di guardare come le cose vengono esportate attualmente, ad esempio MWB o DTC, poi usa dumpProject e cerca con un editor di testi nomi di oggetti, campi e simili.
In docs/MCD-2D.md puoi trovare la documentazione utilizzata per la validazione dei dati, ben formattata.
La bin/pbl.dll inclusa è semplicemente compilata dalla libreria PBL di Mission-Base.
È necessaria per accedere ai file .key.
Nessuna IA è stata danneggiata nella creazione di questo spreco di risorse. Solo un piccolo aiuto per il modulo LongNameTranslation. Non avevo voglia di capire da solo l'integrazione tra Java e SQL.