implizit geladenen DLLs austauschen bzw. entfernen
-
Was willst Du denn da unterbinden?
-
Ich will ja letzendlich die DINPUT.DLL durch meine eigene ersetzen. Wenn ich nun wenn ich das Programm im suspended-modus starte und meine dll injiziere, wird vorher automatisch, dadurch dass die dllmain meiner dll aufgerufen wurde, die DINPUT.DLL geladen. Das wollte ich irgendwie verhindern

-
ich hatte jetzt auch erstmal probiert, die DLL zu injizieren, ohne dass die DllMain aufgeruft wird. Leider klappt dies so nicht
void* pLibFileRemote; pLibFileRemote = reinterpret_cast<char*>(VirtualAllocEx(ProcessInformation.hProcess, NULL, strlen(acDllFileName)+1+sizeof(void*)+sizeof(unsigned long), MEM_COMMIT, PAGE_READWRITE)); WriteProcessMemory(ProcessInformation.hProcess, pLibFileRemote, acDllFileName, strlen(acDllFileName)+1, NULL); unsigned long lFlags=DONT_RESOLVE_DLL_REFERENCES; WriteProcessMemory(ProcessInformation.hProcess, reinterpret_cast<unsigned char*>(pLibFileRemote)+strlen(acDllFileName)+1+sizeof(void*), &lFlags, sizeof(unsigned long), NULL); void* hThread = CreateRemoteThread(ProcessInformation.hProcess, NULL, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryExA")), pLibFileRemote, CREATE_SUSPENDED, NULL);Die DLL wird injiziert und die DllMain wird aufgerufen
-
Warum tust Du nicht *Deine* DLL in das Verzeichnis der EXE??? Wenn Du eh das gleiche Interface zur Verfügung stellst, dann tausch doch einfach die DLL aus... das ist ja schliesslich der Sinn einer DLL!
-
Das ist aus vorgegebenen Gründen nicht möglich

-
Die einzige "saubere" Lösung ist das Hooken der Funktionen auf Deine eigenen...
Da besteht dann keine notwendigkeit die DLL zu entladen...
-
Mmmmh, ok, als letze Möglichkeit theoretisch denkbar

-
Ok, ich mach das mit dem hooken. Denoch möchte ich aber die alte DINPUT.DLL entladen. Wie geht nun dies?
-
Die alte DLL kannst Du nicht entladen. Damit musst Du Dich abfinden...
Das Hooken ist relativ simpel, da Du ja nur die Funktion "umleiten" musst auf Deine; d.h. nur ein JMP Befehl in der ersten Addresse auf die GetProcAddress zeigt...
-

Naja, egal