问题描述
我想自动化一些需要安全解锁的 WDBI 服务。 我有一个可以从 CANoe 调用的 dll,但我不想使用独木舟硬件,我也不知道 dll 中的函数调用。 有什么办法可以从python程序中调用dll来执行会话解锁吗?
解决方法
有了 DLL,您可以使用 DependencyWalker 之类的工具查看 DLL 的导出符号。但是,如果您已经知道您的 DLL 在 CANoe 中工作,它将遵循指定的 API by Vector Informatik 在 CANoe 的安全访问 DLL 中实现:GenerateKeyEx 和 GenerateKeyExOpt。
GenerateKeyEx:
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,const char* ipOptions,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