如何使用来自 python 程序的安全 dll 执行 UDS 会话解锁?
How to perform UDS session unlock using security dll from python program?
我想自动化一些需要安全解锁的 WDBI 服务。
我有一个可以从 CANoe 调用的 dll,但我不想使用独木舟硬件,我也不知道 dll 中的函数调用。
有什么方法可以从 python 程序调用 dll 来执行会话解锁?
有了 DLL,您可以使用 DependencyWalker to see the exported symbols of the DLL. But if you already know that your DLL works in CANoe, it will follow the APIs specified by Vector Informatik 之类的工具在 CANoe 的安全访问 DLL 中实现:GenerateKeyEx 和 GenerateKeyExOpt。
生成密钥Ex:
int VKeyGenResult ExGenerateKeyEx (
const unsigned char* ipSeedArray,
unsigned int iSeedArraySize,
const unsigned int iSecurityLevel,
const char* ipVariant,
unsigned char* iopKeyArray,
unsigned int iMaxKeyArraySize,
unsigned int& oActualKeyArraySize );
GenerateKeyExOpt:
VKeyGenResult ExOptGenerateKeyExOpt (
const unsigned char* ipSeedArray,
unsigned int iSeedArraySize,
const unsigned int iSecurityLevel,
const char* ipVariant,
const char* ipOptions,
unsigned char* iopKeyArray,
unsigned int iMaxKeyArraySize,
unsigned int& oActualKeyArraySize );
那么只需从 python 调用此 Dll,即使用 ctypes。
import ctypes
mylib = ctypes.WinDLL("./GenerateKeyExImpl.dll")
seed = (ctypes.c_byte * 4)(0xff, 0xfe, 0xfd, 0xfc) # these bytes you should get from the ECU i.e.
# Tx 27 01
# Rx 67 01 ff fe fd fc
key = (ctypes.c_byte * 4)() # this will contain the secret key after Dll call
keylength = ctypes.c_int(4) # this will contain the secret key length after Dll call
mylib.ExGenerateKeyEx(
ctypes.pointer(seed), # Seed from the ECU
ctypes.c_int(4), # Example: Seed length = 4 bytes
ctypes.c_int(1), # Example: Security Level 1
POINTER(c_int)(), # Example: NULL = No variant string
ctypes.pointer(key), # Key to send back to the ECU
ctypes.c_int(4), # Example: Key Max length = 4 bytes
ctypes.pointer(keylength), # Example: Seed length = 4 bytes
)
# TODO: Send "key" back to the ECU i.e.
# Tx 27 02 XX XX XX XX
# Rx 67 02
我想自动化一些需要安全解锁的 WDBI 服务。 我有一个可以从 CANoe 调用的 dll,但我不想使用独木舟硬件,我也不知道 dll 中的函数调用。 有什么方法可以从 python 程序调用 dll 来执行会话解锁?
有了 DLL,您可以使用 DependencyWalker to see the exported symbols of the DLL. But if you already know that your DLL works in CANoe, it will follow the APIs specified by Vector Informatik 之类的工具在 CANoe 的安全访问 DLL 中实现:GenerateKeyEx 和 GenerateKeyExOpt。
生成密钥Ex:
int VKeyGenResult ExGenerateKeyEx (
const unsigned char* ipSeedArray,
unsigned int iSeedArraySize,
const unsigned int iSecurityLevel,
const char* ipVariant,
unsigned char* iopKeyArray,
unsigned int iMaxKeyArraySize,
unsigned int& oActualKeyArraySize );
GenerateKeyExOpt:
VKeyGenResult ExOptGenerateKeyExOpt (
const unsigned char* ipSeedArray,
unsigned int iSeedArraySize,
const unsigned int iSecurityLevel,
const char* ipVariant,
const char* ipOptions,
unsigned char* iopKeyArray,
unsigned int iMaxKeyArraySize,
unsigned int& oActualKeyArraySize );
那么只需从 python 调用此 Dll,即使用 ctypes。
import ctypes
mylib = ctypes.WinDLL("./GenerateKeyExImpl.dll")
seed = (ctypes.c_byte * 4)(0xff, 0xfe, 0xfd, 0xfc) # these bytes you should get from the ECU i.e.
# Tx 27 01
# Rx 67 01 ff fe fd fc
key = (ctypes.c_byte * 4)() # this will contain the secret key after Dll call
keylength = ctypes.c_int(4) # this will contain the secret key length after Dll call
mylib.ExGenerateKeyEx(
ctypes.pointer(seed), # Seed from the ECU
ctypes.c_int(4), # Example: Seed length = 4 bytes
ctypes.c_int(1), # Example: Security Level 1
POINTER(c_int)(), # Example: NULL = No variant string
ctypes.pointer(key), # Key to send back to the ECU
ctypes.c_int(4), # Example: Key Max length = 4 bytes
ctypes.pointer(keylength), # Example: Seed length = 4 bytes
)
# TODO: Send "key" back to the ECU i.e.
# Tx 27 02 XX XX XX XX
# Rx 67 02