
Дампер/обозреватель на Python для проектов MCD Runtime, используемых ODIS
Тема форума Nefarious Motorsports: http://nefariousmotorsports.com/forum/index.php?topic=23836.0
Этот проект на Python предназначен для распаковки (и использования) данных, хранящихся в MCD Runtime Projects (в просторечии известных как «файлы .db и .key»).
Обычно эти файлы используются ядром MCD (MCD Kernel), которое затем используется ODIS, iDEX или чем-то ещё.
В каждой установке ODIS поставляется приложение MCD-Kernel/VWMCDClient.exe, с помощью которого можно работать с проектами на гораздо более низком уровне.
Чтобы использовать эти данные, обычно нужно задействовать библиотеки из Include_Libs и MCD-Kernel, чтобы написать собственное приложение на C++/Java, которое разбирает объекты.
Однако у такого подхода есть несколько проблем:
С помощью этого инструмента вы можете подойти к базам данных с максимально низкого уровня. Надеюсь, он будет полезен для изучения ODX, J2534, UDS и всего прочего.
[!NOTE] Никакие проекты/базы данных предоставляться не будут! Приносите свои :)
Устройство этих проектов таково: пары файлов .db и .key представляют собой «пулы» (Pools) (а «PoolID» относится к имени файла без расширения). Каждый пул содержит объекты.
Любой объект хранится в виде потока данных, байты которого читаются как флаги/строки/числа и т.п.
Каждый объект хранится по-разному, поэтому... в Ghidra и x64dbg было вложено очень много времени.
Вы, вероятно, сможете оценить проделанную работу, заглянув в папку object_loaders.
Я никоим образом не гарантирую, что загружаю каждый тип объектов правильно. Напротив, многие поля названы по тому, что, как мне казалось, они обозначают. По сути, каждый класс в библиотеке C++ наследуется от других классов, и, признаться, я не смог как следует разобраться в этом при декомпиляции.
Для перевода текстов нужна HSQLDB, использовать которую можно только через Java. Поэтому потребуется установить JPype:
pip install jpype1
Чтобы получить информацию об использовании каждого скрипта, вызовите его с аргументом '-h' (или просто посмотрите исходный код).
Скриптам, у которых есть возможность перевода текста (dumpDTC и parseMWB), потребуется база данных.
C:/ProgramData) — там должна быть папка DIDB/db.didb_Base-..., где '...' — это язык, например 'en_US'.Если такую базу не указать, то для dumpDTC у вас не будет «более подробного описания»,
а для parseMWB всё будет использовать значение LONG-NAME по умолчанию из ODX.
dumpProject / dumpAllProjectsЭти модули выгружают все объекты из каждого пула (из каждого проекта). Имейте в виду, что выгрузка всех проектов потребует несколько десятков гигабайт и займёт пару часов. Лично я работал с отдельным разделом, который можно было отформатировать, чтобы быстро удалить все файлы.
В текущем состоянии все мои проекты выгружаются без ошибок. Я пробовал проекты 2020 и 2022 годов. Возможно, более старые или новые проекты не выгрузятся по разным причинам, скорее всего, из-за необработанных типов объектов или необработанных полей в обрабатываемых типах объектов (которые я захардкодил, поскольку во всех проектах они одинаковы).
[!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"
dumpECUVariantPatternsЭтот скрипт выгружает «шаблоны сопоставления вариантов ЭБУ» (ECU-VARIANT matching patterns), необходимые для процедуры «идентификации варианта» (выбора подходящего файла для ЭБУ).
[!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"
dumpDTCЭтот скрипт выгружает «определения DTC». Он выгружает только объекты, необходимые для DTC (диагностических кодов неисправностей) — сервис 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
dumpFreezeFramesЭтот скрипт выгружает «определения Freeze Frame». Он выгружает только объекты, необходимые для расширенных записей данных DTC — сервис 0x19, режим 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
dumpAdaptationsЭтот скрипт выгружает «определения адаптаций». Он выгружает только объекты, необходимые для записи калибровочных данных (значения, которые можно изменять в ЭБУ) — сервис 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"
dumpCodingЭтот скрипт выгружает «определения кодирования». Он выгружает только объекты, необходимые для кодирования варианта (Variant Coding) — сервис 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"
dumpMWBЭтот скрипт выгружает «определения MWB». Он выгружает только объекты, необходимые для MWB (= Messwertblöcke — измерительные блоки) — сервис 0x22.
Это, безусловно, самая важная и нестандартизированная часть диагностики UDS, одна из главных целей этого проекта.
[!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"
parseMWBЭтот скрипт принимает ответ сервиса UDS 0x22 и разбирает его аналогично MCD Kernel. На него, пожалуй, было затрачено больше всего работы, не считая загрузчиков объектов.