#c #arrays #c #dllimport #unsigned-char
#c #массивы #c #dllimport #unsigned-char
Вопрос:
У меня есть сторонний x.dll и функция экспорта, которая называется «GenerateKeyEx-в C». У меня нет никакой дополнительной информации, такой как .lib, заголовок и т.д. Я нашел параметры функции из x.dll поставщик, и они уже добавлены в код.
Здесь вы можете увидеть определения параметров;
> [in] ipSeedArray: the seed queried by the ECU (as byte raw data)
> [in] iSeedArraySize: The size of the array
> [in] iSecurityLevel: the security level to be change to
> [in] ipVariant: the ECU variant’s qualifier
> [out] iopKeyArray: the calculated key on return (as byte raw data)
> [in] iMaxKeyArraySize: maximum number of key bytes available
> [out] oActualKeyArraySize: the number of key bytes calculated
Я могу получить доступ и запустить функцию «GenerateKeyEx» без каких-либо ошибок. Функции всегда возвращают 4, что является неопределенной ошибкой для функции. Я думаю, что я не могу передать значения массива (или правильно инициализировать массивы) между функцией main и dll. const unsigned char* ipSeedArray и unsigned char* iopKeyArray указаны как байты необработанных данных (выше), и я неправильно определил массивы для передачи необработанных байтовых данных через unsigned char * ?
//__stdcall replaced //__cdecl *f_GenerateKey
typedef int(*f_GenerateKey)(const unsigned char* ipSeedArray,unsigned int iSeedArraySize,const unsigned int iSecurityLevel,
const char* ipVariant,unsigned char* iopKeyArray,unsigned int iMaxKeyArraySize,unsigned intamp; oActualKeyArraySize);
int main()
{
HINSTANCE hGetProcIDDLL = LoadLibrary(L"C:\Users\thego\source\repos\ConsoleApplication1cp\ConsoleApplication1cp\Debug\SeednKey.dll");
if (!hGetProcIDDLL) {
std::cout << "could not load the dynamic library" << std::endl;
return EXIT_FAILURE;
}
// resolve function address here
f_GenerateKey GenerateKey = (f_GenerateKey)GetProcAddress(hGetProcIDDLL, "GenerateKeyEx");
if (!GenerateKey) {
std::cout << "could not locate the function" << std::endl;
return EXIT_FAILURE;
}
const int sb = 4; const int kb = 100;
const BYTE seedbuffer[sb] = { 0x0B,0xCF,0xFE,0x10 }; //function in
unsigned int seedbufferSize = sizeof(seedbuffer) / sizeof(seedbuffer[0]); //function in
const unsigned int SecurityLevel = 0x01; //function in
const char Variant[1] = { '0' }; //function in
BYTE keybuffer[kb]; //function out
for (int i = 0; i < kb; i) keybuffer[i] = 0x00;
unsigned int MaxKeykeybuffer = sizeof(keybuffer) / sizeof(keybuffer[0]); //function in
unsigned int oSize; //function out
int x = GenerateKey(seedbuffer, seedbufferSize, SecurityLevel, Variant, keybuffer, MaxKeykeybuffer, oSize);
return 0;
}
Комментарии:
1. Если показанные «определения параметров» — это все, что вам предоставляет поставщик DLL, то либо их следует удалить как поставщиков, либо их нужно заставить предоставлять фактические объявления функций с точными типами, а также коды возврата «ошибка».
2. Вы правы 🙂 Каков наилучший способ передачи байтовых необработанных данных в функцию и из нее через unsigned char * параметры?
3. Я использую dll, которая содержит функцию GenerateKeyEx, и у нее разные параметры. Я также проверил это через средство просмотра dll. Вы можете найти определение функции здесь ссылка @Hans Passant
4. Почему вы не получаете файл заголовка? Вы занимаетесь обратным проектированием? И если да, то разве этот вопрос не является просто догадкой?
Ответ №1:
Здесь:
GenerateKey(seedbuffer, SeedArraySize, ...
вы используете seedbuffer
, в то время как (я предполагаю) вам нужно SeedArray
.
Суть в том, что вы передаете массив из 4 байт и сообщаете им, что их 9.
Комментарии:
1. Я обновил код, извините за ненужную часть. SeedArray не использовался при вызове функции.
2. @Katsazuka Я нашел код, который подозрительно похож на вашу DLL, о которой идет речь: github.com/skysky97/seed_to_key/blob/master/algorithm/… Он всегда возвращается
0
. У вас есть этот комментарий в вашем коде://__stdcall replaced //__cdecl *f_GenerateKey
— вы не уверены, что такое соглашение о вызовах?3. @Katsazuka — к вашему сведению: ваш код отлично работает с этой DLL в моем предыдущем комментарии ^^
4. Я проверил код, который вы отправили выше. Я могу вызвать функцию в этом коде и создать ключ без каких-либо проблем с точно такими же параметрами, которые я использовал для функции dll. Вот почему я не мог понять проблему функции dll.