AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Injection von Memory in anderen Prozess

Ein Thema von snapseep · begonnen am 24. Jul 2015 · letzter Beitrag vom 28. Jul 2015
Antwort Antwort
snapseep

Registriert seit: 24. Jul 2015
6 Beiträge
 
#1

AW: DLL Injection von Memory in anderen Prozess

  Alt 26. Jul 2015, 08:53
Hallo Zacherl und brechi!

Vielen Dank für euren Input.

Leider bin ich nun etwas verwirrt, da sich eure Antworten dermaßen unterscheiden in Sachen Aufwand und Angehensweise.

Die Vorgehensweise von dir Zacherl ist, wie du ja selbst schreibst "den Aufwand nicht wert", da ich mich wahrscheinlich einige Wochen mit dem Thema beschäftigen müsste um einen Einblick in die Thematik zu bekommen.

Sollte ich jedoch wirklich nur VirtualAlloc durch VirtualAllocEx austauschen müssen, wie von brechi beschrieben, werde ich dies wohl tun.

Danke auch nochmal an brechi für den Link zur uallCollection. Jedoch möchte ich ja eine DLL in den Zielprozess befördern und keine Exe.

Edit:



Wäre diese Vorgehensweise bei VirtualAllocEx korrekt:
  1. Mit OpenProcess (PROCESS_VM_OPERATION) Handle im Zielprozess erlangen
  2. VirtualAllocEx mit Zielhandle ausführen
  3. Durch CreateRemoteThread injectete DLL "starten"

?

Geändert von snapseep (26. Jul 2015 um 09:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: DLL Injection von Memory in anderen Prozess

  Alt 26. Jul 2015, 13:55
Sollte ich jedoch wirklich nur VirtualAlloc durch VirtualAllocEx austauschen müssen, wie von brechi beschrieben, werde ich dies wohl tun.
Damit ist es ja nicht getan. Du musst auch alle direkten Speicherzugriffe (z.b. beim Anwenden der Relocations, etc) durch ReadProcessMemory/WriteProcessMemory ersetzen (oder du nimmst halt NtMapViewOfSection; damit kannst du den selben Speicherbereich gleichzeitig in deinen eigenen und in den Zielprozess mappen).

IAT auflösen und DllMain ausführen dann per CreateRemoteThread.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#3

AW: DLL Injection von Memory in anderen Prozess

  Alt 26. Jul 2015, 21:38
Du kannst auch die InjectMe Funktion anpassen:

bei
ReadFile(iFileHandle, pFileMem^, dwFileSize, dwRead, nil);
wird in pFileMem die Datei eingelesen, das kann dein Pointer auf den Speicherbereich der dll sein.

Innerhalb der Funktion die du bei "pDllMain" angibst, solltest du aber auch nur Funktionen verwenden die bereits im Prozess geladen wurden (und da wohl nur von der kernel32.dll)

uallKernel.CreateImportTable müsste sonst noch angepasst werden, da dort die lokalen Adressen verwendet werden und nicht die vom Zielprozess.

Achja: eine dll ist ja nichts anderes als ne exe, d.h. du kannst deine Funktionen in die eigene Exe einbauen und dann di eigene exe in den Zielprozess laden, aber mit einem anderen EntryPoint.
  Mit Zitat antworten Zitat
snapseep

Registriert seit: 24. Jul 2015
6 Beiträge
 
#4

AW: DLL Injection von Memory in anderen Prozess

  Alt 27. Jul 2015, 06:44
Habe leider vergeblich den gestrigen Abend damit verbracht BTMemoryModule umzuschreiben mit VirtualAllocEx und den von Zacherl genannten Änderungen (wpm, createremotethread,... ).

Die Herangehensweise die Exe zu injecten finde ich sehr interessant.

Habe mir daszu mal den passenden Text aus der msdn Hilfe kopiert:

The name of the module. This can be either a library module (a .dll file) or an executable module (an .exe file). .
Anschließend habe ich eine kleine simpleexe.exe erstellt, die ich in IrfanView injected habe.

Das hat auch soweit geklappt:



Nur weiß ich jetzt noch nicht so recht, wie ich beispielsweise direkt Code beim injecten der Exe im Zielprozess ausführen kann.

Sofern man eine Dll injected wird automatisch DllMain ausgeführt.

Bei der Injection gehe ich folgendermaßen vor:

Delphi-Quellcode:
function InjectExe(const pid: DWORD; exedir: PWideChar): Boolean;
var
  dwThreadID: Cardinal;
  hProc, hKernel: THandle;
  BytesToWrite, BytesWritten: SIZE_T;
  pRemoteBuffer, pLoadLibrary: Pointer;
  hThread: THandle;

begin
  Result := True;

  hProc := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or
    PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, False, pid);

  if hProc = 0 then
    Exit(False);

  try
    BytesToWrite := SizeOf(WideChar) * (Length(exedir) + 1);
    pRemoteBuffer := VirtualAllocEx(hProc, nil, BytesToWrite, MEM_COMMIT,
      PAGE_READWRITE);

    if pRemoteBuffer = nil then
      Exit(False);

    try
      if not WriteProcessMemory(hProc, pRemoteBuffer, exedir, BytesToWrite, BytesWritten) then
        Exit(False);

      hKernel := GetModuleHandleW('kernel32.dll');
      pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryW');

      hThread := CreateRemoteThread(hProc, nil, 0, pLoadLibrary, pRemoteBuffer, 0, dwThreadID);

      try
        WaitForSingleObject(hThread, INFINITE);
      finally
        CloseHandle(hThread);
      end;

    finally
      VirtualFreeEx(hProc, pRemoteBuffer, 0, MEM_RELEASE);
    end;

  finally
    CloseHandle(hProc);
  end;

end;
Gibt es eine Möglichkeit Code direkt beim Injecten der Exe auf diese Weise auszuführen?
Angehängte Grafiken
Dateityp: jpg ide.jpg (25,4 KB, 88x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: DLL Injection von Memory in anderen Prozess

  Alt 27. Jul 2015, 10:49
Ja, du musst per CreateRemoteThread die DllMain ausführen. Das Offset dazu findest du in den ImageNtHeaders unter dem Namen EntryPoint. Prototyp ist folgender:
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

Beim Laden nimmst du DLL_PROCESS_ATTACH als fdwReason und beim Entladen DLL_PROCESS_DETACH. Korrekterweise müsste man auch noch DLL_THREAD_ATTACH und DLL_THREAD_DETACH implementieren (ist zumindest bei manchen DLLs erforderlich, die manuell TLS benutzen), aber dazu benötigt man entweder Hooks in der DLL selbst oder eine zweite "normal" geladene DLL, mit der man die Events weiterleiten kann. Dürfte in den meisten Fällen allerdings nicht nötig sein, also probier es ruhig erstmal ohne.

Brechis Code sollte ja irgendwo auch die WinMain (ebenfalls über das EntryPoint Feld referenziert) ausführen (welche allerdings einen anderen Prototypen hat!). Die Stelle änderst du so um, dass sie der DllMain mit passendem Parameter entspricht.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
snapseep

Registriert seit: 24. Jul 2015
6 Beiträge
 
#6

AW: DLL Injection von Memory in anderen Prozess

  Alt 27. Jul 2015, 13:35
Alles klar mit den Informationen kann man arbeiten

Werde mich mal die Woche hier dran machen und schauen, ob ich es zu laufen bekomme.

Danke nochmal.
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#7

AW: DLL Injection von Memory in anderen Prozess

  Alt 28. Jul 2015, 14:12
Hallo,

die Frage ist zwar einbiszchen offtopic, aber als jemand, der noch nie DLL Injection verwendet hat, was kann man eigentlich mit DLL Injection machen, was man so nicht machen kann? Sprich für was ist eigentlich DLL Injection? Vielleicht kann jemand paar Beispiele aufzählen.

Lg,
jus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz