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(Interactive DisAssembler)是一款备受推崇的工具,它为逆向工程师们提供了强大的功能和灵活的操作。本文将带您深入探讨如何在IDA中查找字符串,优化字符串窗口的使用,并探讨IDA如何将变量转换成字符串,帮助您更加熟练地驾驭这一工具,为逆向分析的世界增添一抹精彩。
2023-09-27
ida如何转伪代码 ida伪代码怎么看
IDA Pro是一款常用的反汇编和反编译工具,可以帮助我们分析二进制文件的实现细节和执行过程,以便更好地理解程序的执行过程和逻辑。在进行逆向工程的过程中,我们经常需要将反汇编结果转换为伪代码,以便更好地进行分析和修改。本文将介绍如何使用IDA Pro转换为伪代码,并简单讲解ida伪代码怎么看。
2023-04-14
最新文章
ida设置断点怎么运行 ida断点在键盘上的使用方法
在使用IDA pro进行逆向分析的过程中,断点设置是最基础也是最常用的调试手段之一。尤其是在处理复杂的汇编逻辑或定位关键执行点时,合理地设置并运行断点,能够极大提升分析效率与准确度。本文将围绕ida设置断点怎么运行,ida断点在键盘上的使用方法两个关键问题展开,详细介绍IDA pro中的断点操作方式、快捷键使用逻辑及其在多架构平台上的适配特性,帮助用户在实战中更加高效掌控IDA pro的调试能力。
2025-09-28
IDA调试MBR切换到16位模式 IDA调试Apk修改寄存器v0
在逆向分析中,MBR和APK分别代表底层引导机制与上层移动应用的典型研究对象。前者常涉及16位实模式与汇编流程控制的深入理解,后者则要求熟练掌握Smali代码、寄存器模拟与调试器调用。IDA pro作为广泛应用的逆向工具,不仅支持对MBR类二进制的低位调试,也能在APK分析中发挥符号识别与寄存器控制优势。本文将围绕IDA调试MBR切换到16位模式和IDA调试Apk修改寄存器v0两个核心主题展开操作细节讲解。
2025-09-28
IDA逆向QT控件应用程序 qt获取窗口内所有控件
在逆向分析跨平台图形界面程序的实践中,QT框架的广泛应用对逆向人员提出了更高要求。QT采用信号与槽、动态UI加载等机制,传统Windows API分析手段难以适配。利用IDA pro进行QT应用程序的逆向分析,结合符号信息、vtable结构及动态控件创建逻辑,可以有效提取界面控件层级、信号连接机制等核心信息。同时,若拥有源码或调试权限,还可以通过QT原生函数如`findChildren`等方式实现对窗口中所有控件的枚举与分析。本文将围绕IDA逆向QT控件应用程序和qt获取窗口内所有控件两大主题进行详细讲解。
2025-09-28
IDA pro修改so教程 IDA pro修改exe
在逆向分析与二进制安全研究中,IDA pro作为主流静态分析工具,其强大的反汇编与重构能力,广泛应用于ELF格式的so库与PE格式的exe文件修改。通过IDA pro修改so文件,可用于Android应用补丁、破解函数逻辑、绕过验证;而对exe文件的修改则常用于Windows下的补丁、功能改写与程序定制。掌握IDA pro修改so与exe的流程,不仅能提升分析效率,更是逆向工程技能的基础能力。以下内容将系统讲解IDA pro修改so教程,IDA pro修改exe两大操作场景的具体步骤,帮助用户完整掌握二进制修改流程。
2025-09-28
IDA pro中修改remote GDB路径 IDA pro修改加载地址
在进行逆向分析或调试远程目标设备时,IDA pro作为静态与动态分析的核心工具,配合GDB远程调试功能可以实现对嵌入式、IoT系统乃至裸机程序的高效控制。而在不同项目中,经常会需要变更remote GDB路径或重新设定加载地址,这些操作看似简单,实则涉及IDA pro配置逻辑、GDB插件加载机制、调试环境变量等多个技术细节。本文将围绕IDA pro中修改remote GDB路径,IDA pro修改加载地址两大关键点 ,以助于用户更好掌控IDA pro调试行为。
2025-09-28
ida反汇编成c语言的三个步骤 怎样将反汇编代码转换成c语言代码
在逆向工程、安全分析以及老旧系统维护的实践中,如何借助IDA将汇编语言转化为C语言,是许多技术人员迫切关注的主题。IDA作为目前最成熟的反汇编工具之一,配合Hex-Rays Decompiler插件,可以将目标二进制程序自动生成接近C语言语义的伪代码,从而帮助开发者更快速理解程序逻辑、重构核心功能。本文围绕“ida反汇编成c语言的三个步骤,怎样将反汇编代码转换成c语言代码”这一主题,从实际操作出发,详细讲解整个转化过程。
2025-09-28

通过微信咨询我们

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

读者也喜欢这些内容: