
Дампер/обозреватель на 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. На него, пожалуй, было затрачено больше всего работы, не считая загрузчиков объектов.
[!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
Ещё несколько примеров приведено в docs/mwb_examples.txt.
dumpHSQLDBЭтот скрипт выгружает содержимое всех таблиц базы данных HSQLDB. Имя пользователя и пароль захардкожены, но я не ожидаю, что они когда-либо изменятся. Если у вас возникнут проблемы, загляните в следующую главу.
[!TIP]
python dumpHSQLDB.py "C:/ProgramData/OE/DIDB/db" "didb_Base-en_US" "O:\HSQLDB"
Включённый bin/hsqldb.jar — это неизменённый релиз с SourceForge, версия 1.8.0.
Если при указании базы данных для перевода вы сталкиваетесь с ошибками вроде «user does not exist»,
вы можете переименовать hsqldb.jar во что-нибудь другое, а hsqldb_mod.jar — в hsqldb.jar.
Эта версия изменена так, чтобы при запуске автоматически выгружать всех пользователей и пароли базы данных.
[!NOTE] Ошибка «user does not exist» также может появляться, если база данных была по какой-то причине загружена неправильно. Убедитесь, что вы указали правильный путь.
Изменённый .jar выведет в стандартный поток вывода примерно следующее:
Name: PUBLIC, password: null
Name: _SYSTEM, password: null
Name: SA, password: ENMGZIRN
Name: VAUDASISTSUPER, password: ENMGZIRN
Как побочный эффект, это будет выводиться всегда, когда HSQLDB используется одним из скриптов, которым она нужна.
[!TIP] Если вы хотите запустить сервер из базы данных (для собственных экспериментов), выполните эту команду из папки
bin:java -cp hsqldb.jar org.hsqldb.Server -database.0 file:"C:/ProgramData/OE/DIDB/db/didb_Base-en_US" -dbname.0 testdbПодключение будет выполняться по URL
jdbc:hsqldb:hsql://localhost/testdb.
Если кто-то ещё достаточно целеустремлён или ему просто нечем заняться, он очень желанный контрибьютор этого проекта — даже если просто откроет issue.
Если вы хотите добавить функциональность (например, выгрузку других важных данных), можете свободно посмотреть, как данные выгружаются сейчас,
например MWB или DTC, а затем использовать dumpProject и поискать в текстовом редакторе имена объектов, поля и тому подобное.
В docs/MCD-2D.md вы найдёте документацию, использовавшуюся для проверки данных, в удобном формате.
Включённый bin/pbl.dll просто скомпилирован из библиотеки PBL от Mission-Base.
Он необходим для доступа к файлам .key.
Ни один ИИ не пострадал при создании этой траты ресурсов. Просто небольшая помощь для модуля LongNameTranslation. Мне самому было лень разбираться с интеграцией Java и SQL.