Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2019, 12:43   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Проблема с вызовом функции в Winlogon

Здравствуйте.
Есть какая то идиотская проблема к которой никак не могу найти подход.

Разрабатываю библиотеку для собственной реализации проверки пользователя. Winlogon.
Дополнительно есть библиотека шифрования ключа основана на либе Cryptopp.
Суть такая: при вводе пароля в винлогон необходимо преобразовать пароль и передать в функцию для получения пары пользователь/пароль.

Сам cryptopp встроить в винлогон не получается. Там просто феерическое количество ошибок. В общем принял решение написать библиотеку оболочку. Так вот. Если запускать свою программу которая вызывает функции из библиотеки то все работает как положено.
Если тот же самый код выполняется из винлогона то система падает с непонятной ошибкой.

Ошибка связано по логам с mcvcrt.dll код 1000
Но почему она тогда не вылетает при обычном запуске?

Вот код вызова дешифровщика
Код:
typedef int(_stdcall *dDecryptInfo)(byte* ciphertext, int siphLen, string* decryptedtext, const byte* key, const byte* iv);


try
	{
		HINSTANCE hGetProcIDDLL = LoadLibrary(L"crypt.dll");

		if (!hGetProcIDDLL) {
			//std::cout << "could not load the dynamic library" << std::endl;
			DropLog("could not load the dynamic library");
			return EXIT_FAILURE;
		}

		// resolve function address here
		dDecryptInfo DecryptData = (dDecryptInfo)GetProcAddress(hGetProcIDDLL, "DecryptInfo");
		if (DecryptData)
		{
			DropLog("Try Decrypt");
			return DecryptData(ciphertext, siphLen, decryptedtext, key, iiv);
		}
		::FreeLibrary(hGetProcIDDLL);
	}
	catch (exception *ex)
	{
		DropLog("Decrypt exception ");
		DropLog(string(ex->what()));
		return -1;
	}
	return 0;
Вот код из библиотеки.
Код:
extern "C" __declspec(dllexport) int _stdcall  DecryptInfo(byte* ciphertext, int siphLen, string* decryptedtext, byte* key, byte* iv)
{
	try
	{
		CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
		CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);
		CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink(*decryptedtext));
		stfDecryptor.Put(reinterpret_cast<const unsigned char*>(ciphertext), siphLen);
		stfDecryptor.MessageEnd(); <- методом логов удалось узнать что ошибка происходит именно в этой строчке
	}
	catch (exception *ex)
	{
		DropLog("Exception crypt:");
		DropLog(ex->what());
		//std::cout << "Decrypt error" << std::endl;
		return -1;
	}
	return 0;
}
ошибка которая вылазит на скриншоте.
Всякие Redistributible установлены. Причем если тот же самый код выполняет отдельная моя программа то все проходит как по нотам.
Может кто поможет чем нибудь?? что не так с этой штукой??
Изображения
Тип файла: jpg qwe.jpg (54.0 Кб, 123 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 10.04.2019 в 12:53.
WorldMaster вне форума Ответить с цитированием
Старый 11.04.2019, 10:01   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Эх ... я так понимаю сам себе не поможешь никто не поможет )))

В общем переделал под стандартную библиотеку wincrypt.h


Вот код шифрования и расшифрования рабочий малоли кому понадобиться:
Код:
int EncryptDecrypt(byte* outData, byte* inData, DWORD inLen, DWORD* out_len, byte* key, DWORD keylen, BOOL Decrypt)
{
	HCRYPTPROV hProv;
	HCRYPTHASH hHash;
	HCRYPTKEY hSessionKey;
	int result = 0;
	if (CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
	{
		if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
			if (CryptHashData(hHash, key, keylen, 0)) {
				if (CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hSessionKey))
				{
					unsigned long length = inLen + 1;
					unsigned char * cipherBlock = (unsigned char*)malloc(length);
					memset(cipherBlock, 0, length);
					memcpy(cipherBlock, inData, length - 1);

					if (Decrypt) {
						if (CryptDecrypt(hSessionKey, 0, TRUE, 0, cipherBlock, &length)) {
							memcpy(outData, cipherBlock, length);
							*out_len = length;
							result = 1;
						}
						else result = GetLastError();
					}
					else {
						if (CryptEncrypt(hSessionKey, 0, TRUE, 0, cipherBlock, &length, length)) {
							memcpy(outData, cipherBlock, length);
							*out_len = length;
							result = 1;
						}
						else result = GetLastError();
					}
				}
				else result = GetLastError();
			}
			else result = GetLastError();
		}
		else result = GetLastError();
	}
	else result = GetLastError();

	if (hProv)CryptReleaseContext(hProv, 0);
	if (hSessionKey)CryptDestroyKey(hSessionKey);
	if (hHash)CryptDestroyHash(hHash);
	return result;
}
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с вызовом функции из своей длл smartbutterfly Visual C++ 0 19.11.2013 20:23
Проблемы с вызовом функции Magnum4635 Общие вопросы C/C++ 2 26.10.2013 16:14
Проблема с вызовом функции Terikon JavaScript, Ajax 6 17.10.2013 19:11
Проблема с вызовом функции внутри Ajax archiolidius JavaScript, Ajax 0 12.12.2012 18:32
Проблема с вызовом функции B DLL doniyor Мультимедиа в Delphi 2 05.11.2009 16:14