DLL injecten geht bei mir, bei nem Kumpel aber ned... [erledigt]
-
Hey!
Ich frage mich, warum mein Programm bei nem Kumpel nicht funktioniert. Es lädt eine DLL in einen Prozess, davor werden natürlich nötige Privilegien gesetzt.
Nun, bei mir funktioniert das laden einer DLL (Von mir erstellt, nix drin außer DllMain) in einen Prozess eines Spiels (egal.exe) einwandfrei, beim Kumpel wird die DLL einfach nicht reingeladen...
Woran kann das liegen? Er ist natürlich Admin und hat dasselbe Betriebssystem.
Natürlich legt er die DLL auch ins richtige Verzeichnis (C:\) und startet den Prozess vorher, er macht alles gleich wie ich... Programm und DLL sind beide "Release built".Bin am verzweifeln... Mit dem Injection-Code möchte ich euch nicht bombadieren, aber der ist nicht von mir sondern aus dem Netz.
Naja, falls es wichtig sein könnte (Bei mir gehts aber doch...):http://datakeeper.lima-city.de/html/winject.txt
http://datakeeper.lima-city.de/html/winject_h.txtUnd so wird das Modul geladen:
char* exe = "egal.exe"; char* path = "c:/test.dll"; DWORD PID = GetPIDbyEXE(exe); int result = DoInject(PID, path); if(!IsModuleLoaded(PID, path)) { // Meier... // Und result == 8 (0 wäre success) }Leider gehts beim Kumpel in den Abschnitt "Meier...".
Also, woran kanns liegen?Achja: Mit ner anderen DLL funktionierts bei ihm (detoured.dll zB.)!
Aber mit meiner DLL müsste es doch genauso tun, zumal es bei mir ja geht:#include <windows.h> bool WINAPI DllMain(HMODULE hDll, DWORD dwReason, PVOID pvReserved) { if(dwReason == DLL_PROCESS_ATTACH) ; else if(dwReason == DLL_PROCESS_DETACH) ; return true; }
Danke!
MfG
-
Auf Windows XP Home geht es nicht, kann das sein? Ist der einzige Unterschied, auf zwei Home-Maschinen gehts nicht, auf zwei Professional-Maschinen gehts... Überall Admin...
Was ist da los? Was schränkt Home da wieder ein? Liegt es an:
TOKEN_PRIVILEGES priv; HANDLE hThis, hToken; LUID luid; hThis = GetCurrentProcess(); OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken); LookupPrivilegeValue(0, "seDebugPrivilege", &luid); priv.PrivilegeCount = 1; priv.Privileges[0].Luid = luid; priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0); CloseHandle(hToken); CloseHandle(hThis);Geht das auf XP Home nicht oder wie?
Und noch eine Seltsamkeit:SendMessage(analyzePanel, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(entry.c_str()));Scheint bei nem Kumpel mit XP Home keine Auswirkung zu haben. Es wird kein Text der ListBox hinzugefügt. Bei mir gehts aber...
//EDIT:
Mit LB_INSERTSTRING gehts auf Home... aber das kann doch nicht sein? Was ist da nur los?
Aber das Hauptproblem ist eher, dass sich die DLL unter Home nicht laden lässt...//EDIT 2:
Auf 2 von 3 Home-Systemen funzt LB_ADDSTRING, warum funzt das auf einer Maschine nicht?
-
Und wir sollen jetzt den Inject code debuggen, den du nicht mal selbst geschrieben hast, sondern nur irgendwo ausm Netz gefischt hast? Ich glaub du hast'n Sonnenbrand im Hirn.
-

Nana... es muss doch an etwas grundlegendem scheitern, sonst würde es auf XP Prof. doch auch nicht tun.
Nun, hier ein kürzerer injection-Code, mit dem es auf XP Professional funktioniert, auf XP Home wieder nicht...:
bool insertDll(DWORD procID, std::string dll) { //Find the address of the LoadLibrary api, luckily for us, it is loaded in the same address for every process HMODULE hLocKernel32 = GetModuleHandle("Kernel32"); FARPROC hLocLoadLibrary = GetProcAddress(hLocKernel32, "LoadLibraryA"); //Adjust token privileges to open system processes HANDLE hToken; TOKEN_PRIVILEGES tkp; if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, 0, &tkp, sizeof(tkp), NULL, NULL); } //Open the process with all access HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID); //Allocate memory to hold the path to the Dll File in the process's memory dll += '\0'; LPVOID hRemoteMem = VirtualAllocEx(hProc, NULL, dll.size(), MEM_COMMIT, PAGE_READWRITE); //Write the path to the Dll File in the location just created DWORD numBytesWritten; WriteProcessMemory(hProc, hRemoteMem, dll.c_str(), dll.size(), &numBytesWritten); //Create a remote thread that starts begins at the LoadLibrary function and is passed are memory pointer HANDLE hRemoteThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)hLocLoadLibrary, hRemoteMem, 0, NULL); //Wait for the thread to finish bool res = false; if (hRemoteThread) res = (bool)WaitForSingleObject(hRemoteThread, 10000) != WAIT_TIMEOUT; //Free the memory created on the other process VirtualFreeEx(hProc, hRemoteMem, dll.size(), MEM_RELEASE); //Release the handle to the other process CloseHandle(hProc); return res; }
-
Ich würde es mal mit Fehlerbehandlung versuchen.
-
liegt an dem OpenProcessToken bzw OpenProcess kram. wieso checkst du die rückgabewerte nicht? der rest ist ok
-
Warum vergesse ich immer, Returnwerte abzufragen...
Aber: Es tritt kein Fehler auf!
(Habe Parameter 3 von VirtualFreeEx() noch auf 0 gesetzt, das war der einzige Fehler)Gerade habe ich ein XP Home System gefunden, auf dem das Ganze funktioniert aber...
XP Professional System:
DLL Injizieren funktioniertXP Home System 1:
DLL Injizieren funktioniertXP Home System 2:
DLL Injizieren funktioniert nicht
(detoured.dll geht aber zB, nur meine nicht!)XP Home System 3:
DLL Injizieren funktioniert nicht
(detoured.dll geht aber zB, nur meine nicht!)Bei Home System 2 & 3 werden zwar msvcp71.dll und MSVCR71.DLL in den Prozess geladen, meine DLL aber nicht... Was ist da los?

Danke!
MfG
-
vielleicht irgendwelche antivirensoftware?
-
Ne leider, daran liegts auch nicht...
Wie anfangs schon erwähnt, funktioniert nur meine DLL nicht, aber zB. detoured.dll von Microsoft schon!
(Also dort, wo sich meine DLL injizieren lässt, geht natürlich auch detoured.dll, aber dort wo sich meine DLL nicht injizieren lässt, geht es jedoch mit detoured.dll)MfG
-
Na dann prüfe, wie schon mehrfach gesagt, JEDEN Rückgabewert JEDER Funktion. Irgendwo wird das schieflaufen, wie sollen wir dir das hier sagen, wenn wir dein Problem nicht reproduzieren können, selbst wenn wir uns dazu motivieren könnten, es zu tun.
-
ceplusplus@loggedoff schrieb:
Aber: Es tritt kein Fehler auf!
Hab jede Funktion in insertDll() geprüft, jede gibt einen Wert ungleich 0 zurück. Auf jedem System. Aber trotzdem wird auf manchen Systemen nicht injiziert... Bei "XP Media Center Edition" gehts auch nicht...
Überall als Admin probiert, kein AntiVirus, ...MfG
-
Das ist unmöglich. Dann machst du in deiner DLL irgendwas zweifelhaftes in DllMain oder so.
-
Inf.Student schrieb:
Das ist unmöglich.
Ja, das denke ich auch ständig

#include <windows.h> bool WINAPI DllMain(HMODULE hDll, DWORD dwReason, PVOID pvReserved) { if(dwReason == DLL_PROCESS_ATTACH) ; else if(dwReason == DLL_PROCESS_DETACH) ; return true; }Es ist aber so... Aber es muss doch mit meiner DLL zu tun haben, immerhin funktioniert es mit anderen ja überall, doch mit meiner Selbsterstellten nicht überall...
-
Um welches Programm geht es? Bist du dir sicher, daß das Programm keine Maßnahmen enthält?
-
Zuerst mit nem alten Spiel, dann mit procexp.exe (Process Explorer) versucht. Haben beide sicher keine Maßnahmen, außerdem bleibt es beim selben: Bei meinen zwei PC's gehts (XP Home & XP Prof.), auf paar anderen Systemen nicht... Mit ner Microsoft DLL gehts überall...
MfG
-
Hilfe

-
Bei dem Code von http://datakeeper.lima-city.de/html/winject.txt hatte es bei dir nicht geklappt mit result==6, richtig? In dem Code steht in "InjectOrEject"
ht = CreateRemoteThread( hProcess, 0, 0, (DWORD (__stdcall *)( void *)) p, c, 0, &rc ); if ( ht == NULL ) nResult=6;. Hast du in deinem Codestückchen mal probiert, ob CreateRemoteThread schiefgeht? Wenn's NULL zurückgibt, dann zeig mal den GetLastError.
-
Mit GetExitCodeThread müsstest Du den Returncode von Deinem Remotethread bekommen. Das müsste ja der DLL-HINSTANCE Wert sein. Zumindest wüsstest Du dann ob der LoadLibrary überhaupt funktioniert.
-
Danke, aber auch bei diesem Code...
...funktioniert es nicht. Dabei geben aber alle Funktionen auf jedem System !0 zurück, trotzdem wird auf einigen Systemen nicht injiziert.
MfG
-
1. Alle DLLs wirklich auf der Maschine?
2. Was ist der Returnwert Deines Threads? Nach dem injezieren?
3. Terminiert der Thread normal?Mögichkeit:
1. Deine DLL funktioniert nicht...
2. Deine DLL braucht DLLs die auf dem Zielsystem nicht geladen werden können
3. Dein DLL beendet DllMain nicht korrekt und wird wieder entladen.