udf для firebird
Добавлено: 14 ноя 2012, 20:18
Доброе время суток. Необходимо подключить udf к серверу firebird. Код UDF:
Вот так подключаю ее в firebird
При использовании выдает следующую ошибку:
Invalid token.
invalid request BLR at offset 63.
function CALC_HASH is not defined.
module name or entrypoint could not be found.
Как исправить? Если открыть в IDA экспорт dll, есть две функции
calc_hash 1001114F 1
DllEntryPoint 100110FA
Пробовала делать так:
такая же ошибка...
dll лежит в папке UDF сервера Firebird, где и должна лежать
Код: Выделить всё
#include "stdafx.h"
#include "openssl/des.h"
#include "windows.h"
#include "string"
#include "stdio.h"
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT char* calc_hash(char* u, char* p);
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
EXPORT char* calc_hash(char* u, char* p) //генерация хеша(имя пользователя,пароль)
{
//описание переменных и их инициализация
unsigned char des_key[]={ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};
char username [32];
char password [32];
unsigned char hash[8];
strcpy (username, u);
strcpy (password, p);
char encrypt[256];
char temp[256];
DES_cblock iv,iv2;
DES_key_schedule ks1, ks2;
int len=0;
int j,user_len,password_len;
memset (encrypt,0,sizeof(encrypt));
user_len = strlen(username);
password_len = strlen(password);
memset (iv,0,8);
memset (iv2,0,8);
//аутентификация
strupr (username);
strupr (password);
//расширение
for (len=1,j=0; j<user_len; len++,j++)
{
encrypt[len] = username[j];
len++;
}
for (j=0; j<password_len; len++,j++)
{
encrypt[len] = password[j];
len++;
}
len=len-1;
//первый шаг
DES_set_key((DES_cblock*) des_key, &ks1);
DES_ncbc_encrypt((unsigned char*) encrypt, (unsigned char*) temp, len, &ks1, &iv, DES_ENCRYPT);
//второй шаг
DES_set_key((DES_cblock*) &iv, &ks2);
DES_ncbc_encrypt((unsigned char*) encrypt, (unsigned char*) temp, len, &ks2, &iv2, DES_ENCRYPT);
memcpy (hash,iv2,8);
//результирующее преобразование
char tmp[3]="";
tmp[2] = '\0';
char temp_str[17]="";
temp_str[16]='\0';
for(int i=0;i<8;i++)
{
sprintf(tmp,"%2.X",hash[i]);
strcat(temp_str,tmp);
}
return temp_str;
}
Код: Выделить всё
DECLARE EXTERNAL FUNCTION calc_hash
CSTRING(256),
CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT 'calc_hash' MODULE_NAME 'generate_hash'
Invalid token.
invalid request BLR at offset 63.
function CALC_HASH is not defined.
module name or entrypoint could not be found.
Как исправить? Если открыть в IDA экспорт dll, есть две функции
calc_hash 1001114F 1
DllEntryPoint 100110FA
Пробовала делать так:
Код: Выделить всё
DECLARE EXTERNAL FUNCTION calc_hash
CSTRING(256),
CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT 'DllEntryPoint' MODULE_NAME 'generate_hash'
dll лежит в папке UDF сервера Firebird, где и должна лежать