当前位置: 代码迷 >> 综合 >> CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll
  详细解决方案

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll

热度:95   发布时间:2023-09-20 13:12:34.0

? 相关文章

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll

  • ?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 DLL编程(五)——通过Visual Studio生成 SendKey.dll

文章目录

  • ? 相关文章
  • ?前言
  • ? CANoe官方代码解读
    • ? 接口函数说明
    • ? GenerateKeyEx 接口
    • ? GenerateKeyExOpt 接口
  • ? 创建自己的SeedKey
  • ?总结

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll

? CANoe官方代码解读

? 接口函数说明

1?? 我们知道我们在控制台配置界面加载了SeedKey DLL,控制台就自动计算key值,但是你清楚它的机制吗?

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll


2?? 下面这段截图意思就是 SeedKey DLL 计算key值时会 寻找 下面两个函数接口,GenerateKeyExOptGenerateKeyEx 先找到哪个用哪个。

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll


3?? 我们再打开CANoe官方Demo中提供了两个VS工程,就对应上面的两个函数,工程中使用的seedkey.dll实际上使用的KeyGenDll_GenerateKeyEx

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll


? GenerateKeyEx 接口

4?? 我们用Visual Studio 打开,看下源码很简单,函数里面就几行代码

  • 当key的数组大小比seed的小,抛出异常
  • 然后把seed 取反之后,作为key值返回

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll


5?? 运行自带的测试工程, 下面是seed key 的trace截图,可以看到算法确实是取反的。

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll


? GenerateKeyExOpt 接口

6?? 我们把VS工程KeyGenDll_GenerateKeyEx拷贝一份,然后在拷贝的工程中把源代码按照下图把GenerateKeyEx接口 改成GenerateKeyExOpt ,并添加ipOptions参数,然后重新生成一个seedkey.dll

  • 在这里为了区别,我把生成的dll 改名字成 SeednKey_Opt.dll

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll


CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll


7?? 把调用DLL设置成 SeednKey_Opt.dll,然后保存关闭CANoe,再重启CANoe

  • 之所以要关闭重启,因为如果不关闭重启,诊断控制台打印的dll调用路径不变,虽然内部已经变了,为了准确的说明,不产生误解,最好关闭重启。

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll


8?? 然后我们在诊断控制台发送27服务,观察正常解锁。

  • 这里我们也可以观察到dll的调用路径,如果不重启CANoe,这里显示的还是上个dll路径,可能是CANoe 11 SP2版本的bug.

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll


? 创建自己的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的算法变了。

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll

End

?总结

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll

CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll

? 有需要演示中所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll

  • ?要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • ? 有手机的小伙伴可以加下交流群,在车载诊断领域的一个小小圈子,群里有网盘资料源码,可能有你需要的呢,平时可以交流技术,聊聊工作机会啥的。

  • ?如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    CANoe DLL编程(五)——通过Visual Studio生成 SendKey.dll
  相关解决方案