IDA Pro > IDA Pro教程 > 技术问题 > 汽车动力系统ECU固件逆向工程初探

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

发布时间:2022-10-08 16: 27: 56

偶尔看到国外一些论坛讨论汽车改装(都是基于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。

 

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

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

二、ECU固件获取

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

 

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

当然如果你的汽车支持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封装的实际上C16X的MCU,这款MCU原先属于西门子,因此指令集极有可能也是西门子的。强大的IDA果然没有让我失望,其完全支持C16X家族系列。在IDA中我选择Siemens C166进行反汇编,确认后需要填写RAM和ROM地址。RAM和ROM地址目前还不清楚,因而先空着直接反汇编。

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

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

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

算数指令

 

 

逻辑指令

 

比较指令

 

布尔位操作指令

 

移位和循环移位指令

 

系统控制指令
控制流程指令

 

这里不一一列举了,其他指令请查询C166手册,此外本文不打算介绍C166的那些寄存器以及ECU自身寄存器(这些寄存器是处在MCU外部,和MCU一起被封装在ECU中,通常都是映射在RAM中,寄存器太多了,就不做介绍了)。

 

3.汇编代码的二次处理

通过IDA反汇编得到毕竟只是原始的汇编代码,代码量巨大并且难以识别,分析起来也会非常吃力。如果有现成的插件或者脚本自动识别一些函数或者数据,那么可以大大减少我们逆向工程的工作量。幸运的是目前还真有这样的插件—Bosch Me7x插件,该插件针对ME7.1和7.5来进行函数和MAP表的识别以及做出相应的注释。这是一款比较老的插件,对于部分的函数和MAP表的识别有些错误。但是有总比没有好,通过该插件我们成功找到了一些关键函数和MAP表。

 

如下图是识别出来的操作系统自身的函数,主要是一些基本操作函数,当然这些函数我们可以不用关心。

以下是一些识别出来的lookup表(这些表构成了MAP)和以及部分操作MAP的函数。此外很多MAP查询函数都没有做明确的注释,只是被命名为LookupA-Z,因而具体的那个函数操作那个MAP需要花费大量的时间来分析。

查表函数对参数都做了注释,很人性化

另外,插件采用的是固定的函数特征和MAP表特征,因而很多MAP表也都没有识别出来。所以我们还需要结合其他工具来分析。

 

在代码级别的逆向工程对固件的操作级别更高,你可以绕过某些逻辑和校验,甚至可以给ECU添加功能,或者添加一个后门(在某个传感器的值达到一个异常值时触发后门,对于目前很多将发动机ECU接入CAN网络后,你会有更多的攻击入口,此处不多说,自己体会吧),而不仅仅限制于修改MAP(大部分都是做ECU改装)。

 

4.MAP表的进一步分析

MAP表,又称脉谱表,设计者将提前将计算好的数据采用二维、三维或多维的数据结构方式存储到ROM里面去。典型的三维MAP就是喷油MAP,一般横坐标是转速,纵坐标是节气门开度,纵横坐标交叉点就是喷油量数据。采用这种三维数据结构,能够精确的表示出每一个不同转速和不同节气门开度情况下的喷油量。ECU通过读取传感器的工作参数得知引擎各机构当前状态(如空气流量、曲轴位置等)并且将读取的数据作为MAP表的坐标参数查出需要控制引擎的信息等(如喷油时机、喷油量)。

 

通过更加细致的分析,我找到了一些MAP表,比如油量表、直接转矩控制表(DTC表)、DTS表、油量表、RPM表、进气温度表等,以及操作表的函数,比如有做MAP校验的函数,查表的函数等等。但这是远远不够的,现在汽车的MAP表通常都有几十上百个MAP表。

 

因此,为了识别出更多MAP表,我需要一个更加专业的工具,那就是鼎鼎大名的winols,该款工具可以很好的识别出ECU固件中MAP并且能够实现这些数据的2D、3D展示,最强大的是可以实现MAP数据的编辑和校验,即便是加密处理过的数据也可以自行解密。

 

如图,可以看出winols可以识别出71个MAP表,每个MAP表都是以Map“Bosch II”类似的默认名称命名,这些需要自行进行识别以后进行更改,不同的ECU有不同的MAP表,也没有固定特征,需要一些经验来进行识别。

针对于每一个MAP表都可以以纯数据、2D、3D方式来进行显示。

以3D形式显示有助于工程师根据3D形状来判定该MAP的类型,也可以非常直观的看到MAP修改之后的改变。当然winols还支持修改完自动完成校验的功能。如果连接上汽车,它还可以实时进行修并且实时校验,大大方便了ECU的调试。

此外还有很多其他做MAP数据修改的工具比如3D MAP之类的,也都是非常好的工具,此处也不做介绍了。

 

四、总结

本文仅仅对ECU固件分析做了一个初步探索和简单的分析,后续还有很多工作要做,比如ECU MAP数据校验绕过,添加和修改ECU功能和某些逻辑,二进制代码级别的ECU CAN协议解析逆向,传感器数据解析逻辑以及指令发送逻辑等等。

 

案例作者:gjden

原地址:http://www.gda.wiki:9090/blog_9.php

展开阅读全文

标签:IDA反汇编

读者也访问过这里:
邀请您进入交流群 点击扫码
400-8765-888 kefu@makeding.com

专业销售为您服务

欢迎添加好友,了解更多IDA优惠信息,领逆向工程学习资料礼包1份!
热门文章
exe反编译工具哪个好?反编译能力强的工具盘点
随着软件技术的发展,exe(可执行文件)已经成为了电脑、手机等多个平台上的主要软件运行格式,而对于exe文件的反编译也成为了逆向工程中不可缺少的一个步骤。本文将介绍一些常用的exe反编译工具,并评价其优缺点,帮助读者选择合适的工具。
2023-04-12
idapro怎么改为中文
IDA Pro是一款功能强大的反汇编和反编译工具,广泛应用于逆向工程和软件开发领域。在使用IDA Pro时,如果我们不习惯英文界面,可以将其改为中文界面。本文将介绍IDA Pro怎么改为中文界面。IDA Pro界面改成中文主要有两种方法,下面是详细介绍。
2023-04-19
c++反编译工具有哪些
反编译C++代码的工具一般是针对可执行文件和库文件的反汇编和逆向分析工具。本文将给大家介绍c++反编译工具有哪些的内容。市面说的c++反编译工具有很多,下面介绍几款使用认识较多的软件。
2023-04-23
ida如何转伪代码 ida伪代码怎么看
IDA Pro是一款常用的反汇编和反编译工具,可以帮助我们分析二进制文件的实现细节和执行过程,以便更好地理解程序的执行过程和逻辑。在进行逆向工程的过程中,我们经常需要将反汇编结果转换为伪代码,以便更好地进行分析和修改。本文将介绍如何使用IDA Pro转换为伪代码,并简单讲解ida伪代码怎么看。
2023-04-14
IDA反汇编流程视图的常用基本操作设置
IDA中反汇编窗口中有两种不同的形式,分别是列表模式和图形模式,IDA默认打开是图形模式,就是反汇编流程视图,可以用来分析程序函数的具体运行情况。
2021-06-15
IDA的初始使用说明和界面简介
IDA能帮助我们分析恶意软件、分析系统漏洞、验证编译器的性能,其支持在Mac系统、Windows系统、Linux系统中使用,是一款非常优秀的反编译软件。
2021-03-16
最新文章
ida医学上是什么意思?医学ida指什么?
医学术语往往能够准确地描述健康状况和疾病的特点,对于医疗专业人员来说是日常工作不可或缺的一部分。然而,普通公众对这些术语的理解可能会存在困难,这就需要我们通过更易懂的方式来介绍这些专业知识。其中,“IDA”是一个在医学领域频繁出现的缩写,代表了一种常见的健康问题。本文将详细阐述IDA在医学上的含义,它所指的特定疾病,以及IDA在其他领域的潜在含义,旨在帮助公众更好地理解这一术语。
2024-04-23
mybatis逆向工程是什么?mybatis逆向工程使用什么工具?
mybatis,作为一个流行的Java持久层框架,通过提供一种相对简便的方式来管理数据库操作和数据转换,已经成为众多项目开发中不可或缺的一部分。而mybatis逆向工程,则是在此基础上,通过自动化生成数据库操作代码的方式,进一步提升开发效率,简化开发过程。
2024-04-17
md5可以反编译吗?md5反编译需要用什么工具?
在数字安全和软件开发领域,md5一直是一个广为人知的话题。md5,即Message-Digest Algorithm 5,是一种广泛使用的加密哈希函数,能够产生一个128位(16字节)的哈希值,通常用一个32位的十六进制数表示。但随着计算技术的发展,人们开始探讨md5是否可以反编译,以及进行这种反编译所需的工具是什么。本文将深入探讨这一话题,包括md5的反编译可能性、所需的工具以及IDA反编译原理的详细分析。
2024-04-16
pyc反编译文件怎么做?pyc反编译有什么工具?
Python编程语言以其高效的性能和广泛的应用领域占据了软件开发的重要地位。随之而来的`.pyc`文件作为Python代码编译的产物,对于提高程序运行效率有着不可忽视的作用。但在某些场合下,我们需要将这些编译过的文件还原为源代码形式,以便于代码审查或学习交流。因此,本文将深入探讨`.pyc`文件的反编译过程、介绍有效的反编译工具,并指导如何通过IDA快速掌握反编译技巧,以资助力开发者和逆向工程师。
2024-04-09
易语言反编译是什么?易语言反编译怎么做用什么工具?
软件工程的一个挑战性任务是如何解读和分析那些没有源代码的程序。对于易语言编写的软件,这一挑战尤为突出。反编译技术,作为桥接编译代码与源代码的关键技术,能够揭开编译后程序的神秘面纱。本文将聚焦于易语言反编译的基础知识、实施方法及所需的工具,并详细探讨IDA工具在逆向工程任务中的核心作用,为广大技术从业者提供参考和指导。
2024-04-09
IDA8.4新版发布:界面大更新!反编译精度提升!附下载
逆向工程领域的佼佼者,IDA Pro,再次以其最新版本8.4引领技术潮流。本次更新不仅延续了IDA Pro一贯的专业性能,更在用户体验和功能上带来了一系列创新和改进。我们诚邀广大用户前往IDA中文网站(https://www.idapro.net.cn/)下载并体验IDA 8.4的最新功能。
2024-04-01

通过微信咨询我们

欢迎添加好友,了解更多IDA优惠信息,领取逆向工程学习资料礼包1份!

读者也喜欢这些内容: