Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   CreateRemoteThread - DLL Injection (https://www.delphipraxis.net/113763-createremotethread-dll-injection.html)

Luckie 14. Mai 2008 12:09


CreateRemoteThread - DLL Injection
 
Liste der Anhänge anzeigen (Anzahl: 1)
CreateRemoteThread - DLL Injection
Anbei eine Demo zur API-Funktion MSDN-Library durchsuchenCreateRemoteThread bzw. wie man mittels einer DLL Code von einer anderen Anwendung ausführen lässt.

Das Beispiel nutzt dafür die notepad.exe und lässt von ihr eine Messagebox anzeigen, die den Pfad ausgibt, der den Code ausführt.

Der relevante Code:
Delphi-Quellcode:
const
  DLLFILENAME      = 'MsgBox.dll';

var
  ProcessID        : Integer;
  hProcess         : THandle;
  DLLPath          : string;
  pDLLPath         : Pointer;
  BytesWritten     : Cardinal;
  ThreadID         : Cardinal;

begin
  About;

  DLLPath := ExtractFilePath(ParamStr(0)) + '\' + DLLFILENAME;

  ProcessID := GetProcessID('notepad.exe');
  if ProcessID <> 0 then
  begin
    hProcess := GetProcessHandleFromID(ProcessID);
    if hProcess <> 0 then
    begin
      // alloc memory in remote process
      pDLLPath := VirtualAllocEx(hProcess, nil, Length(DLLPath), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
      if Assigned(pDLLPath) then
      begin
        // write DLL Path into the allocated memory
        if WriteProcessMemory(hProcess, pDLLPath, PChar(DLLPath), Length(DLLPath), BytesWritten) then
        begin
          // create remote thread and load library
          if CreateRemoteThread(hProcess, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'),
            pDLLPath, 0, ThreadID) <> 0 then
          begin
            CloseHandle(hProcess);
            Writeln('DLL injected...');
          end
          else
            Writeln(GetLastError);
        end
        else
          Writeln(GetLastError);
      end
      else
        Writeln(GetLastError);
    end
    else
      Writeln(GetLastError);
  end
  else
    Writeln(GetLastError);

  Readln;
end.
Der ganze Code kann in der Demo im Anhang nachvollzogen werden.

Die Muhkuh 14. Mai 2008 12:20

Re: CreateRemoteThread - DLL Injection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kleiner Hinweis: Wer bei AntiVir (wahrscheinlich auch bei anderen Scannern) eine hohe Heuristik eingestellt hat, wird beim Entpacken des Archives eine Virenmeldung erhalten. (Siehe Anhang)

Luckie 14. Mai 2008 12:30

Re: CreateRemoteThread - DLL Injection
 
Hm, hier hat der Virenscanner nicht angeschlagen. Aber wahrscheinlich weiß er, dass der liebe Luckie nichts böses Programmiert. ;)

Die Muhkuh 14. Mai 2008 12:43

Re: CreateRemoteThread - DLL Injection
 
Wie gesagt: Ich hab meine Heuristik auch hoch eingestellt und da meckert er. Verständlich, diese Art der Injection könnte ja auch ein Virus machen.

brechi 14. Mai 2008 19:21

Re: CreateRemoteThread - DLL Injection
 
#1: Length(DLLPath)+1 bzw. besser DllPath+#0
#2: BytesWritten = Length(DLLPath)
#3: PAGE_READ
#4: GetProcessHandleFromID -> OpenProcess mit benötigten Rechten (nervig wenn man immer 100 Zusatzfunktionen braucht)
#5: selbe gilt für FindProcess -> lieber beispiel mit GetWindowThreadProcessID (oder wenigsten verlinken)
#6: CreateRemoteThread gibt ThreadHandle zurück -> schließen?
#7: CloseHandle(hProcess) ausführen auch wenn irgendwas fehltschlägt, also in der IF wo handle <> 0 geprüft wird
#8: WaitForSingleThread warten und ggf Base auslesen mittels GetExitCodeThread

Wenig Code, aber viel was ich anders machen würde, jedenfalls falls es in die CodeLib kommt

DP-Maintenance 3. Jul 2008 03:26

DP-Maintenance
 
Dieses Thema wurde von "Dax" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Tutorials und Kurse" verschoben.
In dieser Form eher ein Mini-Tutorial

Luckie 3. Jul 2008 08:50

Re: CreateRemoteThread - DLL Injection
 
#1: Length(DLLPath)+1 bzw. besser DllPath+#0
OK, gefixt.

#2: BytesWritten = Length(DLLPath)
Was meinst du damit? Sollte man das noch überprüfen oder wie?

#3: PAGE_READ
Wo soll das hin?

#4: GetProcessHandleFromID -> OpenProcess mit benötigten Rechten (nervig wenn man immer 100 Zusatzfunktionen braucht)
Siehe Code, das ist nur ein Wrapper, aber gut braucht man nicht.

#5: selbe gilt für FindProcess -> lieber beispiel mit GetWindowThreadProcessID (oder wenigsten verlinken)
Das ist schlecht, da man den Fenstertitel kennen muss und der kann sich ändern. Genau deswegen habe ich es nicht so gemacht.

#6: CreateRemoteThread gibt ThreadHandle zurück -> schließen?
:oops:

#7: CloseHandle(hProcess) ausführen auch wenn irgendwas fehltschlägt, also in der IF wo handle <> 0 geprüft wird
Gemacht.

#8: WaitForSingleThread warten und ggf Base auslesen mittels GetExitCodeThread
Gut könnte man noch machen, aber mein Thread gibt ja nichts zurück.

Zitat:

Wenig Code, aber viel was ich anders machen würde, jedenfalls falls es in die CodeLib kommt
;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz