Autor |
Beitrag |
LittleBen
Beiträge: 258
Erhaltene Danke: 4
Win 7, Mac OS
Delphi 7
|
Verfasst: Mi 06.06.12 22:03
Guten Abend,
habe im Netz einen DLL Injector gefunden. Das Injecten funktioniert Problemlos, nur das Entladen funktioniert nicht. Mein Versuchsobjekt Notepad stürzt beim Freigeben der DLL ab.
Hier die Funktion:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| function Inject: boolean; var ProcessID : Integer; hProcess : THandle; DLLPath : string; pDLLPath : Pointer; BytesWritten : Cardinal; ThreadID : Cardinal; ThreadHandle: THandle; ExitCode: Cardinal; begin Result:= false; DLLPath:= 'C:\Users\Guest\Desktop\Message Box.dll';
ProcessID:= GetProcessID('notepad.exe'); if ProcessID <> 0 then begin hProcess:= GetProcessHandleFromID(ProcessID); if hProcess <> 0 then begin pDLLPath:= VirtualAllocEx(hProcess, nil, Length(DLLPath), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if not Assigned(pDLLPath) then begin Result:= false; exit; end; end else begin Result:= false; exit; end; end else begin Result:= false; exit; end;
if WriteProcessMemory(hProcess, pDLLPath, PChar(DLLPath), Length(DLLPath), BytesWritten) then begin ThreadHandle:= CreateRemoteThread(hProcess, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'),pDLLPath, 0, ThreadID); if (ThreadHandle > 0) then begin WaitForSingleObject(ThreadHandle,INFINITE); GetExitCodeThread(ThreadHandle,ExitCode); CloseHandle(ThreadHandle); ThreadHandle:= CreateRemoteThread(hProcess,nil,0,GetProcAddress(GetModuleHandle('kernel32.dll'),'FreeLibrary'), Pointer(ExitCode), 0, ThreadID); if (ThreadHandle > 0) then CloseHandle(ThreadHandle); end; end; end; |
Liegt es an dieser Funktion? Oder vielleicht an der DLL selbst? Also als Test habe ich eine C++ DLL genommen, die eine Message Box ausgibt:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| #include "windows.h"
void InjNachricht() { MessageBox(0, "Nachricht", " Test", 0); }
int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved) { if(reason==DLL_PROCESS_ATTACH) CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InjNachricht, 0, 0, 0); return true; } |
Muss in der DLL vielleicht noch etwas beim Detachen geschehen?
Viele Grüße
Littleben
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Do 07.06.12 15:41
An beidem:
LoadLibraryA im Zielprozess returned automatisch wenn DLLMain ausgeführt wurde (diese Startet deinen neuen Thread). Danach wird die DLL entladen obwohl dein erzeugter Thread im Zielprozess noch am laufen ist, d.h. wenn MessageBoxA im Zielprozess aus der user32.dll in deine DLL zurück springt ist diese bereits entladen -> crash.
Ausserdem benötigt deine ThreadFunktion in der DLL noch einen Parameter -> InjNachricht entspricht nicht einer LPTHREAD_START_ROUTINE.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Do 07.06.12 22:41
Kleine Unterstützung:
LittleBen hat folgendes geschrieben : | Das Injecten |
Injizieren!
|
|
LittleBen
Beiträge: 258
Erhaltene Danke: 4
Win 7, Mac OS
Delphi 7
|
Verfasst: Mo 11.06.12 20:09
|
|
|