赞
踩
目录
1 如何在CanOe / Canalyzer中加载“DLL动态链接库文件”
2.2 使用Visual Studio打开“DLL动态链接库文件”的DEMO
案例背景:
在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”整个过程。
在CanOe / Canalyzer中,完成加载诊断描述文件(CDD,PDX,Arxml…)后,菜单栏依次选择Diagnostics -- > Diagnostic/ISO TP,在弹出的Diagnostic/ISO TP Configuration对话框中,选择对应CAN通道诊断描述文件中的Diagnostic Layer,在子页中找到Seed & Key DLL,加载DLL文件的存放路径。
无论是CanOe还是Canalyzer,在其安装路径下都会有下图这样的文件夹KeyGenDll_GenerateKeyEx和KeyGenDll_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
下面以文件夹KeyGenDll_GenerateKeyEx为例。双击打开GenerateKeyExImpl.vcproj文件(须确保电脑已经安装Visual Studio)。
使用Visual Studio打开该工程后,在右侧的“解决方案资源管理器”中,依次选择GenerateKeyExImpl -- > Source Files -- > GenerateKeyExImpl.cpp,接着在左侧你会看到被打开的GenerateKeyExImpl.cpp文件,在其中你会看到一个API GenerateKeyEx接口,在该API接口中完成“27服务各security level安全等级解锁算法”即可。
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密钥并发送至控制单元。
假设: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;
- }
GenerateKeyExImpl.cpp文件编辑完成后,在右侧的“解决方案资源管理器”选中GenerateKeyExImpl,并鼠标右键,在其上下文中,单击生成。
在DEMO工程的路径下的Debug文件夹中,你会看到生成的SeednKey.dll文件。
将该SeednKey.dll文件加载到CanOe / Canalyzer中。
获取更多“汽车电子资讯”和“工具链使用”
请关注CSDN博客“汽车电子助手”,做您的好助手。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。