Canoe/Canalyzer中加载DLL文件“自动“解锁UDS诊断27服务

点击返回「《UDS/OBD诊断需求编辑工具》总目录」

目录

1 如何在CanOe / Canalyzer中加载“DLL动态链接库文件”

2 如何制作该“DLL动态链接库文件”

2.1 如何获取“DLL动态链接库文件”的DEMO

2.2 使用Visual Studio打开“DLL动态链接库文件”的DEMO

2.2.1 API接口参数说明

2.2.2 举例:27服务解锁算法

2.2.3 生成DLL文件

结尾


案例背景

在CanOe / Canalyzer中加载诊断描述文件(CDD,PDX,Arxml…)时,Diagnotic Console窗口中,您可以看到这个诊断描述文件对应variant变体所支持的Service服务列表。在其中我们选中一个Service服务的Subfuncton/DID/RID…,并双击,或者选中一个Service服务的Subfuncton/DID/RID…,并单击Execute,即可通过CanOe / Canalyzer向下位机发送该UDS diagnostic request诊断请求

在请求某些UDS服务(如2E服务写DID…)前,需要先进行27服务对应security level安全等级解锁,Diagnotic Console窗口可以手动输入Key密钥进行解锁,如果解锁算法非常复杂,使用起来会非常的不便。

幸运的是:CanOe / Canalyzer提供加载DLL动态链接库文件,该DLL文件中集成了27服务security level安全等级解锁算法,自动完成“通过Seed计算得到Key”整个过程。

1 如何在CanOe / Canalyzer中加载“DLL动态链接库文件”

在CanOe / Canalyzer中,完成加载诊断描述文件(CDD,PDX,Arxml…)后,菜单栏依次选择Diagnostics -- > Diagnostic/ISO TP,在弹出的Diagnostic/ISO TP Configuration对话框中,选择对应CAN通道诊断描述文件中的Diagnostic Layer,在子页中找到Seed & Key DLL,加载DLL文件的存放路径。

2 如何制作该“DLL动态链接库文件”

2.1 如何获取“DLL动态链接库文件”的DEMO

无论是CanOe还是Canalyzer,在其安装路径下都会有下图这样的文件夹KeyGenDll_GenerateKeyExKeyGenDll_GenerateKeyExOpt,这就是制作该DLL文件的DEMO。

Canoe 11的路径:

Vector CANoe 11.0\Sample Configurations 11.0.55\CAN\Diagnostics\UDSSystem\SecurityAccess\Sources

Canalzyer 12的路径:

Diagnostics\UDSSystem\SecurityAccess\Sources

2.2 使用Visual Studio打开“DLL动态链接库文件”的DEMO

下面以文件夹KeyGenDll_GenerateKeyEx为例。双击打开GenerateKeyExImpl.vcproj文件(须确保电脑已经安装Visual Studio)。

使用Visual Studio打开该工程后,在右侧的“解决方案资源管理器”中,依次选择GenerateKeyExImpl -- > Source Files -- > GenerateKeyExImpl.cpp,接着在左侧你会看到被打开的GenerateKeyExImpl.cpp文件,在其中你会看到一个API GenerateKeyEx接口,在该API接口中完成“27服务各security level安全等级解锁算法”即可。

2.2.1 API接口参数说明

iSeedArray:表示接收到的27服务奇数subfunction中的Seed种子字节值“数组”;

iSeedArraySize:表示接收到的27服务奇数subfunction中的Seed种子长度;

iSecurityLevel:表示接收到的27服务Security Level安全等级;

iVariant:表示CanOe / Canalyzer中加载的诊断描述文件“当前使用的变体”;

ioKeyArray:表示27服务偶数subfunction中发送的Key密钥字节值“数组”;

iKeyArraySize:表示27服务偶数subfunction中的发送的Key密钥长度;

oSize:表示输出Key密钥长度,通常让oSize=iSeedArraySize;。

Key密钥通常按照以下方案在Tester中计算:

1)通过diagnostic request诊断请求从控制单元获取Seed种子

2)根据步骤 1 收到的Seed种子 (iSeedArray) 计算Key密钥 (ioKeyArray)。

为此,必须指定要生成Key密钥的控制单元的variant变体 (iVariant) 和security level安全等级 (iSecurityLevel)。可在diagnostic configuration dialog中配置用于计算的独立于manufacturer-dependent的 SeedKey-DLL 名称。

示例:

下面的 API 显示了计算Key密钥的函数的可能实现示例。API 因 OEM 而异。其他 API 的使用示例可在UDS Diagnostic System Configuration中找到。

KEYGENALGO_API VKeyGenResultEx GenerateKeyEx(const unsigned char* iSeedArray, unsigned int iSeedArraySize, const unsigned int iSecurityLevel, const char* iVariant, unsigned char* ioKeyArray, unsigned int iKeyArraySize, unsigned int& oSize)

3)在相应的diagnostic request诊断请求中设置步骤 2 计算出的Key密钥并发送至控制单元。

2.2.2 举例:27服务解锁算法

假设:Seed的长度为4,Key的长度也是4。Key = Seed + 123456。我们可以这样改写该API GenerateKeyEx接口。

KEYGENALGO_API VKeyGenResultEx GenerateKeyEx(const unsigned char*  iSeedArray,     /* Array for the seed [in] */unsigned int          iSeedArraySize, /* Length of the array for the seed [in] */const unsigned int    iSecurityLevel, /* Security level [in] */const char*           iVariant,       /* Name of the active variant [in] */unsigned char*        ioKeyArray,     /* Array for the key [in, out] */unsigned int          iKeyArraySize,  /* Maximum length of the array for the key [in] */unsigned int&         oSize           /* Length of the key [out] */)
{if (iSeedArraySize>iKeyArraySize)return KGRE_BufferToSmall;// for (unsigned int i=0;i<iSeedArraySize;i++)//  ioKeyArray[i]=~iSeedArray[i];unsigned int seed = 0;unsigned int key = 0;seed = ((iSeedArray[0] << 24) & 0xFF000000);seed |= ((iSeedArray[1] << 16) & 0x00FF0000);seed |= ((iSeedArray[2] << 8) & 0x0000FF00);seed |= ((iSeedArray[3] << 0) & 0x000000FF);key = seed + 123456;ioKeyArray[0] = ((key >> 24) & 0x000000FF);ioKeyArray[1] = ((key >> 16) & 0x000000FF);ioKeyArray[2] = ((key >> 8) & 0x000000FF);ioKeyArray[3] = ((key >> 0) & 0x000000FF);oSize = iSeedArraySize;return KGRE_Ok;
}

2.2.3 生成DLL文件

GenerateKeyExImpl.cpp文件编辑完成后,在右侧的“解决方案资源管理器”选中GenerateKeyExImpl,并鼠标右键,在其上下文中,单击生成。

在DEMO工程的路径下的Debug文件夹中,你会看到生成的SeednKey.dll文件。

将该SeednKey.dll文件加载到CanOe / Canalyzer中。

结尾

获取更多“汽车电子资讯”和“工具链使用”

请关注CSDN博客“汽车电子助手”,做您的好助手。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-1486. 数组异或操作【位运算 数学】

LeetCode-1486. 数组异或操作【位运算 数学】 题目描述&#xff1a;解题思路一&#xff1a;暴力很简单。解题思路二&#xff1a;优化&#xff01;时间复杂度&#xff1a;O(1)。注释丰富&#xff0c;明了。解题思路三&#xff1a;精简版&#xff01; 题目描述&#xff1a; 给你…

ArcGIS如何计算地级市间的距离

一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析工具→邻域分析→生成临近表。 计算一个或多个要素类或图层中的要素间距离和其他邻…

与队列和栈相关的【OJ题】

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 目录 一、用队列实现栈&#xff1a; 1、2个队列的关联起来怎么由先进先出转变为先进后出&#xff1a;&#xff08;核心&#xff09; 2、认识各个函数干嘛用的&#xff1a; …

Android 如何启用user版本的adb源码分析

通过adb shell中执行getprop persist.sys.usb.config&#xff0c;可以看到系统usb的相关选项&#xff0c;persist.sys.usb.config显示的就是当前系统关于usb选项的系统配置【RK3188Android4.4刚移植的例子】: 全编脚本中make命令会调用build/core/main.mk,在里面可以看到一段…

四足机器人摆线规划程序

一、标准摆线公式 { x r ∗ ( θ − sin ⁡ ( θ ) ) y r ∗ ( 1 − cos ⁡ ( θ ) ) \left\{\begin{array}{l} xr *(\theta-\sin (\theta)) \\ yr *(1-\cos (\theta)) \end{array}\right. {xr∗(θ−sin(θ))yr∗(1−cos(θ))​ 这里的r表示摆线的圆的半径&#xff0c; θ \…

nmap使用教程

nmap使用教程 一、nmap简介二、nmap常用命令2.1、target specification&#xff08;目标规范&#xff09;2.1.1、用法2.1.2、详情 2.2、HOST DISCOVERY&#xff08;主机发现&#xff09;2.2.1、用法2.2.2、详情 2.3、SCAN TECHNIQUES&#xff08;扫描技术&#xff09;2.4、PORT…

【全开源】酷柚易汛ERP 源码部署/售后更新/上线维护

一款基于FastAdminThinkPHPLayui开发的ERP管理系统&#xff0c;帮助中小企业实现ERP管理规范化&#xff0c;此系统能为你解决五大方面的经营问题&#xff1a;1.采购管理 2.销售管理 3.仓库管理 4.资金管理 5.生产管理&#xff0c;适用于&#xff1a;服装鞋帽、化妆品、机械机电…

JINGWHALE 量子能量意识进化理论 —— 全息世界

JINGWHALE 对此论文相关未知以及已知概念、定理、公式、图片等内容的感悟、分析、创新、创造等拥有作品著作权。未经 JINGWHALE 授权&#xff0c;禁止转载与商业使用。 人类对于自身的来源充满了好奇心和求知欲望&#xff0c;探索人类起源是人类科学研究和探索的重要领域之一。…

FMEA助力医疗设备研发制造:领跑未来,实现弯道超车!

医疗设备作为保障人类健康的重要工具&#xff0c;其研发与制造水平直接关系到医疗技术的进步。然而&#xff0c;在激烈的市场竞争中&#xff0c;如何能够让自家医疗设备研发制造实现弯道超车&#xff0c;成为行业佼佼者&#xff1f;答案就在于——FMEA&#xff08;失效模式与影…

uniapp 版本检查更新

总体来说uniapp的跨平台还是很不错的&#xff0c;虽然里面各种坑要去踩&#xff0c;但是踩坑也是开发人员的必修课和成长路。 这不&#xff0c;今天就来研究了一下版本检查更新就踩到坑了。。。先来看看检查更新及下载、安装的实现。 先来看看页面&#xff1a; 从左到右依次为…

JAVA排序相关习题7

1.插入排序 1.1 基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 /*** 时间复杂度&…

JAVA 项目<果园之窗>_完结

目录 1、前言&#xff1a;2、视频展示&#xff1a;3、环境配置&#xff1a;4、工程代码&#xff1a;5、原理&#xff1a;6、原理补充&#xff1a;7、综上&#xff1a; 1、前言&#xff1a; 因为没有足够的时间这个项目用的是别人搭好的框架&#xff0c;在此基础上做调整并根据前…