AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials CreateRemoteThread - DLL Injection
Tutorial durchsuchen
Ansicht
Themen-Optionen

CreateRemoteThread - DLL Injection

Ein Tutorial von Luckie · begonnen am 14. Mai 2008 · letzter Beitrag vom 3. Jul 2008
Antwort Antwort
Benutzerbild von Luckie
Luckie
Registriert seit: 29. Mai 2002
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.
Angehängte Dateien
Dateityp: zip createremotethread_144.zip (25,3 KB, 212x aufgerufen)
Ein Teil meines Codes würde euch verunsichern.
 
Benutzerbild von Die Muhkuh
Die Muhkuh

 
Delphi 2009 Professional
 
#2
  Alt 14. Mai 2008, 13:20
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)
Miniaturansicht angehängter Grafiken
antivir_188.jpg  
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#3
  Alt 14. Mai 2008, 13:30
Hm, hier hat der Virenscanner nicht angeschlagen. Aber wahrscheinlich weiß er, dass der liebe Luckie nichts böses Programmiert.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

 
Delphi 2009 Professional
 
#4
  Alt 14. Mai 2008, 13:43
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.
Manuel
  Mit Zitat antworten Zitat
brechi
 
#5
  Alt 14. Mai 2008, 20:21
#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
  Mit Zitat antworten Zitat
3. Jul 2008, 04:26
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
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#7
  Alt 3. Jul 2008, 09:50
#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?


#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
Michael
  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 22:35 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