komischer Fehler bei DLL-Prüfung
-
hallo,
ich teste mit einer Funktion, ob ein bestimmer Prozess eine bestimmte DLL geladen hat. Falls sie geladen ist, wird die BaseAddress ausgelesen. Nun ist das Problem, dass nicht richtig funktioniert. Das komische an dem Problem ist, dass es immer dann funktioniert, wenn ich oben zwei Messageboxen eingebaut habe, die die Parameter ausgeben (hatte ich zu Testzwecken eingebaut). Doch da diese Messageboxen im fertigen Programm nicht integriert sein sollen, müssen sie natürlich raus. Doch wenn ich das mache, bekomme ich einen falschen Wert von der Funktion zurückgeliefert. Wenn sie wieder eingebaut sind, geht wieder alles...
Hier die Funktion:
bool __fastcall Tmainform::checkdll(char* proc, char* dll) { MessageBox(NULL, proc, "Test", NULL); <--mit ihnen gehts, ohne sie nicht MessageBox(NULL, dll, "Test", NULL); PROCESSENTRY32 pe32; MODULEENTRY32 me32; HANDLE thSnapshot, hModuleSnap; BOOL retval, error = true; thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(thSnapshot == INVALID_HANDLE_VALUE) { error = true; } pe32.dwSize = sizeof(PROCESSENTRY32); retval = Process32First(thSnapshot, &pe32); while(retval) { if(strcmp(pe32.szExeFile, proc) == 0) { hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID); if(hModuleSnap == INVALID_HANDLE_VALUE ) { error = true; break; } me32.dwSize = sizeof(MODULEENTRY32); if(!Module32First(hModuleSnap, &me32)) { CloseHandle(hModuleSnap); error = true; break; } do { if(strcmp(me32.szModule, dll) == 0) { labelbase->Font->Color = clLime; char base[255] = ""; sprintf(base, "DLLBaseAddress: %08X", me32.modBaseAddr); labelbase->Caption = base; error = false; break; } } while(Module32Next(hModuleSnap, &me32)); CloseHandle(hModuleSnap); break; } retval = Process32Next(thSnapshot,&pe32); pe32.dwSize = sizeof(PROCESSENTRY32); } CloseHandle(thSnapshot); if(error) { labelbase->Font->Color = clRed; char base[255] = ""; sprintf(base, "%s not injected!", dll); labelbase->Caption = base; return false; } else { return true; } }proc = zB "notepad.exe" & dll = zB "notepad.dll"
Jemand ne Idee warum das nicht geht, wenn die Messageboxen weg sind??
Edit: Hab es jetzt anders gelöst. Hab die Messageboxen durch ein Sleep(0); ersetzt und es geht. Wenn ich das Sleep wieder rausnehme, geht die Funktion wieder nicht. Ich versteh nicht, warum sowas die Funktion zum Scheitern bringt.
greetz KN4CK3R