汽车 ECU 升级初探
ECU 固件升级,类似于手机固件升级,大概流程是实现 Bootloader,完成 EEPROM/Flash 的读写,当然需要了解 ECU 所使用的 MCU,MCU 内部EEPROM/Flash 和外部 EEPROM/Flash 的读写,学习门槛很高,别的不说,光是 ECU 固件逆向就不容易,因为需要了解 10 多种 MCU 汇编语言,还需要编写各种 IDA 插件,难度很大。本文对 ECU 固件升级进行基本的阐述,如果有错误的地方,恳请斧正。
一、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_START_DIAGNOSTIC_SESSION:0x10
UDS_SID_ECU_RESET:0x11
UDS_SID_READ_FREEZE_FRAME_DATA:0x12
UDS_SID_READ_DIAGNOSTIC_TROUBLE_CODES: 0x13
UDS_SID_CLEAR_DIAGNOSTIC_INFORMATION:0x14
UDS_SID_READ_DIAGNOSTIC_TROUBLE_CODES_STATUS :0x17
UDS_SID_READ_DTC_BY_STATUS:0x18
UDS_SID_READ_DTC_INFORMATION:0x19
UDS_SID_READ_ECU_ID :0x1A
UDS_SID_STOP_DIAGNOSTIC_SESSION:0x20
UDS_SID_READ_DATA_BY_LOCAL_ID:0x21
UDS_SID_READ_DATA_BY_COMMAND_ID:0x22
UDS_SID_READ_MEMORY_BY_ADDRESS:0X23
UDS_SID_READ_SCALING_DATA_BY_IDENTIFIER:0x24
UDS_SID_STOP_REPEATED_DATA_TRANSMISSION:0x25
UDS_SID_SET_DATA_RATES:0X26
UDS_SID_SECURITY_ACCESS:0X27
UDS_SID_COMMUNICATION_CONTROL:0x28
UDS_SID_READ_DATA_BY_PERIODIC_IDENTIFIER:0x29
UDS_SID_READ_DATA_BY_ID_PERIODIC:0x2A
UDS_SID_DYNAMICALLY_DEFINE_LOCAL_ID:0x2C
UDS_SID_DEFINE_PID_BY_MEMORY_ADDRESS:0x2D
UDS_SID_WRITE_DATA_BY_COMMAND_ID:0x2E
UDS_SID_INPUT_OUTPUT_CONTROL_BY_COMMAND_ID:0x2F
UDS_SID_INPUT_OUTPUT_CONTROL_BY_LOCAL_ID:0x30
UDS_SID_START_ROUTINE_BY_LOCAL_ID:0x31
UDS_SID_STOP_ROUTINE_BY_LOCAL_ID:0x32
UDS_SID_REQUEST_ROUTINE_RESULTS_BY_LOCAL_ID:0x33
UDS_SID_REQUEST_DOWNLOAD:0x34
UDS_SID_REQUEST_UPLOAD:0x35
UDS_SID_ TRANSFER_DATA:0x36
UDS_SID_REQUEST_TRANSFER_EXIT:0x37
UDS_SID_START_ROUTINE_BY_ADDRESS:0x38
UDS_SID_STOP_ROUTINE_BY_ADDRESS:0x39
UDS_SID_REQUEST_ROUTINE_RESULTS_BY_ADDRESS:0x3A
UDS_SID_WRITE_DATA_BY_LOCAL_ID:0x3B
UDS_SID_WRITE_MEMORY_BY_ADDRESS:0x3D
UDS_SID_TESTER_PRESENT:0x3E
UDS_SID_NEGATIVE_RESPONSE:0x7F
UDS_SID_ESC_CODE:0x80
UDS_SID_START_COMMUNICATION :0x81
UDS_SID_STOP_COMMUNICATION:0x82
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
FORD_REQUEST_DATA_DIAGNOSTIC_DATA_PACKET:0xA0
FORD_DYNANICALLY_DEFINE_DIAGNOSTIC_DATA_PACKET:0xA1
FORD_DIAGNOSTIC_COMMAND:0xB1
GM_PROGRAMMED_STATE:0xA2
GM_PROGRAMMING_MODE:0xA5
GM_READ_DIAGNOSTIC_INFO:0xA9
GM_READ_DATA_BY_ID:0xAA
GM_DEVICE_CONTROL:0xAE
二、AUTOSAR
AUTOSAR(AUTomotive Open System ARchitecture),支持的协议有:CAN, FlexRay, LIN, Ethernet等。它是 ECU 固件开发的标准,UDS 属于 AUTOSAR的一部分,越来越多的 ECU 固件开发使用 AUTOSAR。
三、XCP
XCP(Universal Measurement and Calibration Protocol),支持的协议有: CAN、SPI、 SCI,、TCP/IP,、UDP/IP,、USB、FlexRay等。它是ECU校准协议,扩展于CCP(CAN Calibration Protocol)。
四、ODX
ODX((Open Diagnostic Data Exchange),基于XML,用于描述与汽车诊断相关数据,是汽车诊断格式标准。
五、VCI 和 MVCI
VCI(Vehicle Communication Interfaces),MVCI(Multiple Vehicle Connect Interface),都是汽车外部 ECU(诊断工具、诊断软件等)和内部 ECU 的通信接口标准,对于常用的 ECU 诊断(包含固件升级),使用 VCI 就足够了。VCI支持的协议有:SAE J1850 PWM/VPW、ISO 15765-4(CAN)、ISO 9141-2、ISO 14230-4(KWP 2000)、SAE J2818(KWP 1281)、SAE J1979。SAE J1979主要是大型车使用,SAE J2818主要是大众使用,在CAN协议上,又分高速CAN、中速CAN、低速CAN。ISO 9141-2、KWP 2000、KWP 1281类似于串口,统称K-Line。
六、汽车发动机
发动机有:TD、TDI 、TSI 、FSI、 TFSI、 TDCI 、TDDI 、TURBO 、V6 、VR6、 V8等,TDI、TSI、FSI、TFSI用的好像比较多。
七、MCU
汽车有非常多个的 ECU,非射频相关可称为 AP(Application Processor),射频相关可称为 BP(Baseband Processor),本文讨论的是 AP,主要 ECU 有:BCM(Body Control Module),PCM(Power Control Module),PAM(Park Assist Module)。BCM,即主板,需要了解 BCM 固件中 PAM 和 PCM 的通信;PCM,发动机 ECU,需要了解该 ECU 固件中 MAP 表的处理过程;UDS 有可能集成在 BCM 或 PAM,需要了解该 ECU 固件中汽车诊断协议的处理过程。本文假设 BCM、PCM、PAM 三者独立存在,当然 PCM 和 PAM 有可能集成,还有可能与 BCM 集成。PCM 和 PAM 这两个 ECU 非常关键,需要了解 PCM 和 PAM 这两个 ECU 所采用的 ECU 厂商,ECU 厂商所使用的 MCU,以及 ECU 厂商所使用的 EEprom/Flash 等,本文主要关注 PCM。
1、PCM
主要使用的 MCU 有:Infineon/ST C16X/ST10、Infineon/ST Tricore TC17XX、Freescale/Motorola MPC5XX、Freescale/Motorola MPC5XXX、Freescale/Motorola HC12X、Renesas SH 70XX、Renesas SH 72XXX、Renesas V850、Renesas M16/M32、Renesas H8SX等。
2、PAM
主要使用的MCU有:Renesas V850、Freescale/Motorola HC12X、Renesas M16/M32、常见MCU(8051、PIC、AVR)等。主要使用V850、HC12X。
3、BCM
可以分为主模块和副模块。主模块已知使用的MCU有ARM、M16/M32,副模块可以认为是CAN模块,已知使用的MCU有V850、HC12X。
4、EEPROM/Flash
尚未关注。MCU 外部 EEPROM/Flash 读写方式有:SPI、I2C、MircoWire、4Wire等。
八、ECU 厂商
1、BOSCH
采用的 MCU 有3个版本:EDC15、EDC16、MED7、MD7使用C16X;EDC16+U/C/CP、MED9、MD9使用MPC 5XX/MPC 5XXX;EDC17、MED17、MD17使用Tricore。使用Tricore TC1796/TC1797的有:EDC17CP、MED17、MD17。
2、SIEMENS CONTINENTAL
主要使用C16X/ST10、Tricore、MPC5XX、MPC5XXX,少量使用SH705X、SH72XXX。使用Tricore TC1796/TC1797的有:Siemens SIMOS 8/12/18、Siemens SID 208/807、Siemens SDI4、 Continental PCR 2.1。
3、DELPHI
主要使用C16X/ST10、Tricore、MPC5XX、MPC5XXX,部分使用SH705X、SH72XXX。使用Tricore TC1766/TC1767的有:MT80/MT86,使用MPC 5566/5567的有:DCM3.5、DCM3.7,使用SH72543/SH72544的有DCM3.7。
4、MAGNETI MARELLI
主要使用C16X/ST10、MPC5XX、MPC5XXX、HC12X。
5、MOTOROLA
主要使用MPC5XX、MPC5XXX、HC12X。
6、FORD EFI
主要使用MPC5XX、MPC5XXX、HC12X。
7、TRW
主要使用MPC5XX、MPC5XXX、HC12X。
8、TEMIC
主要使用C16X/ST10、MPC5XX、MPC5XXX、HC12X。
9、DENSO:
主要使用SH705X、SH72XXX、H8SX,Renesas旗下的MCU都有可能使用。
10、MITSUBISHI MELCO:
主要使用M16/M32、SH705X、SH72XXX,Renesas旗下的MCU都有可能使用。
11、SAGEM:
主要使用 SH705X、SH72XXX,Renesas 旗下的 MCU 都有可能使用。
12、VALEO:
主要使用 SH705X、SH72XXX,Renesas 旗下的 MCU 都有可能使用。
九、汽车厂商
1、日系
主要使用的 MCU 是 SH70XX、SH72XXX,当然日系旗下的豪华品牌(本田讴歌、丰田雷克萨斯、日产英菲尼迪等)好像不一样,还有可能使用MPC5XX、MPC5XXX、C16X、Tricore等。
2、福特与通用
UDS 使用的 CAN 协议不同,福特使用高速和中速 CAN,通用使用高速和低速 CAN,正常的是使用高速 CAN。主要采用的 MCU 有:MPC5XX、MPC 5XXX、C16X、Tricore。
3、其它
Bosch 在 ECU 厂商中的市场份额最大。国产、韩系如果使用 Tricore,好像只采用 Tricore TC1766/TC1767,应该没有采用 TC1796/TC1797。
十、ECU 固件升级方式
有两种方式,一种是调用 ECU 已经实现的 BootLoader 完成升级,这种方法称为通过 EOBD(Enhance On-Board Diagnostic)进行固件升级,另一种是独立实现 Bootloader,这种方法称为通过 Boot Mode 进行固件升级,第二种方法还有一种表现形式称为BDM模式。实际上,通过 EOBD 升级能够支持大部分车型,对于采用Tricore、MPC5XXX、SH72XXX的 ECU,Bootloader已锁,需要知道解锁算法/解锁密钥才能通过 EOBD 进行固件升级,对于这种情况,主流的升级工具都是采用 Boot Mode 进行固件升级。主流的升级工具好像很少考虑Renesas MCU,以K-TAG、KESS V2、CMD FLASH为例,这三大升级工具都不能完美支持 Renesas MCU 固件升级,KESS V2 支持 Renesas MCU 相对比较好,倒是有专门针对 Renesas MCU 的固件升级工具,如Piasini Serial Suite。
十一、ECU 固件升级工具的实现
有两种实现,一种是 EOBD 的实现,可以支持大部分车型,可以参考 AUTOSAR 或 VCI 来实现,MCU从V850、C16X、Tricore、MPC5XX、MPC5XXX、HC12X、SH705X、SH72XXX 选取,或者选取常见的 MCU,如 ST的 STM32、NXP 的 LPC、MircoChip 的 PIC 等。
文章 http://bbs.pediy.com/showthread.php?t=213087 可供参考,注意该文章中关于 ECU 的描述是错误的;另一种是 Boot Mode 的实现,可以参考 XCP 来实现,虽然该实现是最通用的,硬件成本比 EOBD 的实现低,但在固件实现上需要实现各主流 MCU 的 Bootloader,还要实现各 EEPROM/Flash 芯片的读写,难度很大。还有一种可能是选取 K-TAG、KESS V2、CMD FLASH 一种,逆向其固件,并重写其固件,这些升级工具 PCB 应该是单层的,逆向其 PCB 也是可能的。三大 ECU 升级工具(K-TAG、KESS V2、CMD FLASH)价格不菲,动辄上万,硬件成本最多价值1000,可以看出诊断数据很值钱,并且它们都不能完美支持 Renesas 旗下的 MCU 固件升级。
十二、ECU 固件逆向
需要了解的汇编语言有:Infineon/ST C16X/ST10、Infineon/ST Tricore、PowerPC(MPC5XX/MPC5XXX)、M68K(HC12X)、Renesas V850 E1/E2、Renesas SH2/SH4、Renesas M16/M32、Renesas H8SX、8051、ARM、PIC、AVR、X86/X64等。
固件逆向通常是逆向固件加解密算法、固件检验算法、Bootloader解锁算法/解锁密钥、MAP 表检验算法、ECU 安全访问算法、UDS中汽车诊断协议的实现、UDS 中 ECU 固件升级的实现、UDS 消息检验算法、随机数生成算法等。对于大部分 MCU 固件,IDA 都能反汇编,如果不能反汇编还需要编写反汇编插件,IDA 并不知道固件 Bin 的内存映射方式,还需要编写 ECU 固件 Bin 的Loader 插件。IDA 插件编写方式有 IDAPython 和 IDA SDK 两种,推荐IDAPython。从这里可以看出,固件逆向主要是逆向算法,如果能实现一种 IDA插件,该插件能够识别包含算术运算符、逻辑运算符的循环块,则将会大幅度减少固件逆向所需要的时间,实现该插件应该需要控制流分析方面的知识。
如果 BCM、PCM、PAM 有使用操作系统,还要知道使用哪种操作系统,越来越多的汽车 PCM 采用的 MCU 是 Tricore、MPC5XXX、SH72XXX,越来越多的 ECU 固件根据 AUTOSAR 标准开发。
十三、汽车改装
动力相关的汽车改装,个人认为可以分为以下 5 个等级:
1、外观改装,根据空气动力学进行动力升级等。
2、修改 PCM 固件中的MAP表,修改 UDS 中的汽车诊断协议,修改BCM固件中与PCM和PAM的通信协议,用探针检测汽车各部件运行状态。该等级只涉及软件改装,主要涉及的 MAP 表有:Driver wish map、Torque limiter map、Smoke limiter map、Injection duration map、Boost target map、Boost limit map 、Single value boost limiter map、EGR map、Pump voltage table等,当然日系并不是这些表。使用的ECU MAP修改软件有:ECM Titanium、WinOls、官方软件(不容易获取)等。这个步骤也就是通常我们所说的ECU调校(ECU tuning)。因为在这个等级上进行改装很容易出现问题,所以需要在UDS中增加汽车诊断消息,并且还要修改BCM固件中PCM和PAM的通信协议,用探针检测汽车各部件运行状态。探针好像价格不菲,很多ECU调校只是修改MAP表,汽车很容易出现问题。严格意义上讲,一个map表是一个或多个偏微分方程的解,当然在实践中都是根据经验进行修改map表。在这个等级上,汽车动力能提升10%-30%左右,要想再提升就需要下一个等级。
3、替换传感器、喷油嘴、变速箱、刹车片等。在这个等级上,等级2改装是必备的,汽车动力能提升50%-70%左右,要想再提升就需要下一个等级。
4、替换 PCM、PAM、发动机等。在这个等级上,等级2、等级3改装是必备的,汽车动力提升
80%-100%左右,要想再提升的话就可能要涉及汽车底盘。
5、增加 ECU。在这个等级上,主要是减少等级 4 的改装复杂度的,因为等级4要想更换 PCM、
PAM 等 ECU 是非常困难的,所以是采用外挂 ECU 进行硬件 hook 来实现。当然,还有可能是增加汽车更多的功能。
国外关于汽车改装的相关产业已非常成熟,等级1-5都有实现,而国内呢,还处在等级1的外观美容上,大量的等级2改装只是国外的代理,只有少量的等级2改装是本地的。
十四、总结
汽车诊断,涉及多方面的内容,本文主要是对非射频相关的 ECU 中的发动机ECU 进行初探,对于射频相关的ECU(WIFI、汽车钥匙等),尚未关注,对于ECU使用的EEPROM/Flash,尚未关注,对于汽车诊断中的探针部件,尚未关注。
PS:附件带有 KESS V2 支持的汽车品牌列表,根据本文可以推断出各汽车品牌所使用的 MCU(日系主要使用Renesas MCU,国产主要使用 C16X/ST10、Tricore)
点击左下角阅读原文,查看附件哦~
看雪学院
喜欢,别忘关注~