UDS诊断之0x27服务—结合实例讲解

news2025/1/10 12:18:45

前言:

本文讲解的是比较深入一点知识,对于一些刚入门的同学,建议直接先看一遍14229规范,然后找一个实际项目练练手!然后再来看本文,相信你会对0x27服务有更深的认知!!!

进入正题!!

1、0x27服务的目的是什么?

为了保护关键数据不被篡改,故你打开任何一个主机厂的诊断调查表,你就会发现基本0x2E服务和0x23服务都是需要安全解锁后,才能写入数据。0x2F,0x34/0x35/0x36/0x37服务都会用到安全解锁服务。甚至一些0x22关键信息的提取,都需要安全解锁。

2、安全解锁的几个常见的问题

2.1、安全seed和key的长度是多少?

ISO-14229规范中,并没有规定seed和key的长度,常见的有2byte,4byte,一般是偶数字节数量的长度。

2、安全解锁的等级只能维持一种!!且解锁等级之间独立,且没有从属关系!!!

比如说 10 02 会话中,同时支持01/02解锁和03/04解锁,同一时间内,不存在两种解锁等级同时处于unlock状态。

这里有一些人存在一种基于“实际项目的一种错觉”,即“数字越大好像解锁的权限越高”,给我们造成一种错觉03/04解锁覆盖了01/02解锁。还是以上面的例子为例,1002会话下的0x2F(控制输入输出服务)只有在01/02解锁等级下,才能使用。但是在03/04解锁下,0x2F也能使用,而且还能控制0x31,添加了0x34,0x35,0x36,0x37等服务。

但是,如果项目中规定,01/02解锁状态下,能使用0x2F服务,03/04解锁不能使用0x2F服务,你也不能说他是错误的。但是一般主机厂都不这么干!!

2.3、解锁等级和服务之间的关系

同理那种解锁安全等级下,能使用那些特定的服务,14229中也没有强制规定。需由结合具体的会话确定,这些都是由主机厂规定的。

4、seed产生的随机数?

对seed产生的随机数,测试中有一项测试,就是对随机数进行检测。就是对服务器产生的随机数进行检测。其中一项就是对随机性质进行检测,就是检测产生种子的随机性。

代码如下:

假设诊断ID=0x701,

/*先获取9999次种子*/

qword ArraySeed[99999]={};  //具体看Seed的实际长度,假设是8个byte

byte i_forgetseed;

on message  0x701

{

dword count=0;

qword seed=0;

   if(this.byte(1)==0x67&&this.byte(2)==0x01)

    {

    for(i_forgetseed=0;i_forgetseed<8;i_forgetseed++)

   seed =seed +  this.byte(i_forgetseed+3)<<(7-i_forgetseed)*8;

    }

ArraySeed[count]=seed;

seed=0;  //重新初始化为0

}

/*获取完成后,就开始比较*/

 byte  ComSeedArr(qword Arr_Seed)

{

   dword i_max = elcount(Arr_Seed);

   dword i=0;

   dword i_forcmp=0;

  dword Sum_SameSeed;

  Sum_SameSeed =0;

for(i=0;i<i_max;i++)

      {

        for(i_forcmp=i+1;i_forcmp<i_max;i_forcmp++)

            {

                 if(Arr_Seed[i]=if(Arr_Seed[i_forcmp];

                    {

                      write("存在两个种子一样,分别为第%d个 Seed=第%d个Seed",i,i_forcmp);

                      Sum_SameSeed++

                     }                 

             }

  if(Sum_SameSeed==00)

     return 0;  //表示没有种子相同

  else

     return 1;  //表示存在种子相同

}

//最后,在读取完所有种子后,在合适的地方调用ComSeedArr() 函数即可

ComSeedArr[ArraySeed];

2.5、0x27服务对应的几个特殊的NRC

2.5.1)NRC: 0x35,

    这个最简单就是服务端发送的key,和服务器端自己计算的key对不上,就发送这个NRC

2.5.2)NRC: 0x36 错误计数达到阈值

     失败的key发送次数,主机厂定义。需要注意的是0x36NRC,存在一个前提,就是请求key的子功能,必须和请求seed的子功能一致。当同一会话下

    错误示范如下:假设错误0x36触发条件=错误key被发送4次。

0x 701 02 27 01

0x 7B1 04 67 01 22 33

0x 701  04 67 02 44 55,假设44 55 是计算错误的key ,正确的key是其他值。

0x 7B1 03 7F 27 35,   表示错误key被接收

此步骤连续执行3次后,第4次执行,也就是说,发送错误计数达到=最大计数时,NRC36被触发。

0x 701 02 27 01

0x 7B1 04 67 01 22 33

0x 701  04 67 02 44 55,假设44 55 是计算错误的key ,正确的key是其他值。

0x 7B1 03 7F 27 36

但是如果第四次执行是

0x 701 02 27 01

0x 7B1 04 67 01 22 33

0x 701  04 67 04 44 55,假设44 55 是计算错误的key ,正确的key是其他值。

0x 7B1 03 7F 27 24 ,则会报出请求顺序错误

 

2.5.3)NRC: 0x37  错误达到阈值后,继续执行解锁服务

       如上,第五次执行01/02解锁后,触发37服务。此时会触发代码内部的一个计时器,假设计时器计时为3s,在这3s时间内,再发送27 01 就会返回NRC0x37。

注意:(1)、0x35、0x36、0x37都是基于特定子服务,也就是解锁等级。如下例子说明

**1)01/02解锁中,已经触发了3次NRC0x35,此时在执行第1次错误key的03/04解锁,则会返回NRC0x35,执行第2次错误key的03/04解锁,依然会返回NRC0x35,直到第4次(假设03/04解锁触发0x36的错误次数阈值=4)。

从上面的例子可知,各种不同的解锁之间错误计数是相互独立的。因为错误key引起的拒绝访问的维持时间,也是相互独立的。

2.5.4  重置(解锁错误计数(NRC0x36)和延迟计时(NRC0x37))的方法

严格来说14229规范中只规定了,当错误计数累计到=阈值-1时,来一次正确的解锁流程,才能将“错误解锁次数计数”重置为0。

但是,实际很多项目中,0x11复位服务,也能重置“错误解锁次数计数”。这个主机厂或供应商自行决定。

而延迟计时,14229规范并没有规定重置的方法,也没有规定延时的具体时间。上文说过,具体延时时间由主机厂或零部件供应商自行设定。

那,延时有没有办法重置,了解这个问题之前先看14229规范中的一段描述。

归纳下大意:即ECU启动或者复位的时候也启用这个定时器。可以所有安全等级用同一个定时器,也可以每个安全等级都分配一个定时器。甚至,这个定时器可以是一个可变值,例如可以随着尝试失败的次数增加而增加。

但是以上描述中的“ECU启动或者复位的时候也启用这个定时器”很多实际项目中都没有去实现。测试人员可以尝试使用自动化工具实现测试,如果你能报这个bug。

实际测试中发现,0x11复位后,会重置这个值。

另外按照规范描述,复位或者下电时,错误计数和延时的值,是需要写入ERROR中去

6、种子全0,的特殊状态

6.1 什么状态下,服务器回复的seed全部是0

协议中规定,正常解锁,请求种子时,种子不能全为0。只有一种特殊情况,即“同一会话状态下,同一级别的安全解锁已经解锁过了,第二次解锁后,种子必须全0”。

实际测试时的步骤如下:

**1)先进入 10 03会话,会话状态维持在10 03会话下

**2)执行第一次01/02解锁,观察种子是否全0?全0则报错

**3)保持会话状态不跳转,执行第二次01/02解锁,这次种子必须是全0

热爱思考的同学,这是又会提出疑问 10 01 会话状态下,解锁是不是只能执行一次,就是只有一次请求的种子为非全0?,理论上是这样的,不过存在两个前提:如下

前提1:一直维持默认会话,不进行会话状态跳转,如果默认会话状态,跳转到其他会话,再从其他会话跳转到默认会话,再次请求种子,就不能是全0.

前提2:不执行断电上电操作,重新上下电后,属于再次初始化,请求的种子必须不是全0

 6.2 seed全0,与NRC 0x36 NRC 0x24的关系

1、先执行3次,触发NRC35

0x 701 02 27 01

0x 7B1 04 67 01 22 33

0x 701  04 67 02 44 55,假设44 55 是计算错误的key ,正确的key是其他值。

0x 7B1 03 7F 27 35,   表示错误key被接收

2、第四次,执行一次正确的01/02解锁服务

0x 701 02 27 01

0x 7B1 04 67 01 22 33

0x 701  04 67 02 32 5A   这次“ 32 5A ”是正确的NRC

3、第五次,在执行一次错误的01/02解锁

0x 701 02 27 01

0x 7B1 04 67 01 00 00 , 此时因为上一步正确解锁后,服务器返回的种子为全0

0x 701  04 67 02 44 55,假设44 55 是计算错误的key ,正确的key是其他值。

0x 7B1 03 7F 27 24,    此时认为是请求顺序错误 

从上面的例子可以看出,解锁一次成功后,是无法继续触发NRC0x36,而NRC0x37也是需要先触发0x36,才能触发NRC0x37,故0x37,在以上情况下,也是无法触发!!

7、另外一个和解锁强相关的NRC 0x33

也就是对应服务,如果在诊断文件中规定,必须要对应的安全解锁等级解锁,但是实际未解锁,就会回NRC0x33

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React Router 向路由组件传state参数浏览器回退历史页面显示效果问题

昨天在看尚硅谷张天禹老师讲的 React教程p90&#xff0c;老师讲到 React路由的 replace模式和push模式&#xff0c;老师的演示效果与自己本地操作不太一样。 老师的效果&#xff1a;点击查看消息1&#xff0c;消息2&#xff0c;消息3 再点回退&#xff0c;可以依次查看到 消息…

静态路由配置与调试——计算机网络实训day1

文章目录 操作前准备一、实验目的二、实验要求三、实验过程1、在R1和R2上配置设备名称。基本配置设备命名 2、在R1和R2上配置接口IP地址&#xff0c;并查看IP地址的配置情况。3、在R1和R2上配置静态路由&#xff0c;并查看路由表。静态路由缺省路由&#xff08;默认路由&#x…

【HeadFirst系列之HeadFirst设计模式】第1天之HeadFirst设计模式开胃菜

HeadFirst设计模式开胃菜 前言 从今日起&#xff0c;陆续分享《HeadFirst设计模式》的读书笔记&#xff0c;希望能够帮助大家更好的理解设计模式&#xff0c;提高自己的编程能力。 今天要分享的是【HeadFirst设计模式开胃菜】&#xff0c;主要介绍了设计模式的基本概念、设计模…

UOS系统和windows系统wps文档显示差异问题解决

最近在使用UOS系统的过程中&#xff0c;发现了一个很有意思的现象。就是在UOS系统上编辑的文档&#xff0c;发到windows系统上&#xff0c;会出现两个文档显示差异很大的情况&#xff0c;文档都是使用一样的wps软件打开的。到底是什么原因导致这种现象的呢&#xff1f;该如何解…

网络应用层HTTP协议

网络应用层HTTP协议 1. HTTP协议介绍 在互联网世界中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信&#xff0c;以交换或传输超文本(如 HTML 文档)。…

B+树的原理及实现

文章目录 B树的原理及实现一、引言二、B树的特性1、结构特点2、节点类型3、阶数 三、B树的Java实现1、节点实现2、B树操作2.1、搜索2.2、插入2.3、删除2.4、遍历 3、B树的Java实现示例 四、总结 B树的原理及实现 一、引言 B树是一种基于B树的树形数据结构&#xff0c;它在数据…

在 macOS 中,设置自动将文件夹排在最前

文章目录 1、第一步访达设置2、第二步排序方式 需要两步设置 1、第一步访达设置 按名称排序的窗口中 2、第二步排序方式 选择名称

【数据库】Unity 使用 Sqlite 数据库

1.找到需要三个 DLL Mono.Data.Sqlite.dllSystem.Data.dllsqlite3.dll 上面两个dll可在本地unity安装目录找到&#xff1a; C:\Program Files\Unity\Hub\Editor\2022.3.xxf1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-win32 下面dll可在sqlite官网下载到&#xff…

国内使用博查SearchAPI进行智能搜索,通过API获取搜索引擎的天气、日历、百科、手机、火车票等信息

在现代开发中&#xff0c;网络资源搜索是关键且常见的需求。博查SearchAPI作为国内领先的智能搜索解决方案&#xff0c;已服务超过2000家企业和16000名开发者&#xff0c;获得腾讯元器、字节扣子、阿里钉钉等官方推荐。该API提供近百亿网页内容及多样的生态合作内容&#xff0c…

免费网站源码下载指南:如何安全获取并降低开发成本

许多开发者或是需要建立网站的人&#xff0c;可以方便地获取免费网站源码。这样的下载能帮助他们降低开发费用&#xff0c;迅速构建起基本框架。但在此过程中&#xff0c;仍有许多需要注意的事项。 许多开发者或是需要建立网站的人&#xff0c;可以方便地获取免费网站源码。这…

colnames看似简单,却能优化数据处理流程

引言 在数据处理和分析中&#xff0c;变量名称是至关重要的&#xff0c;它们决定了数据的可读性和操作的简便性。在R语言中&#xff0c;colnames 函数以其简单的语法设计&#xff0c;提供了高效管理数据框列名的能力&#xff0c;尤其是在复杂的爬虫任务中显得尤为重要。本篇文…

计算机网络例题

IP地址分类&#xff1a; A类&#xff1a;网络号范围&#xff1a; 1~126 &#xff08;0000 0001 ~ 0111 1110&#xff09; B类&#xff1a;网络号范围&#xff1a;128.1 ~ 191.255 &#xff08;可用范围&#xff09; C类&#xff1a;网络号段范围&#xff1a;192.0.1 ~ 223.2…

腾讯云AI代码助手编程挑战赛 - 使用 JavaScript 构建一个简易日历

功能简介&#xff1a; 动态年份选择&#xff1a;用户可以通过下拉框选择从 2000 年到 2050 年的任意年份。全年日历生成&#xff1a;根据用户选择的年份&#xff0c;动态生成该年份的所有 12 个月份的日历。直观的 UI 设计&#xff1a;使用 CSS 美化日历外观&#xff0c;使日历…

hive迁移后修复分区慢,怎么办?

我有1个30TB的分区表&#xff0c;客户给的带宽只有600MB&#xff0c;按照150%的耗时来算&#xff0c;大概要迁移17小时。 使用hive自带的修复分区命令&#xff08;一般修复分区比迁移时间长一点&#xff09;&#xff0c;可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…

java-方法详解

目录​​​​​​​ 一、方法的定义 二、方法的调用 1.对于非静态方法&#xff1a; 2.对于静态方法&#xff1a; 3.类名.什么情况下可以省略 三、方法的参数传递 (1).实参和形参 形参 实参 (2).基本数据类型参数传递&#xff1a; (3).引用数据类型参数传递&#xff…

第二十八周机器学习笔记:PINN求正反解求PDE文献阅读——反问题、动手深度学习

第二十八周周报 一、文献阅读题目信息摘要Abstract网络架构实验——Data-driven discovery of partial differential equations&#xff08;偏微分方程的数据驱动发现&#xff09;1. Continuous time models&#xff08;连续时间模型&#xff09;例子&#xff1a;(Navier–Stok…

IT面试求职系列主题-Jenkins

想成功求职&#xff0c;必要的IT技能一样不能少&#xff0c;先说说Jenkins的必会知识吧。 1) 什么是Jenkins Jenkins 是一个用 Java 编写的开源持续集成工具。它跟踪版本控制系统&#xff0c;并在发生更改时启动和监视构建系统。 2&#xff09;Maven、Ant和Jenkins有什么区别…

【我的 PWN 学习手札】IO_FILE 之 FSOP

FSOP&#xff1a;File Stream Oriented Programming 通过劫持 _IO_list_all 指向伪造的 _IO_FILE_plus&#xff0c;进而调用fake IO_FILE 结构体对象中被伪造的vtable指向的恶意函数。 目录 前言 一、glibc-exit函数浅析 二、FSOP 三、Largebin attack FSOP &#xff08;…

ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列

文章目录 0. 首先聊聊什么是RNN1. 理解LSTM&#xff0c;从数据如何喂给 LSTM开始2. LSTM每个门是如何处理序列数据的&#xff1f;2.1 遗忘门&#xff08;Forget Gate&#xff09;&#xff1a;该忘掉哪些信息&#xff1f;2.2 输入门&#xff08;Input Gate&#xff09;&#xff…

springboot和vue配置https请求

项目场景&#xff1a; 代码发布到线上使用https请求需要配置ssl证书&#xff0c;前后端都需要修改。 问题描述 如图&#xff0c;我们在调用接口时报如下错误&#xff0c;这就是未配置ssl但是用https请求产生的问题。 解决方案&#xff1a; 前端&#xff1a;在vite.config.js文…