MarvinParanoid/VolvoDiagToolkit
GitHub: MarvinParanoid/VolvoDiagToolkit
非官方沃尔沃诊断工具包,通过 J2534 代理记录 VIDA 流量并逆向解析车辆参数,支持脱离 VIDA 独立读取车辆诊断数据。
Stars: 0 | Forks: 0
# Volvo 诊断工具包
用于找出 Volvo 实际报告内容并读取该数据的工具,无需使用 VIDA。
基于搭载 D4164T 1.6 柴油发动机的 Volvo V50 (P1) 构建;与发动机相关的特定部分是一个数据文件,其余部分并非 Volvo 专属。
直接目标是展示 VIDA 显示而普通 OBD 无法显示的 DPF 相关数据:实际和请求的增压值、DPF 压差、碳载量、排气温度、再生状态以及距离上次再生的行驶里程。
本工具并非为了取代 VIDA。VIDA 是参考标准:它知道正确的问题,而代理会将其记录下来。
```
VIDA ──► j2534proxy.dll ──► VXDIAG driver ──► car
│
└──► JSONL log ──► summarize / diff ──► definitions/*.yaml
│
volvo-monitor ◄───────────────┘
```
## 布局
| 路径 | 用途 |
| --- | --- |
| [proxy/](proxy/) | J2534 passthrough DLL,记录每一次调用 |
| [fake-j2534/](fake-j2534/) | 带有模拟 ECM 的 J2534 驱动程序,用于在没有实车的情况下进行测试 |
| [test-client/](test-client/) | 最小化的 J2534 应用程序 — 在 VIDA 加载前检查 DLL |
| [python/volvo_diag/](python/volvo_diag/) | 日志分析、传输层、UDS/OBD 以及监控器 |
| [definitions/](definitions/) | 以 YAML 格式存储的参数数据库,每个条目均带有来源信息 |
| [scripts/](scripts/) | Windows 构建、注册和驱动清点脚本(兼容 PowerShell 2.0) |
| [cmake/](cmake/) | 用于从 Linux 交叉构建的 mingw-w64 工具链文件 |
| [docs/method.md](docs/method.md) | 参数的实际查找方法 |
## 在无实车情况下测试
除了供应商驱动程序外,所有内容都可以在 Linux 上针对 `fake-j2534/` 中的模拟 ECM 进行构建和运行:
```
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build
./build/proxy/proxy_core_test
PYTHONPATH=python python3 -m unittest discover -s tests -t .
# 一个 J2534 session,通过 proxy,进入 fake ECM
export VOLVO_J2534_REAL_DLL=$PWD/build/fake-j2534/fake_j2534.so
export VOLVO_J2534_LOG_DIR=/tmp/volvo-logs
./build/test-client/j2534-test ./build/proxy/j2534proxy.so --request 22F190
# proxy 记录了什么
PYTHONPATH=python python3 -m volvo_diag.logs.summarize /tmp/volvo-logs/*.jsonl
# dashboard,通过相同的 stack 读取 simulator
PYTHONPATH=python python3 -m volvo_diag.cli \
--transport j2534 --library ./build/proxy/j2534proxy.so \
--definitions definitions/simulator monitor
```
模拟器的标识符(`22 FE xx`)是**虚构的**。它们位于 `definitions/simulator/` 中,绝不会被加载到真实车辆上使用 — 默认的定义路径是 `definitions/volvo/`。
## 在实车上
### 1. 优先确认位数
```
powershell -ExecutionPolicy Bypass -File scripts\list-j2534.ps1
```
这会打印出每个已注册的 J2534 驱动程序、其 DLL 路径以及该 DLL 是 x86 还是 x64,同时还会显示正在运行的 VIDA 的位数。大多数 VXDIAG 安装的是 x86 版本 — 但请务必检查,不要想当然。位数不匹配的代理将无法加载,而 VIDA 显示的错误信息毫无用处。
### 2. 构建并注册
在装有 Visual Studio 的 Windows 机器上:
```
.\scripts\build-windows.ps1 -Arch Win32 -Test
.\scripts\install-proxy.ps1 # elevated
```
或者使用 mingw-w64 在 Linux 上交叉编译,然后拷贝 DLL 文件:
```
./scripts/build-mingw.sh i686 # or x86_64
```
该脚本还会检查两个可能悄然导致 J2534 DLL 损坏的问题:导出函数是否未经过名称修饰(是 `PassThruOpen`,而不是 `_PassThruOpen@8`),以及在加载时是否不需要解析系统 DLL 之外的任何内容 — VIDA 所在的机器上并没有 `libwinpthread-1.dll`。如果安装了 wine,它随后会运行单元测试以及一次 proxy→fake-driver 会话作为冒烟测试。
`install-proxy.ps1` 会添加*第二个* J2534 条目,并且不会改动供应商原有的注册信息,因此 VIDA 会同时显示两者,您可以按会话进行选择。
`remove-proxy.ps1` 用于将其移除。
某些应用程序只列出它们已知的设备名称,并会忽略新添加的条目。对于这些程序,`install-proxy.ps1 -InPlace` 会将供应商条目自身的 `FunctionLibrary` 指向代理,并将原始路径记录在 `ProxiedLibrary` 值中;`remove-proxy.ps1` 会将其还原。这样,应用程序就会像往常一样选择相同的设备。如果 VIDA 运行在虚拟机中,请在执行任何操作前先拍摄快照 — 回滚比调试要快得多。
在启动 VIDA 之前,请证明整个调用链工作正常:
```
build-Win32\test-client\RelWithDebInfo\j2534-test.exe `
C:\ProgramData\volvo-toolkit\j2534proxy.dll
```
`PassThruOpen`、`PassThruReadVersion` 和 `READ_VBATT` 都应该返回 0,并且电瓶电压应该是真实的数值。
### Windows 7 SP1(常见的 VIDA 运行环境)
在那里有三点不同,且这三点都已得到妥善处理:
**C 运行时。** mingw-w64 链接的是 Universal CRT,而 Windows 7 只有在安装了 KB2999226 之后才包含它。`list-j2534.ps1` 会报告是否存在 `ucrtbase.dll`,如果机器无法加载该 DLL,`install-proxy.ps1` 将拒绝注册。MSVC 构建版本完全没有这种依赖 — 它是静态链接 CRT (`/MT`) 的。
选择这两种方式中的哪一种取决于具体的机器。Visual Studio 2019 需要 64 位 Windows,而 32 位的 VIDA 虚拟机通常内存不足,因此在实际操作中,建议在 Linux 上交叉构建并拷贝三个文件:`j2534proxy.dll`、`j2534-test.exe` 和 `fake_j2534.dll`。它们都是静态链接的,目标机器上不需要编译器、运行时和安装程序 — 只需要 UCRT,这可以通过 `list-j2534.ps1` 确认。如果机器适合安装 Visual Studio(64 位上的 2015、2017、2019,或独立的 Build Tools),`build-windows.ps1` 甚至可以避免 UCRT 依赖。
**基于 .NET 3.5 的 PowerShell 2.0。** 这是 Windows 7 SP1 内置的版本,因此脚本避免了使用 `[pscustomobject]`、`$PSScriptRoot`、`Is64BitOperatingSystem` 和 `RegistryKey.OpenBaseKey`,而是通过 provider path 访问注册表。如果机器已更新,这些脚本在 PowerShell 5.1 上也能原样运行。
**32 位 Windows 没有 `Wow6432Node`**,因此只有一个注册表视图,`HKLM\SOFTWARE\PassThruSupport.04.04` 是唯一的查找位置。脚本会检测到这一点,而不会将每个驱动程序列出两次。
对于 Python 部分,3.8.10 是最后一个支持安装到 Windows 7 的版本 — 这也是本项目兼容的最低标准(不支持 `match`,不支持运行时的 `int | None`)。
日志分析完全不需要在那上面运行:JSONL 文件是普通文件,因此可以将其拷贝出来并在任何地方进行分析。只有 `volvo-monitor` 需要在 Windows 上运行,因为 VXDIAG 驱动程序必须在其上运行。
### 3. 记录、对比、定义
请参阅 [docs/method.md](docs/method.md)。简短版本为:每次记录一个新参数,然后执行
```
python -m volvo_diag.logs.diff 01-baseline.jsonl 02-plus-boost.jsonl
python -m volvo_diag.logs.summarize 02-plus-boost.jsonl --track 22D123
```
并将您查找到的内容及其状态、来源日志和原始样本写入 `definitions/volvo/p1/d4164t.yaml`。
### 4. 读取回数据
```
volvo-monitor devices
volvo-monitor info
volvo-monitor monitor --csv trip.csv
volvo-monitor dtc
volvo-monitor read boost_actual
volvo-monitor read 22F190 # raw request, any hex
```
在存在 Volvo 专属定义之前,仪表盘会回退到最接近的标准 OBD-II PID,并将该行标记为 `(OBD-II PID)`,因此绝不会混淆哪些数据是猜测的。
## 日志格式
每行一个 JSON 对象,每次 J2534 调用对应一个:
```
{"ev":"write","t":1785574084178,"mono":112,"tid":3051511632,"channel":8193,
"requested":1,"written":1,"timeout":1000,
"msgs":[{"proto":6,"rx_status":0,"tx_flags":64,"ts":0,"len":7,"extra":0,
"data":"000007E022F190"}],
"us":5,"result":0,"result_name":"STATUS_NOERROR","n":8}
```
该 DLL 存储的是原始调用,除了解码 ioctl 结构外不进行任何解释;将 CAN ID 从 payload 中剥离以及将请求与响应进行配对的操作都是在 Python 中完成的,这样无需重新构建任何内容即可进行修复。
默认情况下,空的 `ReadMsgs` 轮询会被丢弃(设置 `log_empty_reads = 1` 可保留它们) — 参见 [proxy/j2534proxy.ini.example](proxy/j2534proxy.ini.example)。
## 传输层
| 传输方式 | 用途 | 状态 |
| --- | --- | --- |
| J2534 (`transport/j2534.py`) | Windows 上的 VXDIAG 及其代理 | 主要路径 |
| SocketCAN (`transport/socketcan.py`) | CANable/Linux,带 raw-CAN 回退的内核 ISO-TP | 未在实车上测试 |
| ELM327 (`transport/vlinker.py`) | 通过蓝牙连接的 vLinker,适用于手机 App | 未在实车上测试 |
哪些模块可以从 OBD 接口访问,哪些需要网关或其他总线 — 这是代理日志能够回答的问题(参见 [docs/method.md](docs/method.md) 中的第 7 阶段)。本项目对此不作任何预设。
## 范围
刻意限制为只读。不进行安全访问,不写入标识符,不进行 routine control,不清除自适应数据,不强制再生。代理会向您展示 VIDA 如何执行所有这些操作;但这并不是让您在一个尚未完全验证的参数数据库中去执行这些操作的理由。
## 许可与免责声明
[MIT](LICENSE)。
如开头所述,本工具是非官方且独立的:与 Volvo Car Corporation 没有任何附属关系,相关商标归其所有。
本软件会与行驶中车辆的发动机控制器诊断总线进行通信。它仅执行读取操作,并极力说明其哪些数据属于猜测 — 但它不提供任何形式的保证,而且一个对 DPF 判断失误的诊断工具可能会让您付出昂贵的零件代价。在根据其提供的任何信息采取行动之前,请务必通过 VIDA 进行核实,且请勿在驾驶时使用本工具。
标签:AI合规, Bash脚本, C++, J2534, Python, UDS协议, 安全合规, 数据擦除, 无后门, 汽车诊断, 流量日志, 网络代理, 逆向工具