首页
社区
课程
招聘
[原创]汽车动力系统ECU固件逆向工程初探
发表于: 2016-11-21 14:56 55999

[原创]汽车动力系统ECU固件逆向工程初探

gjden 活跃值
14
2016-11-21 14:56
55999

汽车动力系统ECU固件逆向工程初探

 

作者:gjden

时间:20161119

                                             


偶尔看到国外一些论坛讨论汽车改装(都是基于ECU的)的技术问题,于是产生了兴趣,想想如果ECU能够被改装,那么它肯定也会面临一些安全问题。所以参阅了一些讨论文章,发现他们讨论的问题基本上都是如何修改MAP(ECU中的数据表),而并没有人基于ECU二进制代码的逆向工程,因此有了本文。本文只是做一些关于汽车动力系统(发动机)ECU逆向工程的初步探索,在这方面资料稀缺,因此把自己一些粗浅的认知和分析结果放出来,文章必定有错误之处,人外有人天外有天,还望资深人士纠正,另外发出来的目的更希望能够起到抛砖引玉的作用。

一、明确一下ECU概念

         不必多说,ECU指的就是汽车电控制单元,也就是ECU的本意(Electronic Control Unit)。像防抱死制动系统、自动变速箱、SAM模块、多媒体系统、刹车辅助系统、巡航定速系统、自动空调系统、驱动系统、电控自动变速器、主动悬架系统、安全气囊等等都是包含有各自的ECU,他们分别由这些ECU控制管理并且这些ECU都通过CAN总线连接起来,形成我们通常所说的汽车网络(车载网络)

但是汽车行业内大部分人说的ECU都特指为发动机ECU, 也称车载电脑。这种延续了传统老式的叫法,因为早期的汽车只有一个用于管理发动机控制系统的ECU,因而大家习惯说的ECU实际上指的是发动机ECU,比如ECU更新、ECU调校、ECU改装等等概念都是特指发动机ECU。包括汽车百科里也都特指ECU为行车电脑/车载电脑。但国外很多分析文章、论文中涉及ECU基本上都是广泛意义的ECU,而不特指发动机ECU

下面我截了几张发动机ECUPCB图,可以看出ECUPCB似乎和普通电子设备的PCB差不多。


至于ECU控制发动机的原理,几乎所有将汽车的教材中都有,我就不多说了,否则得引出一堆东西,那就是给自己挖了一个大坑,所以还是那一句话:网上资料多,还得靠自摸^^!下图是我从PPT上截来的,应该是最直观易懂的图。


 

二、ECU固件获取

         先做一点科普,对于大部分汽车玩得比较深的人,对汽车改装都不会陌生,现代意义的汽车改装实际上是对发动机ECU固件提取、调校、回写等。一般通过ECU调校可以让发动机输出更高的动力。ECU调校通常比较复杂,比如需要对点火时间、喷油量、喷油时间、燃油压力、增压压力等等参数的调整并且还需要结合负荷、档位、转速、温度等做出最优的调整方案,另外还得考虑安全性等等问题。因而需要对汽车系统非常熟悉并且具有丰富的调校经验的工程师才能够完成,所以ECU调校的费用也会很高。

ECU固件的读取和普通设备的固件读取类似,但是也有差别。相似之处就是都需要硬件设备支持,不同在于接口方式的不同(实际上是废话^^)。当然有的ECU需要将ECU拆解下来进行固件读取,而有的可以直接通过OBD口进行固件读取,通过OBD读取更加简单,至少不用拆机和焊线。以下是我列举的一些可以进行ECU读写的工具,当然并不全,有需要的可以自行搜索购买。

工具名称

简介

CMD Flash

支持OBD2BDM BOOT模式对ECU进行读写

AZN Tuning

AZN改装店专用,似乎不向外出售

Galletto   1260

实际就是一根诊断线(内含OBD USB芯片)

OpenPort

支持OBD2进行数据读写

MPPS V13.02

Galletto   1260类似

 

当然如果你的汽车支持OBD2进行固件读写并且你已经熟悉读写ECU固件的诊断命令,那么你也可以连接OBD2接口并且向其发送诊断命令来操作,只是相对来说麻烦一些。

下图展示的以上列举的刷ECU固件的硬件工具的截图:


Galletto 1260


OpenPort


CMD Flash工具

 


AZN Tuning

 


MPPS v12

 

如果拆机的话,会涉及接线问题,你可以通过chip datasheet来搜索与你车型ECU相匹配的芯片手册。下面这张图是奥迪ECU的接口图,你可以根据自己ECU的类型找到其针脚定义。


目前,大部分的汽车都支持OBDII来进行ECU的操作,因此来一张OBDII关键接口的图:


如果你购买有硬件FLASH工具,那么产品相关的说明文档应该可以解决大部分问题,网上也有相当多的资料,实际上ECU固件的读写比一般的设备的固件读写简单很多,因而在这里也不细说了。

 

三、ECU固件分析初探

在汽车界玩得最深的估计就是做ECU调校了,但是ECU调校只是对ECU MAP表(ECU固件中的数据表,后面会有更详细的说明)进行微调并且读修改的数据做校验。但如果对ECU固件代码进行逆向工程,我们不仅可以对修改MAP表,还可以破解其校验功能(很多买得很贵的MAP校验工具就是靠逆向校验函数而编写的,这实际上并不难,因为MAP的校验算法本身就不是很复杂),并且修改固件代码流程,甚至可以给其添加功能或者是加一些恶意代码进去,就像我们玩儿PE文件一样,在保证其能够正常和安全运行的前提下,你可以自由的改造。

1. 固件信息提取

首先通过二进制数据中的字符串来看看该ECU固件的有哪些信息。


上图中我标记的第二行信息是该ECU的电子发行包,我们可以看出该ECU是采用的博世的ECU ME7.1。此后,我又发现了与发动机相关的信息,如图:


其中 06A906032JB为发动机零件号,通过零件号可以得知该车型的发动机为宝来发动机,但是ECU采用的是博世ECU,发动机排量为1600ml,变速器为AG4自动4档位等等。最后,我通过ME7Info提取出了更多的信息。比如可能的通信协议硬件号、软件号、软件版本、引擎ID等等信息。


 

2.指令集识别

如果要对固件进行逆向工程的话,必须知道该固件的MCU类型,以便知道该ECU采用指令集类型。因此,我首先想到了binwalk,因而我尝试了一下,binwalk识别指令花了很长时间:

Binwalk识别出来竟然是ARM,着实让人兴奋了一把,因为个人对ARM指令还是比较熟悉的,更何况IDA还可以F5。但是看到后面的说明感觉就有点不对,怎么可能只有540条有效指令。随后,我用IDA来验证了一下,反汇编指令选择ARM big endian。并且从0x12943的位置开始进行反汇编,如图:


可以明显的看出,这是不正常的代码,并且根据经验,固件开始部分应该会有一大堆中断跳转,但通过ARM Big Endian 得到的代码却是如下这样:


另外我也尝试了使用little endian方式来反汇编,同样是不正确的。

此时,第一步提取的固件信息就很有用了,至少为我们提供了搜索的线索,结合固件涉及的电子属性和发动机相关信息,我发现该ECU属于英飞凌的(Infineon,前身为西门子集团的半导体部门),而该ECU采用的是C16X系列的内核,也就是说该ECU封装的实际上C16XMCU,这款MCU原先属于西门子,因此指令集极有可能也是西门子的。强大的IDA果然没有让我失望,其完全支持C16X家族系列。在IDA中我选择Siemens C166进行反汇编,确认后需要填写RAMROM地址RAMROM地址目前还不清楚,因而先空着直接反汇编。


从图中我们可以看出部分跳转指令是正常的,但是有的又不正常(红色阴影的地址)。不正常的地址有一个共同点就是都是基于0x820000的地址。因而,部分于MCU相关的中断服务以及硬件管理代码可能的基地址为0x000000,这就是这部分代码可能映射在0x0000000处,而部分与ECU相关的中断服务和硬件管理代码可能的基地址为0x820000。如果你关心MCU的代码可以将固件分割后进行分段加载,我这里只是简单将整个固件映射到0x800000,因为我只关心ECU的代码,所以将该ROM的起始地址设置为0x800000,而我们的固件大小为1M,因此ROM大小设置为0x100000,加载地址和大小和ROM设置成为一样。RAM采用默认的方式不管它。


 

反汇编后,我们可以看到MCU相关的中断跳转表。


 

OK,现在我们可以正常的分析该ECU固件了。当然如果你想逆向分析该ECU固件,你得熟悉C166汇编语言,还得要十足的耐性。下表我列举了C166汇编指令及其功能(也基本上来自于网络),如果想要更新详细的信息,那就去看Infineon的手册吧。

算数指令

指令1

指令2

功能描述

ADD

ADDB

两字或字节加法

ADDC

ADDCB

带进位的两字或字节加法

SUB

SUBB

两字或字节减法

SUBC

SUBCB

带进位的两字或字节减法

MUL

MULU

16位乘16位带符号或无符号乘法

DIV

DIVU

16位除16位带符号或无符号除法

DIVL

DIVLU

32位除16位带符号或无符号除法

CPL

CPLB

一个字或字节的1的补数

NEG

NEGB

一个字或字节的2的补数

逻辑指令

AND

ANDB

两字或字节位与

OR

ORB

两字或字节位或

XOR

XORB

两字或字节位与或

比较指令

CMP


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 15
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  yjmwxwx   +2.00 2019/03/05
最新回复 (47)
雪    币: 6
活跃值: (1509)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
哈 能发下一些  国外学习单片机的网站就更好了
2016-11-21 14:57
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
3
楼主流弊,学习了!!~~轴距为4629mm的车也流弊~~
2016-11-21 15:23
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
4
这个资料稀缺,赞一个):
2016-11-21 15:31
0
雪    币: 268
活跃值: (3233)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
楼主,,以后多多交流,,现在我也在弄汽车
2016-11-21 15:38
0
雪    币: 6790
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
6
轴距4629mm,笔误
2016-11-21 15:38
0
雪    币: 288
活跃值: (212)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
很有用,唯一有点可惜的是没有机会马上动手一试
2016-11-21 16:13
0
雪    币: 6790
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
8
单片机资料国内已经非常丰富了
2016-11-21 16:47
0
雪    币: 41
活跃值: (823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
也是从事汽车行业的,赞一个
2016-11-21 17:44
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
10
赞一下!

排版好的文章门户上己发:http://www.kanxue.com/?article-read-60.htm

等论坛升级好后,门户留言,论坛这边自动同步。
2016-11-22 16:45
0
雪    币: 6790
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
11
门户排版功能应该很强
2016-11-22 16:56
0
雪    币: 7
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不错哦,点赞。
2016-11-22 18:51
0
雪    币: 287
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不错的帖子
2016-11-22 19:41
0
雪    币: 1253
活跃值: (2163)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
14
同是固件分析工作,赞一个
2016-11-23 23:21
0
雪    币: 5590
活跃值: (2769)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
流弊,学习了!
2016-11-25 09:14
0
雪    币: 421
活跃值: (83)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
MCU固件的破解这个牵扯到的软硬结合,需要的不仅仅是键盘,还需要有一定的经济实力才行。多谢分享
2016-11-25 12:33
0
雪    币: 160
活跃值: (272)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
我搜索到这里就是为了点赞来的!!!!楼主厉害,佩服佩服
2017-1-6 09:34
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
单片机程序结构都比较乱 不是特别好整理的
2017-1-26 15:58
0
雪    币: 34
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
文章里面几个linux 命令能发下吗
2017-2-8 10:21
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
厉害  长见识了  谢谢
2017-4-8 17:16
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
很厉害,分析的很透彻。
2017-4-12 18:51
0
雪    币: 139
活跃值: (292)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
刷ECU的攻击都在哪里买的呢?
2017-9-15 10:26
0
雪    币: 260
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
最近花了20多天才把康明斯所有的算法搞出来!汽车还是比较难搞!
2017-11-15 15:30
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
版主,最近还有研究这块没?
2018-3-6 16:36
0
雪    币: 2359
活跃值: (288)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
真心牛鼻
2018-3-13 08:17
0
游客
登录 | 注册 方可回帖
返回
//