
ODISによって使用されるMCDランタイムプロジェクトのためのPythonダンパー/エクスプローラ
Nefarious Motorsports フォーラムスレッド:http://nefariousmotorsports.com/forum/index.php?topic=23836.0
このPythonプロジェクトは、MCD Runtime Projects(通称「*.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++ライブラリのすべてのクラスは他のクラスを継承しており、逆コンパイルしたときには、正直なところ頭が追いつきませんでした。
テキスト翻訳には、Java経由でしか使用できないHSQLDBが必要です。 そのため、JPypeをインストールする必要があります:
pip install jpype1
各スクリプトの使用法については、引数「-h」を指定して呼び出してください(またはソースコードをご覧ください)。
テキスト翻訳オプションがあるスクリプト(dumpDTC と parseMWB)にはデータベースが必要です。
C:/ProgramData あたり)を確認してください。そこに DIDB/db フォルダがあるはずです。didb_Base-... という名前の.dataファイルが含まれている必要があります。ここで、「...」は「en_US」のような言語です。そのようなデータベースを指定しない場合、dumpDTC では「より詳細な説明」が得られず、
parseMWB ではすべての項目にODXのデフォルトのLONG-NAMEが使用されます。
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 マッチングパターン」をダンプします。これは、「バリアント識別」手順(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(Messwertblöcke - 測定ブロック)に必要なオブジェクトのみをダンプします - サービス0x22。
これは、UDS診断の中で最も重要かつ標準化されていない部分であり、このプロジェクトの主な目的の1つです。
[!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 にリネームしてください。
変更後の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を使用します。
もし他の方が十分に熱心/退屈であれば、このプロジェクトへの貢献を大歓迎します。Issueを提出するだけでも構いません。
他の重要なもののダンプなど、機能を追加したい場合は、現在のMWBやDTCなどのダンプ方法を確認し、dumpProject を使用してテキストエディタでオブジェクト名やフィールドなどを検索してみてください。
docs/MCD-2D.md には、データの検証に使用したドキュメントがきれいにフォーマットされています。
付属の bin/pbl.dll は、Mission-Base のPBLライブラリから単純にコンパイルされたものです。
.keyファイルにアクセスするために必要です。
このリソースの無駄遣いの作成において、AIは一切傷つけられていません。LongNameTranslation モジュールについては少しだけ助けがありました。JavaとSQLの統合を自分で理解する気にはなれませんでした。