? 相关文章
-
?CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用
-
?CANoe DLL编程(二)—— 创建CANoe适用的DLL以及调用
-
?CANoe DLL编程(三)——DLL和回调函数
-
?CANoe DLL编程(四)——SendKey DLL的CANoe应用
-
?CANoe DLL编程(六)—— DLL 的二次封装
-
?本章节内容演示源码下载,点击跳转?
?前言
-
在上一节我们已经理清楚了seedkey的诊断机制,那么这一节我们继续来看下怎么用
Visual Studio生成 seedkey.dll
。
-
软件环境:
win10 x64
visual studio 2019
CANoe 11 x64
文章目录
- ? 相关文章
- ?前言
- ? CANoe官方代码解读
-
- ? 接口函数说明
- ? GenerateKeyEx 接口
- ? GenerateKeyExOpt 接口
- ? 创建自己的SeedKey
- ?总结
? CANoe官方代码解读
? 接口函数说明
1?? 我们知道我们在控制台配置界面加载了SeedKey DLL,控制台就自动计算key值,但是你清楚它的机制吗?
2?? 下面这段截图意思就是 SeedKey DLL 计算key值时会 寻找 下面两个函数接口,GenerateKeyExOpt
和GenerateKeyEx
先找到哪个用哪个。
3?? 我们再打开CANoe官方Demo中提供了两个VS工程,就对应上面的两个函数,工程中使用的seedkey.dll实际上使用的KeyGenDll_GenerateKeyEx
? GenerateKeyEx 接口
4?? 我们用Visual Studio 打开,看下源码很简单,函数里面就几行代码
- 当key的数组大小比seed的小,抛出异常
- 然后把seed 取反之后,作为key值返回
5?? 运行自带的测试工程, 下面是seed key 的trace截图,可以看到算法确实是取反的。
? GenerateKeyExOpt 接口
6?? 我们把VS工程KeyGenDll_GenerateKeyEx
拷贝一份,然后在拷贝的工程中把源代码按照下图把GenerateKeyEx
接口 改成GenerateKeyExOpt
,并添加ipOptions
参数,然后重新生成一个seedkey.dll
- 在这里为了区别,我把生成的dll 改名字成
SeednKey_Opt.dll
7?? 把调用DLL设置成 SeednKey_Opt.dll
,然后保存关闭CANoe,再重启CANoe
- 之所以要关闭重启,因为如果不关闭重启,诊断控制台打印的dll调用路径不变,虽然内部已经变了,为了准确的说明,不产生误解,最好关闭重启。
8?? 然后我们在诊断控制台发送27服务,观察正常解锁。
- 这里我们也可以观察到dll的调用路径,如果不重启CANoe,这里显示的还是上个dll路径,可能是CANoe 11 SP2版本的bug.
? 创建自己的SeedKey
1?? 真正的项目,不同的seed key level 都有不同的复杂的算法,官方工程中,支持 level 1和 level 11 ,我们现在增加一点功能,level 1 ,取反得到key 值 ; level 11 ,+1 得到key值 ,否则,返回报错。
KEYGENALGO_API VKeyGenResultEx GenerateKeyExOpt(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] */const char* ipOptions,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;if (iSecurityLevel == 0x01){
for (unsigned int i = 0; i < iSeedArraySize; i++)ioKeyArray[i] = ~iSeedArray[i];}else if (iSecurityLevel == 0x11){
for (unsigned int i = 0; i < iSeedArraySize; i++)ioKeyArray[i] = iSeedArray[i]+1; }else{
return KGRE_SecurityLevelInvalid;}oSize = iSeedArraySize; return KGRE_Ok;
}
2?? 加载重新生成的DLL,然后测试看下结果。看到 Level 11的算法变了。
End |
?总结
? 有需要演示中所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
- ?要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- ? 有手机的小伙伴可以加下交流群,在车载诊断领域的一个小小圈子,群里有
网盘资料
,源码
,可能有你需要的呢,平时可以交流技术,聊聊工作机会啥的。
- ?如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。