诊断0x27服务解密文件DLL制作与使用

DLL文件在CANoe的使用方法

DLL文件在诊断里面可以用在0x27秘钥服务里面,对解密有帮助,在下图位置加载。

DLL文件制作

vector公司本来就给了我们一个demo,先拷贝一份下来,别把原来的文件给改坏了。我这个是CANoe12,demo代码的路径在C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 12.0.75\CAN\Diagnostics\UDSSystem\SecurityAccess\Sources,大家可以参考下,把里面这个KeyGenDll_GenerateKeyEx文件夹复制一份出来,当然你也可以用KeyGenDll_GenerateKeyExOpt,待会打开源代码看得到是差不多的。

打开Visual Studio 2019,将工程里面的工程文件GenerateKeyExImpl.vcproj拖进去,就能打开工程。展开工程,然后打开源文件GenerateKeyExImpl.cpp。

程序比较简单,还有注释,里面有很多空行,我删了几行放在这里大家看看,这个是工程KeyGenDll_GenerateKeyEx的源代码。

// KeyGeneration.cpp : Defines the entry point for the DLL application.
#include <windows.h>
#include "KeyGenAlgoInterfaceEx.h"BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{return TRUE;
}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];oSize=iSeedArraySize;return KGRE_Ok;
}

这个是KeyGenDll_GenerateKeyExOpt工程的源代码GenerateKeyExOpt.cpp,相对于KeyGenDll_GenerateKeyEx工程就是多了个选项作为入参,高级用法才会用到,我们一般都用不到,所以这里就用KeyGenDll_GenerateKeyEx工程。

//
/// Seed & Key DLL with extended interface and options argument
/// This is an example implementation for CANoe demo configuration "UDSsim"
//#include <windows.h>
#include "GenerateKeyExOpt.h"KEYGENALGO_API VKeyGenResultExOpt GenerateKeyExOpt(const unsigned char*  ipSeedArray,            // 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*           ipVariant,              // Name of the active variant [in]const char*           ipOptions,              // Optional parameter which might be used for OEM specific information [in]unsigned char*        iopKeyArray,            // Array for the key [in, out]unsigned int          iMaxKeyArraySize,       // Maximum length of the array for the key [in]unsigned int&         oActualKeyArraySize)    // Length of the key [out]
{// Check the input argumentsif( iSecurityLevel == 0 || iSecurityLevel > 10)return KGREO_SecurityLevelInvalid;if( iMaxKeyArraySize < iSeedArraySize || 4 > iSeedArraySize)return KGREO_BufferToSmall;if( !ipSeedArray || !iopKeyArray || !ipOptions || strlen( ipOptions) < iSeedArraySize)return KGREO_UnspecifiedError;// Copy the input bytes to the output bytesmemcpy( iopKeyArray, ipSeedArray, iSeedArraySize);// As an example each byte in the options array will be added to each byte of the seed array securityLevel times.for( unsigned int l = 0; l < iSecurityLevel; ++l){for( unsigned int i = 0; i < iSeedArraySize; ++i)iopKeyArray[i] += ipOptions[i];}oActualKeyArraySize = iSeedArraySize;return KGREO_Ok;
}

修改KeyGenDll_GenerateKeyEx工程源代码GenerateKeyExImpl.cpp,里面做了注释。

KEYGENALGO_API VKeyGenResultEx GenerateKeyEx(unsigned char*  iSeedArray,     /* 种子数组 */unsigned int          iSeedArraySize, /* 种子长度 */const unsigned int    iSecurityLevel, /* 秘钥等级(调试打印) */const char*           iVariant,       /* 激活状态(调试打印) */unsigned char*        ioKeyArray,     /* 秘钥数组 */unsigned int          iKeyArraySize,  /* 秘钥长度 */unsigned int&         oSize           /* 秘钥长度(调试打印) */)
{if (iSeedArraySize>iKeyArraySize)//秘钥长度大于种子长度的话就是长度错误return KGRE_BufferToSmall;……(这里是我的算法,计算出来的秘钥放在iSeedArray[]数组)for (int i = 0; i < iKeyArraySize; i++) {ioKeyArray[i] = iSeedArray[i];}oSize = iSeedArraySize;//这个其实没啥用,长度是CDD里面定义的return KGRE_Ok;
}

对着工程右键,重新生成就行,输出信息会告诉你把DLL文件生成到了哪里。

DLL文件检查

如果你很有自信一次写对,那直接在CANoe里面直接加载就行。如果想谨慎点,想要检查写得对不对,就新建个控制台工程来调用DLL文件里面的函数进行验证。

把上面生成的DLL文件拷贝到控制台路径下。

调用代码如下

// CallDLL.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <Windows.h>
#include <tchar.h>using namespace std;
#define iSeedArraySize 16
const unsigned char SeedArray[iSeedArraySize] = {0xD1,0x28,0xD2,0x7B,0x25,0xCE,0x78,0x22,0xCB,0x75,0x1E,0xC8,0x71,0x1B,0xC5,0x6E }; const unsigned int    iSecurityLevel = 1;
const char iVariant = 0;#define iKeyArraySize 16
unsigned char ioKeyArray[iSeedArraySize] = { 0x0 };unsigned int oSize = 0;int main()
{HINSTANCE handle = LoadLibrary(_T("SeednKey.dll"));//加载dll ,需要加上头文件tchar.h并在调用时加上_T 由句柄指向dll文件cout << "Dll Adddr:" << handle << endl;if (handle){typedef int(*GenerateKeyExOpt_API_Type)(const unsigned char*,unsigned int,const unsigned int,const char*,unsigned char*,unsigned int,unsigned int &);GenerateKeyExOpt_API_Type GenerateKeyExOpt_API_Point = (GenerateKeyExOpt_API_Type)GetProcAddress(handle, "GenerateKeyEx"); //GetProcAddress获取dll中的Add_Func函数,用add_API_Point指向函数它cout << "dll 函数的句柄返回值:" << GenerateKeyExOpt_API_Point << endl;//打印dll的函数句柄地址值,不为0就说明调用成功printf("\n");if (GenerateKeyExOpt_API_Point){int result = (*GenerateKeyExOpt_API_Point)(SeedArray,iSeedArraySize, iSecurityLevel,&iVariant, ioKeyArray, iKeyArraySize, oSize);for (int i = 0; i < iSeedArraySize; i++) {/*打印种子*/printf("SeedArray[%d]: %2X\n", i, SeedArray[i]);}printf("\n");for (int j = 0; j < iKeyArraySize; j++) {/*打印秘钥*/printf("ioKeyArray[%d]: %2X\n", j, ioKeyArray[j]);}cout << "oSize = " << oSize << endl;/*调试打印*/FreeLibrary(handle); //释放句柄}}return 0;
}// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu

对一下打印出来的结果,是对的话就是验证通过。

CDD文件配置

0x27服务的长度是在CDD文件里面配置的,单纯改代码是改不动的。

用CANdelaStudio打开CDD文件,勾选这个,把0x27服务带出来。

长度,解密等级都在这里设置。

DLL文件使用

按照本文最上面的使用方法加载进去,双击能发送。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/162478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visio给立方体的每条边填充不同的颜色,超好用的visio小技巧~

Visio给立方体的每条边填充不同的颜色&#xff0c;超好用的visio小技巧~ 如何实现立方体的填充颜色从左边的纯色到右边的多色呢&#xff1f;一起学起来吧~ 在visio中绘制一个普通的立方体&#xff1b; 用一个大的矩形盖住刚才绘制的立方体&#xff1b; 全选之后找到 开发工具-&…

matplotlib

设置中文字体&#xff0c;图片大小&#xff0c;分辨率&#xff0c;中文负号 符号 x轴和y轴 设置x轴和y轴的刻度 字体大小 线条样式 绘制多个线条 图例 显示每个坐标值 gca 分辨率 画布尺寸 创建图形对象 不能直接使用区域对象作画 绘制多子图 均等的划分画布 柱状图 同一位置多…

Python 读取2进制bin文件

pip下载hexdump pip install hexdump读取bin文件 python -m hexdump xxx.bin

HTTP/HTTPS

HTTP/HTTPS 简介 HTTP 协议是 Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写&#xff0c;是用于从万维网&#xff08; WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP 是一个基于 TCP/IP 通信协议来传递数据&a…

最新版车牌号正则效验

支持最新版新能源、各类特种车等车牌号规则效验 private static final Pattern pattern Pattern.compile("^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[a-zA-Z](([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼AB…

类加载过程

Java类加载过程包括加载&#xff08;Loading&#xff09;、验证&#xff08;Verification&#xff09;、准备&#xff08;Preparation&#xff09;、解析&#xff08;Resolution&#xff09;、初始化&#xff08;Initialization&#xff09;五个阶段。这些阶段是按照顺序逐步执…

Javascript中的宏任务与微任务

事件循环 JavaScript 语言的一大特点就是单线程&#xff0c;也就是说&#xff0c;同一个时间只能做一件事。为了协调事件、用户交互、脚本、UI 渲染和网络处理等行为&#xff0c;防止主线程的不阻塞&#xff0c;Event Loop 的方案应用而生。Event Loop 包含两类&#xff1a;一…

购买Zoho CRM系统要花多少钱?

相信对CRM系统有过了解的人都知道&#xff0c;CRM系统的价格取决于功能需求&#xff0c;用户数量&#xff0c;部署方式&#xff0c;定制开发等因素。Zoho CRM是全球领先的云CRM系统&#xff0c;自2005年推出以来&#xff0c;累计服务25万企业&#xff0c;那么Zoho CRM系统的价格…

python批量修改文件夹下的后缀名

python批量修改文件夹下的后缀名 &#xff08;所有的.txt结尾的文件&#xff0c;替换成.py结尾&#xff09; 1、需要将某个文件夹下所有的.txt结尾的文件&#xff0c;替换成.py结尾 2、Python代码&#xff1a; import os# 指定需要更改文件的目录 dir_path D:/study/py/4#…

Vatee万腾数字引领未来:vatee科技力量的独特路径

在当今数字化浪潮的推动下&#xff0c;Vatee万腾以其卓越的科技力量&#xff0c;正引领着未来的数字化时代&#xff0c;描绘着一条独特的发展路径。通过持续创新、前瞻思维和对技术的深度理解&#xff0c;Vatee万腾正在为未来的科技发展创造新的可能性&#xff0c;塑造着数字引…

微信开放平台Android平台应用签名怎么填写

winR 输入cmd 进到本地签名文件的目录下 输入 keytool -list -v -keystore <keystore文件路径> -alias <别名>请将 <keystore文件路径> 替换为您的密钥库文件&#xff08;通常是 .jks 或 .keystore 文件&#xff09;的路径&#xff0c;而 <别名> 则是…

Speaker Verification,声纹验证详解——语音信号处理学习(九)

参考文献&#xff1a; Speaker Verification哔哩哔哩bilibili 2020 年 3月 新番 李宏毅 人类语言处理 独家笔记 声纹识别 - 16 - 知乎 (zhihu.com) (2) Meta Learning – Metric-based (1/3) - YouTube 如何理解等错误率(EER, Equal Error Rate)&#xff1f;请不要只给定义 - 知…

oracle数据库巡检常见脚本-系列二

简介 作为数据库管理员&#xff08;DBA&#xff09;&#xff0c;定期进行数据库的日常巡检是非常重要的。以下是一些原因&#xff1a; 保证系统的稳定性&#xff1a;通过定期巡检&#xff0c;DBA可以发现并及时解决可能导致系统不稳定的问题&#xff0c;如性能瓶颈、资源利用率…

libcurl curlcode 35问题解决

libcurl code 35 定义&#xff1a; SSL CONNECT ERROR 我这里问题情况会出现以下两种 SSL证书认证&#xff0c;可以添加相应的头取消或是添加验证 curl_easy_setopt(curl, CURLOPT_URL, combinePath.c_str());curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);curl_easy_setop…

人工智能:让生活更便捷、更智能——探讨人工智能在生活中的作用与挑战

文章目录 前言人工智能的定义与分类人工智能的领域一、智能语音助手改变日常生活二、智能驾驶带来出行革命三、人工智能在医疗健康领域的应用四、教育领域的人工智能创新 人工智能的应用生活方面的影响工作方面的影响 应对AI带来的挑战后记 前言 人工智能相关的领域&#xff0…

Python基于机器学习模型LightGBM进行水电站流量入库预测项目源码+数据集+模型,含项目报告

1.前言 该文档主要是介绍通过机器学习模型LightGBM进行水电站流量入库预测。 对于水电站来说&#xff0c;发电是主要经济效益来源&#xff0c;而水就是生产的原料。对进入水电站水库的入库流量进行精准预测&#xff0c;能够帮助水电站对防洪、发电计划调度工作进行合理安排&…

java常见数值类型取值范围/ int short long BigInteger取值范围

文章目录 一、各类型取值范围 一、各类型取值范围 以下整理java中常用的数值类型取值范围。 类型字节大小最小值最大值取值范围byte8bit-128127-128到127short16bit-2 15 ^{15} 152 15 ^{15} 15-1-32768-32767int32bit-2 31 ^{31} 312 31 ^{31} 31 -1-2,147,483,648 到 2,147…

女娃娃就要打扮,就要时刻保持美丽

超足充绒量&#xff0c;细腻柔软 上身效果很棒保暖性也很强 无论是日常出行还是户外活动 穿这件羽绒服都妥妥的 简约时尚的色彩搭配 使它在寒冷的冬季 既能保暖又能展现个人品味哦&#xff01;

家电回收小程序,省心省力的好帮手

随着科技的不断进步和人们生活水平的提高&#xff0c;家用电器已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着时间的推移&#xff0c;一些家电产品逐渐被淘汰或闲置下来。那么&#xff0c;如何处理这些闲置家电呢&#xff1f; 此时&#xff0c;一款家电回收小程…

创建vue项目体验

文章目录 使用vue-cli创建vue项目创建出的项目目录结构配置router 运行问题router未找到eslint报错 首页显示单页面内容替换 使用vue-cli创建vue项目 安装vue-cli&#xff0c;创建基本项目 选择步骤 一般创建成功后&#xff0c;提示使用下面的指令运行demo npm run serve创建…