自学内容网 自学内容网

CANdela/Diva系列8--如何生成0x27服务解锁的DLL

本系列的上一篇文章中,我们介绍了如何在CDD文件中去根据客户需求来配置诊断服务,其实每个诊断服务的配置方式都是大同小异,但是0x27服务略有不同,为了能够让CDD文件根据ECU返回的种子去自动计算出密钥,需要添加一个解锁相关的DLL文件,这篇文章就给大家介绍一下解锁的DLL是怎么生成的,Let's Go!!!

目录

1. 获取Security算法编辑工程:

2. 编辑算法:

2.1 更新解锁函数:

2.2 编译DLL:

后言:


1. 获取Security算法编辑工程:

如果你安装了CANDiva的安装包,那么你可以通过如下的路径来获取:"C:\Users\Public\Documents\Vector\CANoe.DiVa\15.0\SeedKey"

如果你没有安装过CANDiva,也可以通过如下的路径来获取:"C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 11.0.81\CAN\Diagnostics\UDSSystem\SecurityAccess\Sources"

然后将上述的文件夹copy出来,放到你的工作目录,然后再用Visual Studio来打开这个工程。

注意:KeyGenDll_GenerateKeyEx 和 KeyGenDll_GenerateKeyExOpt 两个工程都可以用来制作dll文件,分别提供 GenerateKeyEx 和 GenerateKeyExOpt 接口。其中 GenerateKeyExOpt 多一个传入参数,普通应用并不需要。

2. 编辑算法:

打开工程后如下所示:

2.1 更新解锁函数:

我们需要做的只是根据解锁算法的文档来更新解锁函数,如下例所示:

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] */
      )
{
    unsigned long key32 = 0x0;
    key32 = ((iSeedArray[0] * 0x1000000) | (iSeedArray[1] * 0x10000) | (iSeedArray[2] * 0x100) | iSeedArray[3]);
    key32 = ~key32 + 0x47414549;
    ioKeyArray[0] = (key32 & 0xFF000000) >> 24;
    ioKeyArray[1] = (key32 & 0x00FF0000) >> 16;
    ioKeyArray[2] = (key32 & 0x0000FF00) >> 8;
    ioKeyArray[3] = key32 & 0x000000FF;
    iKeyArraySize = 4;
    oSize = 4;

    return KGRE_Ok;
}

上述代码中的定义变量含义如下所示:

  • iSeedArray: ECU返回的种子数组
  • iSeedArraySize:ECU返回的种子数组最大长度
  • iSecurityLevel:要解锁的级别(01、03、05、11等)
  • iVariant:ECU变体限定符
  • ioKeyArray:Tester返回计算出的密钥
  • iKeyArraySize:Tester返回计算出的密钥最大长度
  • oSize:计算出密钥的字节数(这个密钥的字节数一定要与实际需求的密钥的字节数长度保持一致,不然解锁自动发送出去的密钥会根据oSize的值来发送密钥长度

2.2 编译DLL:

编辑完解锁函数后,我们要开始编译DLL了:

首先在配置中选择“Debug”,"x86", 然后在右侧的工程名出右击,选择“Build”,最后在Output窗口检测编译结果:

“1 succeeded”表示编译成功,最后我们可以在工程目录下的“Debug”文件夹中找到生成的DLL文件了:

这样我们就有解锁算法的DLL可以使用了。

通过前面的介绍和本篇文章的介绍,我们的CDD文件就准备完毕了,接下来就要开始在CANoe工程中添加CDD文件,开始应用CDD了。敬请期待!!!

后言:

本人有CANdelaStudio Admin的license,最高支持CANdela V15的版本,支持CDD文件的定制化服务!!!


原文地址:https://blog.csdn.net/qq_41602272/article/details/141937362

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!