[C/C++] GetModuleHandle aus DLL (Update:nur noch Zeichensatz Frage)

Hallo zusammen,
ich beschäftige mich zur Zeit mit DLL Injection. Das injecten der DLL funktioniert soweit nur möchte ich jetzt (wie im anderen Thread geschildert) verschiedene Funktionen umschreiben, daher möchte ich eine Funktion in der DLL aufrufen die mir die Adressen im Prozess verschiedener Funktionen ermittelt. Das klappt aber irgendwie nicht wirklich.
Mal ein wenig Code:
Code:
Aus meiner Main.cpp:

int DLLInject() {
	LPVOID memory;
	LPTHREAD_START_ROUTINE threadAddr = 0;
	HMODULE hKernel;
	DWORD wBytes = 0;

	memory = VirtualAllocEx(hCatched,NULL,strlen(dllInjectPath),MEM_COMMIT,PAGE_READWRITE);
	hKernel = GetModuleHandle("Kernel32");
	threadAddr = (LPTHREAD_START_ROUTINE) GetProcAddress(hKernel,"LoadLibraryA");
	WriteProcessMemory(hCatched,memory,(LPVOID)dllInjectPath,strlen(dllInjectPath),&wBytes);

	HANDLE thread = CreateRemoteThread(hCatched,NULL,0,threadAddr,memory,0,NULL);
 	WaitForSingleObject(thread,INFINITE);  
	VirtualFreeEx(hCatched,memory,0,MEM_RELEASE);
	CloseHandle(thread);
	return 0;

}

Aus der DLL:

extern "C" void __declspec(dllexport) Funktion() {
	
	HMODULE hKernel;
    LPTHREAD_START_ROUTINE threadAddr;

    hKernel = GetModuleHandle((LPCWSTR)"kernel32.dll");
printf("%d",hKernel);
    threadAddr = (LPTHREAD_START_ROUTINE) GetProcAddress(hKernel,"LoadLibraryA");
    printf("LoadLibraryA Funktion befindet sich bei: %x",threadAddr);
    return;
}

CDW hatte mir geraten den kompletten Namen also "kernel32.dll" anzugeben bei GetModuleHandle. Bei dem obrigen Code ist das Problem, dass ich in der Main so ein Handle auf die Kernel32.dll bekomme, aber in der DLL nicht, also auch wenn ich es genauso mache wie in der Main (also ohne "*.dll". Weiß jemand warum oder ist es nicht möglich diese Adressen aus einer DLL heraus zu ermitteln?
Vielen Dank!
 
Zuletzt bearbeitet:
OK ich habs mittlerweile selber hinbekommen.
Code:
  hKernel = GetModuleHandle(L"kernel32.dll");
Damit geht es auch aus der DLL heraus.

Kann mir jemand den Unterschied erklären?
const wchar_t * lpszUeberschrift = L"Fehlermeldung";
Das einzig neue, was zu beachten ist, ist das große "L". Es sagt dem Compiler, daß der konstante String aus 16-Bit-Zeichen bestehen soll. Andernfalls bekommt man auch eine Fehlermeldung beim compilieren.
Ist das nicht das selbe wie ein wchar_t * und damit wie LPWSTR ? Aber trotzdem funktioniert es mit L"kernel32.dll" aber nicht mit (LPWSTR)"kernel32.dll" oder mit (LPCWSTR)"kernel32.dll".

Das veranlasste mich dazu mal nachzugucken welcher Zeichensatz in dem Projekt eingestellt war in dem ich die DLL schreibe, dieser war auf Unicode jetzt steht er auf Multibyte wie im Main Programm, daher funktioniert das in der Main auch einfach mit "kernel32.dll" ohne irgendeinen Cast vorher zu machen.

Trotzdem würde ich gerne wissen wo genau das Problem dabei ist/war.
Vielen Dank.

P.S: Ich arbeite mit Microsoft Visual C++ Express 2010.
 
Zuletzt bearbeitet:
Zurück
Oben