-
-
汽车诊断工具的实现
-
发表于:
2016-10-7 00:55
16482
-
本文是最基本的汽车诊断工具的实现概述,如果有错误的地方,恳请斧正。
一、概述
实现基于OBD-Ⅱ接口,实现协议有SAE J1850 PWM/VPW、ISO 9141-2、ISO 14230-4(KWP 2000)、ISO 15765-4(CAN)。CAN还分为高速CAN、福特中速CAN、通用单线低速CAN,福特中速CAN还分为福特中速诊断CAN和福特中速多媒体CAN。OBD-Ⅱ接口上,SAE J1850 PWM/VPW使用针脚2和10,ISO 9141-2/ISO 14230-4使用针脚7和15,高速CAN使用针脚6和14,福特中速诊断CAN使用针脚3和11,福特中速多媒体CAN使用针脚1和8,通用单线低速CAN使用针脚1。
二、开源实现
Openxc:只支持高速CAN和福特中速CAN。
CANtact:只支持高速CAN。
AllPro:不支持福特中速CAN和通用单线低速CAN。
G.E.M:“Gasoline Economy Management G.E.M.",类似AllPro。
三、实现
协议的实现要有控制器和收发器。
1、控制器
多协议控制器:ELM327/STN1110和STN1170/STN2120。国内已经有山寨ELM327的芯片,很多支持蓝牙的产品就是山寨芯片实现的,AllPro就是基于ELM327控制器实现产品的开源实现,和山寨芯片的实现应该不同。这些控制器都有缺点:第一,都是基于MCU实现,只提供了串口方式,如果还有其它操作还要再加个MCU,这样倒不如就用MCU实现;第二,引脚功能固定,ELM327/STN1110的通用单线低速CAN的实现很麻烦,实现方法未知,如果按官方的推荐实现,ELM327/STN1110不支持福特中速诊断CAN和福特中速多媒体CAN,STN1170/ST2120不支持福特中速多媒体CAN,由于高速CAN和福特中速CAN只是OBD-Ⅱ针脚和速率的不同,必须重定向福特中速CAN到高速CAN,不推荐。
SAE J1850 PWM/VPW:类似PWM,使用MCU的PWM作为控制器。
ISO 9141-2/ISO 14230-4:类似串口,使用MCU的串口作为控制器。
CAN:CAN控制器可以有1、2、3、4个,推荐使用1或2个控制器MCP 2515,或者选择集成1或2个CAN控制器的MCU。
2、收发器
SAE J1850 PWM/VPW:由于使用MCU的PWM作为控制器,收发器只需要区分SAE J1850 PWM和SAE J1850 VPW,需要1个电压比较器,SAE J1850 PWM使用OBD-Ⅱ接口针脚2和10,需要进行区分,需要1个电压比较器,SAE J1850 VPW使用OBD-Ⅱ接口针脚2,总共需要2个比较器,选择1个LM2903,带有2个电压比较器。
ISO 9141-2/ISO 14230-4:由于使用了MCU的串口作为控制器,因此使用针对此协议的串口收发器。ISO 9141-2使用OBD-Ⅱ接口针脚7和15,需要2个,ISO 14230-4使用OBD-Ⅱ接口针脚7,总共需要2个,收发器选择Si9241A。
CAN:高速CAN收发器选择SN65HD230,通用单线低速CAN收发器选择MC33897。高速CAN收发器可以有1、2、3个,通用单线低速CAN收发器有1个,使用1或2个高速CAN收发器。
3、实现
可能的两种实现的主要IC:
高性能版本:1个LPC1769FB100+1个TJA 1048T+1个MC33897+1个LM2903+2个Si9241A。
低功耗版本:1个dsPIC33EP256GP504+1个SN65HD230+1个MC33897+1个LM2903+2个Si9241A+1个ISP1181A。
四、VCI
VCI,Vehicle Communication Interfaces,有SAE J2534和SAE J2534-2,区别是SAE J2534不支持通用单线低速CAN,而SAE J2534-2支持。
五、UDS
UDS,UNIFIED DIAGNOSTIC SERVICES,常用的UDS服务SID如下:
OBD2_MODE_SHOW_CURRENT_DATA:0x01
OBD2_MODE_SHOW_FREEZE_FRAME:0x02
OBD2_MODE_READ_DTC:0x03
OBD2_MODE_CLEAR_DTC:0x04
OBD2_MODE_TEST_RESULTS_NON_CAN:0x05
OBD2_MODE_TEST_RESULTS_CAN:0x06
OBD2_MODE_READ_PENDING_DTC:0x07
OBD2_MODE_CONTROL_OPERATIONS:0x08
OBD2_MODE_VEHICLE_INFORMATION:0x09
OBD2_MODE_READ_PERM_DTC:0x0A
OBD2_MODE_ENHANCED_DIAGNOSTIC_REQUEST :0x22
UDS_SID_DIAGNOSTIC_CONTROL:0x10
UDS_SID_ECU_RESET:0x11
UDS_SID_READ_FAILURE_RECORD:0x12
UDS_SID_CLEAR_DTC:0x14
UDS_SID_READ_DTC: 0x19
UDS_SID_READ_DID_BY_ID:0x1A
UDS_SID_RESTART_COMMUNICATIONS:0x20
UDS_SID_READ_DATA_BY_ID:0x22
UDS_SID_READ_MEM_BY_ADDRESS:0x23
UDS_SID_READ_SCALING_BY_ID:0x24
UDS_SID_SECURITY_ACCESS:0x27
UDS_SID_COMMUNICATION_CONTROL:0x28
UDS_SID_READ_DATA_BY_ID_PERIODIC:0x2A
UDS_SID_DEFINE_DATA_ID:0x2C
UDS_SID_WRITE_DATA_BY_ID:0x2E
UDS_SID_IO_CONTROL_BY_ID:0x2F
UDS_SID_ROUTINE_CONTROL:0x31
UDS_SID_REQUEST_DOWNLOAD:0x34
UDS_SID_REQUEST_UPLOAD:0x35
UDS_SID_TRANSFER_DATA:0x36
UDS_SID_REQUEST_XFER_EXIT:0x37
UDS_SID_REQUEST_XFER_FILE:0x38
UDS_SID_WRITE_MEM_BY_ADDRESS:0x3D
UDS_SID_TESTER_PRESENT:0x3E
UDS_SID_ACCESS_TIMING:0x83
UDS_SID_SECURED_DATA_TRANS:0x84
UDS_SID_CONTROL_DTC_SETTINGS:0x85
UDS_SID_RESPONSE_ON_EVENT:0x86
UDS_SID_LINK_CONTROL:0x87
UDS_SID_FORD_REQUEST_DATA_DIAGNOSTIC_DATA_PACKET:0xA0
UDS_SID_FORD_DYNANICALLY_DEFINE_DIAGNOSTIC_DATA_PACKET:0xA1
UDS_SID_FORD_DIAGNOSTIC_COMMAND:0xB1
UDS_SID_GM_PROGRAMMED_STATE:0xA2
UDS_SID_GM_PROGRAMMING_MODE:0xA5
UDS_SID_GM_READ_DIAG_INFO:0xA9
UDS_SID_GM_READ_DATA_BY_ID:0xAA
UDS_SID_GM_DEVICE_CONTROL:0xAE
福特UDS服务和通用UDS服务的SID未补全。
六、ECU
常见ECU使用的CPU架构如下:
大众:Infineon C167、Tricore。
奔驰、日系:Renesas SH。
宝马:Bosch PowerPC。
福特、通用:Motorola M68K。
菲亚特-克莱斯勒:TI Arm。
CAN MCU:Renesas V850。
七、适配
原厂诊断工具的特殊功能可能实现方式有软件实现、驱动实现、固件实现和硬件实现,适配困难度:硬件实现>固件实现>驱动实现>软件实现。理论上,只要实现方式不是硬件实现,都能完美适配。
八、大众诊断工具
大众 5054A实现了SAE J1850 PWM和高速CAN,有可能实现SAE J1850 VPW、ISO 9141-2/ISO 14230-4,福特中速CAN应该没有实现,未实现通用单线低速CAN,特殊功能实现方式未知。主要IC如下:
MCU:Infineon C167。
CAN:TJA 1054A。
SAE J1850 PWM:OKI MSM 6636。
蓝牙:AMB 2300。
USB:ISP1181A。
RAM:三星IC。
九、成本
基于山寨ELM327的产品价格不超过50元,因此预算200元。
十、总结
大部分原厂设备都不能防御重放攻击,而通信双方只要有一方是非原厂设备就属于重放攻击,如果通信双方的原厂设备防御重放攻击都是用硬件实现(FPGA或ASIC),几乎不会出现非原厂设备。本文的实现可以看成是实现重放攻击,原厂诊断数据在诊断软件、驱动、诊断工具、ECU、UDS之间传输,诊断工具和ECU的传输数据是最准确的重放数据,可以用Fake ECU的方法进行监控,两个本文实现就是一个FAke ECU。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)