Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL-Injection mit Freelibrary (https://www.delphipraxis.net/104122-dll-injection-mit-freelibrary.html)

R4id 28. Nov 2007 16:12

Re: DLL-Injection mit Freelibrary
 
Mit der uallCollection kannst du die DLL auch injektieren.

Wotan89 28. Nov 2007 16:58

Re: DLL-Injection mit Freelibrary
 
Ich hab das Problem selbst gelöst und zwar hatte ich statt dem Threadhandle die Threadid genommen, naja Dummheit... :P Allerdings kann ich die DLL, welche injiziert wurde, trotzdewm nicht löschen. Und das geht auch bei dem spanischen Quelltext nicht. Erst wenn ich die Anwenung, in welche die DLL injiziert wurde, beende, kann ich sie wieder löschen... Ich vermute, dass Freelibrary nicht richtig ausgeführt wird, da bei meiner Button2-Procedure immer wieder die DLL gefunden wird, ein Thread wird jedoch "erstellt".

Wotan89 28. Nov 2007 19:34

Re: DLL-Injection mit Freelibrary
 
Hab noch nen kleinen Fehler bei mir entdeckt: Man darf die Adresse nicht mit WriteProcessMemory usw. in den Prozess reinschreiben, sondern dies reicht aus:
Delphi-Quellcode:
createremotethread(hproc,nil,0,getprocaddress(getmodulehandle('kernel32.dll'),'FreeLibrary'),Pointer(hdll),0,TID);
Dadurch kommt bei mir eine Frage auf! Wieso muss ich das Handle der DLL nicht in den Prozess hineinschreiben, wie den Namen der DLL beim Starten? Und warum funktioniert die Methode mit WriteProcessMemoy usw. nicht? Für mich ist dies irgendwie unlogisch...

Apollonius 28. Nov 2007 19:43

Re: DLL-Injection mit Freelibrary
 
Ganz einfach: Das Pointer-Argument von CreateRemoteThread wird direkt an FreeLibrary übergeben. Und FreeLibrary kann mit einem Zeiger auf das Handle nichts anfangen, deshalb muss das Handle direkt, zum Zeiger gecastet, übergeben werden.

Wotan89 28. Nov 2007 20:00

Re: DLL-Injection mit Freelibrary
 
Wieso kann man der LoadlibraryA-Function den Stringwert nicht direkt übergeben, sondern muss ihn über WriteProcessMemory in den anderen Prozess schreiben. Ich glaube irgendeine Funtionalität habe ich noch nicht verstanden oder falsch "interpretiert". :?: :?: :?:

Apollonius 28. Nov 2007 20:10

Re: DLL-Injection mit Freelibrary
 
LoadLibrary erwartet als Parameter einen Zeiger auf einen Null-terminierten String, FreeLibrary erwartet einen HModule-Parameter.

Dani 28. Nov 2007 23:24

Re: DLL-Injection mit Freelibrary
 
Was waren nochmal die legitimen Anwendungsgebiete für DLL-Injection? :gruebel:

Wotan89 29. Nov 2007 18:39

Re: DLL-Injection mit Freelibrary
 
LÖegitime Anwendungen wären z.B. fehlerhafte 16-Bit-Anwenungen wieder zu,m Laufen zu bringen oder der Compiler benutzt auch DLL-Injection. Ich brauch es lediglich zum Verbessern des Verständnis für Programmierung. :wink:

Zacherl 29. Nov 2007 20:20

Re: DLL-Injection mit Freelibrary
 
Zitat:

Zitat von Dani
Was waren nochmal die legitimen Anwendungsgebiete für DLL-Injection? :gruebel:

Ring3 Hooks, welche von allen möglichen Anwendungen verwendet werden. Als Beispiel nur mal Firewalls. Was wären denn die illegalen Anwendungsgebiete?

brechi 14. Jan 2008 16:56

Re: DLL-Injection mit Freelibrary
 
wenns auch schon sehr alt ist:

Delphi-Quellcode:
function InjectIntoProcess(lpProcessID: Cardinal; lpDllname: String): cardinal;
var
  hProc: Cardinal;
  hRemThread:cardinal;
  addr:pointer;
  cWPM: Cardinal;
  th: integer;
begin
  result := 0;
  SetLastError(ERROR_SUCCESS);
  hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID);
  addr:=VirtualAllocEx(hProc, nil, length(lpDllname)+1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(hProc, addr, PChar(lpDllName), length(lpDllName)+1, cWPM);
  th := CreateRemoteThread(hProc, nil, 0,GetProcaddress(getmodulehandle('kernel32.dll'),'LoadLibraryA') , addr, 0, hRemThread);
  if (th > 0) then
  begin
    // warten bis thread beendet (dll im fremden prozess geladen)
    WaitForSingleObject(th,INFINITE);
    // den exitcode bekommen = EAX register von LLA = baseadresse der dll = dllhandle
    GetExitCodeThread(th,result);
    closehandle(th);
    // dll wieder entladen
    th := createremotethread(hproc,nil,0,getprocaddress(getmodulehandle('kernel32.dll'),'FreeLibrary'),Pointer(result),0,hremthread);
    if (th > 0) then
      closehandle(th);
  end;
  CloseHandle(hProc);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 Uhr.
Seite 2 von 3     12 3      

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