
Nefarious Motorsports 论坛帖子:http://nefariousmotorsports.com/forum/index.php?topic=23836.0
这个 Python 项目旨在解包(并利用)MCD 运行时项目中存储的数据(俗称 "*.db 和 .key 文件")。
通常情况下,这些文件由 MCD 内核使用,然后由 ODIS 或 iDEX 等程序调用。每次安装 ODIS 时都会附带一个应用 MCD-Kernel/VWMCDClient.exe,可用于在更底层操作这些项目。
要使用这些数据,通常需要利用 Include_Libs 和 MCD-Kernel 中的库编写自己的 C++/Java 应用来解析对象。但是,这种方法存在以下问题:
使用此工具,您可以从尽可能低的层次访问数据库。希望它对研究 ODX、J2534、UDS 以及其他内容有所帮助。
[!NOTE] 不会提供任何项目/数据库! 请自带 :)
这些项目的工作方式是,成对的 .db 和 .key 文件代表“池”(而“PoolID”指不带扩展名的文件名)。 每个池包含对象。
任何对象都存储为数据流,其字节将被读取为标志、字符串、数字等。
每个对象的存储方式都不同,因此……大量时间投入到了 Ghidra 和 x64dbg 中。
查看 object_loaders 文件夹,您可能会体会到为此付出的努力。
无论如何,我不保证我正确加载了每种对象类型。 相反,许多字段是根据我的感觉命名的。 基本上,C++ 库中的每个类都继承自其他类,而且我必须承认,反编译后我实在无法完全理解。
对于文本翻译,需要 HSQLDB,它只能通过 Java 使用。 因此,需要安装 JPype:
pip install jpype1
关于每个脚本的使用信息,请使用参数 '-h' 调用它们(或者直接查看源代码)。
具有文本翻译选项的脚本(dumpDTC 和 parseMWB)需要数据库。
C:/ProgramData 下),应该有一个 DIDB/db 文件夹。didb_Base-... 的 .data 文件,其中 '...' 是语言代码,如 'en_US'。如果没有提供这样的数据库,对于 dumpDTC,您将无法获得“更详细的描述”,
而对于 parseMWB,所有内容将使用其默认的 ODX LONG-NAME。
dumpProject / dumpAllProjects这些模块将转储每个项目每个池中的每个对象。 请注意,转储所有项目将需要几十 GB 的空间,并花费几个小时。 我个人使用了一个单独的分区,可以格式化以快速删除所有文件。
在当前状态下,我的所有项目都能无错误地转储。 我尝试了 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-变体匹配模式”,用于“变体识别”过程(为 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"
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此脚本将转储“冻结帧定义”。 它只会转储与 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此脚本将转储“自适应定义”。 它只会转储与校准数据写入(即您可以在 ECU 中更改的值)相关的对象 - 服务 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此脚本将转储“编码定义”。 它只会转储与变体编码相关的对象 - 服务 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(测量块)相关的对象 - 服务 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 内核的方式进行解析。这可能是工作量最大的部分,除了对象加载器之外。
[!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。
如果提供翻译数据库时遇到类似“用户不存在”的问题,
您可以将 hsqldb.jar 重命名为其他名称,然后将 hsqldb_mod.jar 重命名为 hsqldb.jar。
该版本已修改,可在启动时自动转储数据库的所有用户和密码。
[!NOTE] 如果数据库加载不正确,也可能显示“用户不存在”错误。 请确保您提供了正确的路径。
修改后的 .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连接到它。
如果有人足够专注/无聊,非常欢迎为此项目做出贡献,即使只是提交一个问题。
如果您想添加功能(例如转储其他重要内容),可以自由查看当前转储的方式,
例如 MWB 或 DTC,然后使用 dumpProject 并通过文本编辑器搜索对象名称、字段等。
在 docs/MCD-2D.md 中,您可以找到用于数据验证的文档,格式清晰。
包含的 bin/pbl.dll 只是从 Mission-Base 的 PBL 库编译而来。访问 .key 文件需要它。
没有 AI 在制作这个浪费资源的过程中受到伤害。只是 LongNameTranslation 模块获得了一点帮助。我懒得自己去搞 Java 和 SQL 的集成。