
Python dumper/explorer para MCD Runtime Projects usados pela ODIS
Tópico do fórum Nefarious Motorsports: http://nefariousmotorsports.com/forum/index.php?topic=23836.0
Este projeto Python tem como objetivo desempacotar (e utilizar) os dados armazenados em MCD Runtime Projects (conhecidos coloquialmente como ".db e .key files").
Normalmente, esses arquivos são usados pelo MCD Kernel, que por sua vez é usado pelo ODIS ou iDEX ou algo assim.
Em cada instalação do ODIS, há um aplicativo MCD-Kernel/VWMCDClient.exe que pode ser usado para mexer nos projetos em um nível muito mais baixo.
Para usar esses dados, normalmente se usam as bibliotecas de Include_Libs e MCD-Kernel para escrever seu próprio aplicativo C++/Java que analisa os objetos.
No entanto, há alguns problemas com essa abordagem:
Com esta ferramenta, você pode abordar os bancos de dados a partir do nível mais baixo possível. Espero que seja útil para o estudo de ODX, J2534, UDS e o que mais vier.
[!NOTE] Nenhum projeto/banco de dados será fornecido! Por favor, traga os seus :)
A forma como esses projetos funcionam é que os pares de arquivos .db e .key representam "Pools" (e "PoolID" se refere ao nome do arquivo sem extensão). Cada pool contém Objetos.
Qualquer objeto é armazenado como um fluxo de dados, cujos bytes serão lidos como flags/strings/números etc.
Cada um é armazenado de forma diferente, então... muito tempo foi dedicado ao Ghidra e x64dbg.
Você provavelmente pode apreciar o trabalho que isso deu dando uma olhada dentro da pasta object_loaders.
Sob nenhuma circunstância garanto que estou carregando todos os tipos de objeto corretamente. Pelo contrário, muitos campos foram nomeados conforme o que eu sentia que representavam. Basicamente, toda classe na biblioteca C++ herda de outras classes e tenho que admitir que não consegui realmente entender isso quando descompilado.
Para tradução de texto, é necessário o HSQLDB, que só pode ser usado através do Java. Portanto, o JPype precisará ser instalado:
pip install jpype1
Para informações de uso de cada script, chame-os com o argumento '-h' (ou apenas veja o código-fonte).
Os scripts que têm a opção de tradução de texto (dumpDTC e parseMWB) precisarão de um banco de dados.
C:/ProgramData), deve haver uma pasta DIDB/db.didb_Base-..., onde '...' é um idioma como 'en_US'.Se você não fornecer esse banco de dados, para dumpDTC você não terá a "descrição mais detalhada", e para parseMWB tudo usará seu LONG-NAME padrão do ODX.
dumpProject / dumpAllProjectsEsses módulos despejarão todos os Objetos de cada Pool (de cada Projeto). Esteja ciente de que despejar todos os projetos exigirá algumas dezenas de gigabytes e levará algumas horas. Pessoalmente, trabalhei com uma partição separada que poderia formatar para excluir rapidamente todos os arquivos.
No estado atual, todos os meus projetos são despejados sem erros. Tentei projetos de 2020 e 2022. É possível que projetos mais antigos/novos falhem ao despejar por vários motivos, muito provavelmente tipos de objeto não tratados, ou campos não tratados em tipos de objeto tratados (que eu codifiquei manualmente, já que eram os mesmos em todos os projetos).
[!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 despejará "padrões de correspondência ECU-VARIANT", necessários para o procedimento de "identificação de variante" (selecionar o arquivo apropriado para uma 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 despejará "definições de DTC". Ele despejará apenas os objetos necessários para DTCs (= diagnostic trouble codes) - serviço 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 despejará "definições de Freeze Frame". Ele despejará apenas os objetos necessários para registros de dados estendidos de DTC - serviço 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 despejará "definições de Adaptação". Ele despejará apenas os objetos necessários para Gravação de Dados de Calibração (= valores que você pode alterar na ECU) - serviço 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 despejará "definições de Codificação". Ele despejará apenas os objetos necessários para Codificação de Variante - serviço 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 despejará "definições de MWB". Ele despejará apenas os objetos necessários para MWBs (= Messwertblöcke - Blocos de medição) - serviço 0x22.
Esta é de longe a parte mais importante e não padronizada do diagnóstico UDS, um dos principais propósitos deste projeto.
[!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 pegará uma resposta do serviço UDS 0x22 e a analisará de forma semelhante ao MCD Kernel. Provavelmente foi o que mais deu trabalho, além dos carregadores 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
Mais alguns exemplos são fornecidos em docs/mwb_examples.txt.
dumpHSQLDBEste script despejará o conteúdo de todas as tabelas de um banco de dados HSQLDB. O nome de usuário e senha estão codificados, mas não espero que mudem. Se encontrar problemas, veja o capítulo seguinte.
[!TIP]
python dumpHSQLDB.py "C:/ProgramData/OE/DIDB/db" "didb_Base-en_US" "O:\HSQLDB"
O bin/hsqldb.jar incluído é uma versão não modificada do SourceForge, versão 1.8.0.
Se você encontrar problemas como "usuário não existe" ao fornecer um banco de dados de tradução, pode renomear hsqldb.jar para outra coisa e renomear hsqldb_mod.jar para hsqldb.jar.
Esse foi modificado para despejar automaticamente todos os usuários e senhas de um banco de dados na inicialização.
[!NOTE] O erro "usuário não existe" também pode ser exibido se o banco de dados foi carregado incorretamente de alguma forma. Por favor, certifique-se de que forneceu o caminho correto.
O .jar modificado escreverá algo assim na saída padrão:
Name: PUBLIC, password: null
Name: _SYSTEM, password: null
Name: SA, password: ENMGZIRN
Name: VAUDASISTSUPER, password: ENMGZIRN
Como efeito colateral, isso sempre será impresso quando o HSQLDB for usado em um dos scripts que precisam dele.
[!TIP] Se desejar iniciar um servidor a partir de um banco de dados (para seus próprios experimentos), execute isso de dentro da pasta
bin:java -cp hsqldb.jar org.hsqldb.Server -database.0 file:"C:/ProgramData/OE/DIDB/db/didb_Base-en_US" -dbname.0 testdbVocê se conectará a ele usando a URL
jdbc:hsqldb:hsql://localhost/testdb.
Se mais alguém for dedicado/entediado o suficiente, é muito bem-vindo a contribuir com este projeto, mesmo que apenas submetendo uma issue.
Se quiser adicionar funcionalidades (como despejar outras coisas importantes), fique à vontade para ver como as coisas são despejadas atualmente, como MWBs ou DTCs, depois use dumpProject e procure com um editor de texto por nomes de objetos, campos e tal.
Em docs/MCD-2D.md você pode encontrar a documentação usada para a validação dos dados, formatada de forma agradável.
O bin/pbl.dll incluído é simplesmente compilado a partir da biblioteca PBL da Mission-Base.
É necessário para acessar os arquivos .key.
Nenhuma IA foi prejudicada na criação deste desperdício de recursos. Apenas um pouco de ajuda para o módulo LongNameTranslation. Eu não tive paciência para descobrir a integração Java e SQL sozinho.