Autor Beitrag
LittleBen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: 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:
ausblenden volle Höhe 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 07.06.12 22:41 
Kleine Unterstützung:

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


Injizieren!
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: 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...