診斷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.pswp.cn/news/162478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162478.shtml
英文地址,請注明出處:http://en.pswp.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創建…