| 
| Autor | Beitrag |  
| LittleBen 
          Beiträge: 258
 Erhaltene Danke: 4
 
 Win 7, Mac OS
 Delphi 7
 
 | 
Verfasst: Mi 06.06.12 21: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 14: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 21: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 19:09 
 |  |  |  |