汽车电子安全-仪表盘控制器上的Hello World

汽车中使用CAN总线进行实验人们强烈渴望深入研究最神圣的圣物。 我想每个人都知道“芯片调整”这个词;在俄语中,这是控制单元(发动机,变速箱等)的简单固件。 设备制造商最初会在其设备中放置用于更新或更改微控制器软件的功能,但是出于明显的原因,并未向任何人透露其机制,并且使该过程复杂化的是,与非易失性存储器一起使用的程序本身并未存储在固件中,而是加载到了固件中。控制器仅在服务时使用。 本文介绍如何在访问自动诊断连接器的同时使仪表板微控制器执行其他人的代码。

通常, UDS诊断协议中描述了ECU(电子控制单元)中的数据加载机制,即功能:

34-请求下载
36-传输数据

但是就实施UDS而言,汽车制造商并不愿意对协议进行更改/添加,而是创建专有的附件。 就我而言,更新过程如下所示:

  1. 登录到扩展诊断会话
  2. 在引导程序中重新引导
  3. 获取安全访问权限以允许数据加载操作
  4. 地址在内存中的转移,将保留记录和数据量
  5. 资料载入
  6. 做加载的事情
  7. 接下来是使用之前下载的程序对EEPROM进行编程。

1-3点并不困难,但是下一步该怎么做? 从哪里获取地址和最大数据量? 开机后该怎么做下载了什么? 实际上,为此,正在撰写一篇文章。

选择了多种设备作为测试对象,因为,首先,我有一个启示录,另外,可以通过简单的USB-RS232适配器读取其控制器。 研究了内部,我们有了富士通MB91F223控制器。 这是具有FR60Lite内核,512 KB内存和16 KB RAM的32位微米。 数据表,RM,汇编程序手册,有关它的程序员可以在Internet上轻松找到,我不会在这里停下来。 他在这里很帅:



行动计划:

  1. 查找诊断请求处理程序
  2. 在内存中查找可写东西的地址
  3. 找到一种执行记录的代码的方法

要执行步骤1,您需要研究CAN总线上的中断处理程序,并了解数据存储在哪里以进行进一步处理。 许多控制器都有一个所谓的中断向量表,其中包含负责处理它们的功能的地址。 在Fujitsu FR系列中,该表在其行业中使用,并且指向它的指针存储在TBR寄存器(表基址寄存器)中。 通过IDA中的简单文本搜索,我们可以得到肯定的结果以及中断表的地址。



根据手册,CAN中断地址位于距TBR开头的偏移量0x370处。 他在那



他,但已经全面成长,还是使用ISO-TP协议的消息处理程序

ISO-TP处理程序不完整,但是不同类型的帧有所不同


从经销商诊断软件的数据库中,我获得了UDS协议的SID和LID(31E1)标识符,从而启动了代码执行过程,这简化了任务,并使我可以从头到尾进行操作。 在功能处理器31E1中,找到一个片段,在其中装载了属于RAM区域的地址,然后对该地址进行了调用。 这不是我们想要的吗?



使用常量0x3F100的搜索将我们引到固件的另一个位置,即UDS 34功能处理程序-请求下载! 这正是您所需要的,找到了写入数据的地址以及RAM中的最大数量(0x700字节)。



现在,在发送请求权限以下载数据的命令34 03F100 00 00010C (斜体显示的地址以粗体显示)后,仪表板将以良好的740401作为响应,接着,使用传输数据功能加载用户数据并发出命令满足。 我们已经确定了加载和执行过程,但是现在您需要找到要下载的内容。 我没有找到该微控制器的开源开发环境,但是一个月后,赛普拉斯技术支持出现了问题(是的,不是富士通,他们要么吸收了它们,通常我就不知道),他们提供了一个名为Shaggy Softune Workbench 97的IDE的链接。多年以来,编译器一直处于FR内核之下。

那就是它的样子,而不是vscode对。

在屏幕截图中,有一个用于闪烁LED的程序片段(不要以汇编程序的编写风格来踢,这是我的第一次经验)。



相同的代码,但是已经在si中

void delay(int loops) { while(--loops) { #pragma asm NOP NOP #pragma endasm __asm(" nop"); } } #define DDR2 (*((char*)0x402)) #define PDR2 (*((char*)0x2)) #define WPR (*((char*)0x485)) #define LVRC (*((char*)0x57D)) void wdt_reset(void) { WPR = 0xA5; WPR = 0x5A; LVRC = 0x10; } void main(void) { int current_pin = 2; DDR2 |= 0x7E; while(1) { wdt_reset(); PDR2 |= current_pin; delay(0x7FFF); PDR2 &= ~current_pin; delay(0x7FFF); current_pin <<= 1; if(current_pin >= 0x80) { current_pin = 2; } } } 

好吧,结果本身


对于其他节点,除了控制器体系结构和命令执行顺序之外,其他所有内容几乎相同。 将此类漏洞留在汽车设备中是否安全? 显然是的,因为制造商是这样做的。 我为什么要这样做? 很有趣,好吧,很长时间以来,汇编程序对我来说都是我感兴趣的,可以这么说。

主题-三菱8100B197仪表板,通过Tactrix OpenPort 2.0适配器(其自行设计的计算机上的软件)在CAN总线上进行通信。

Source: https://habr.com/ru/post/zh-CN474718/


All Articles