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

📙 相关文章

在这里插入图片描述


📘前言

  • 在上一节我们已经理清楚了seedkey的诊断机制,那么这一节我们继续来看下怎么用Visual Studio生成 seedkey.dll

  • 软件环境:
    win10 x64
    visual studio 2019
    CANoe 11 x64

请添加图片描述

请添加图片描述

📙 CANoe官方代码解读

🍅 接口函数说明

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

在这里插入图片描述


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

在这里插入图片描述


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

🌎总结

23

请添加图片描述

🍅 有需要演示中所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
7

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

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

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚂蚁小兵

慢慢长夜磨一章好文章,费烟!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值