Entwickler-Ecke

Dateizugriff - DLL Injection - nach gebrauch entladen


LittleBen - Mi 06.06.12 22:03
Titel: DLL Injection - nach gebrauch entladen
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:

Delphi-Quelltext
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, nil0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'),pDLLPath, 0, ThreadID);
   if (ThreadHandle > 0then
   begin
    // Warten bis Thread beendet
    WaitForSingleObject(ThreadHandle,INFINITE);
    GetExitCodeThread(ThreadHandle,ExitCode);
    CloseHandle(ThreadHandle);
    // DLL wieder entladen
    ThreadHandle:= CreateRemoteThread(hProcess,nil,0,GetProcAddress(GetModuleHandle('kernel32.dll'),'FreeLibrary'), Pointer(ExitCode), 0, ThreadID);
    if (ThreadHandle > 0then
      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 - 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.


Delphi-Laie - Do 07.06.12 22:41

Kleine Unterstützung:

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Das Injecten


Injizieren!


LittleBen - Mo 11.06.12 20:09

Bin heute erst wieder zum Thema gekommen...
user profile iconuall@ogc hat folgendes geschrieben Zum zitierten Posting springen:
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.
Ahh so ist das...okay. Das würde entweder bedeuten, kein Thread zu erstellen, oder etwas anderes tun, das ich nicht kenn :P

user profile iconDelphi-Laie hat folgendes geschrieben:
Ausserdem benötigt deine ThreadFunktion in der DLL noch einen Parameter -> InjNachricht entspricht nicht einer LPTHREAD_START_ROUTINE.
Wirklich, was für einen denn?

user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Kleine Unterstützung:

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Das Injecten


Injizieren!
Danke, danke...