udf для firebird

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
sparky
Сообщения: 4
Зарегистрирован: 09 ноя 2012, 20:08

udf для firebird

Сообщение sparky » 14 ноя 2012, 20:18

Доброе время суток. Необходимо подключить udf к серверу firebird. Код UDF:

Код: Выделить всё

#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;
}
Вот так подключаю ее в firebird

Код: Выделить всё

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, где и должна лежать

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: udf для firebird

Сообщение hvlad » 15 ноя 2012, 14:17

Эта длл зависит от других ? Они доступны процессу FB ?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: udf для firebird

Сообщение Dimitry Sibiryakov » 15 ноя 2012, 15:36

Аффтарше ещё повезло, что функция не вызвалась. Возвращать указатель на автоматическую переменную это феерично...

sparky
Сообщения: 4
Зарегистрирован: 09 ноя 2012, 20:08

Re: udf для firebird

Сообщение sparky » 15 ноя 2012, 17:02

hvlad писал(а):Эта длл зависит от других ? Они доступны процессу FB ?
Да, спасибо большое за подсказку, добавила dll от которой зависит моя и все заработало

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: udf для firebird

Сообщение hvlad » 15 ноя 2012, 18:37

Стековые строки нельзя использовать в качестве возвращаемого значения.
Так что - "всё заработало" - несколько преждевременный вывод

Ответить