Jump to content
Welcome, Guest
Existing user? Sign In

Sign In



Sign Up
The MatriX
  • Welcome To Ghbsys
  • CS GO Streaming Version is released. Have fun streaming while cheating!
  • Have a Payment Issue? Send us a Support ticket.
  • Make a thread if you need support or join our discord for live support.
  • Have Suggestions? Make a thread and you'll earn Ghbsys Points for implemented suggestions.
  • Join our discord to stay well connected! Don't forget to integrate your discord to the site
  • Welcome to [GHB] - GAmEhAcKbAsTaRdS Forum

    Welcome to [GHB] - GAmEhAcKbAsTaRdS Forum, like most online communities you must register to view or post in our community, but don't worry this is a simple free process that requires minimal information for you to signup. Be apart of [GHB] - GAmEhAcKbAsTaRdS Forum by signing in or creating an account.
    • Start new topics and reply to others
    • Subscribe to topics and forums to get email updates
    • Get your own profile page and make new friends
    • Send personal messages to other members.

    [Delphi] Dll-Injection - by techcat.de


    Recommended Posts

    Vorraussetzungen

     

    # Ihr solltet wenn ihr das hier lest wissen was eine Dll-Injection ist und wozu sie gut ist.

    # Ihr solltet wissen was eine API ist und mit dem MSDN vertraut sein!

    # Es ist natürlich erfolderlich das ihr eine Programmiersprache könnt. (Am besten Delphi weil es hier an Delphi beschrieben ist. Geht aber auch mit anderen Sprachen die von der Winapi gebrauch machen können.)

    # Ihr solltet wissen was ein Thread ist, wissen wie man normalerweise eine Dll zur laufzeit läd, wissen wie man Speicherbereiche allocated und wissen was Window-Handles sind.

     

     

     

    Die Theorie

     

    In der Theorie läuft eine Dll-Injection folgendermaßen ab:

    1. Der Prozess wird entweder gestartet oder ein laufender Prozess wird geöffnet.

    2. Ein Speicherbereich wird im fremden Prozess allocated.

    3. An diesen neuen Speicherbereich wird der Pfad und Dateiname zur der Dll geschrieben.

    4. Im fremden Prozess wird ein Thread an der Addresse von der LoadLibrary API gestartet, als Parameter wird unser Speicherbereich angegeben der den Pfad enthält.

     

     

     

    Die Theorie im Detail

     

    1. Der Prozess wird entweder gestartet oder ein laufender Prozess wird geöffnet.

    Um einen laufenden Prozess zu öffnen benutzen wir die OpenProcess API. Diese API verlangt verschiedene Parameter, als erstes dwDesiredAccess. Dieser Parameter legt fest was für Rechte wir an dem Prozess haben werden. Wir können das Flag PROCESS_ALL_ACCESS benutzen. Der zweite Parameter interessiert uns nicht weiter und erhält False von uns. Der Dritte Parameter ist wichtig, er identifiziert den Prozess den wir öffnen wollen, die sogenannte "Process ID" wird hier von uns verlangt. Diese sehen wir zum Beispiel im Taskmanager. Da wir aber natürlich ein Programm schreiben wollen was diese Process ID automatisch findet können wir uns aus einem Window-Handle mittels der API GetWindowThreadProcessId ableiten.

    Wir brauchen also ein Window-Handle. Das bekommen zum Beispiel indem wir mittels der FindWindow API, hier kann man entweder eine Window Class oder den Fenstertitel angeben um daraus das Handle des Fensters zu bekommen.

    Alternativ können wir uns durch die EnumWindows API sämtliche im Moment existierende Fenster auflisten lassen und den User entscheiden lassen in welchen Prozess er injecten möchte.

    Andere Methoden könnt ihr per Google sicherlich selber finden =P

    Wenn wir also ein Window-Handle haben jagen wir es durch GetWindowThreadProcessId und benutzen die dadruch erhaltene Process ID für unseren OpenProcess aufruf.

     

    Wir können die Process ID auch bekommen wenn wir den Prozess selber mittels der CreateProcess API selber starten. Als Letzter Parameter wird hier eine PROCESS_INFORMATION Struktur übergeben die den Wert hProcess enthält in dem nach dem Funktionsaufruf das Handle des gestarteten Prozesses liegt.

     

     

    2. Ein Speicherbereich wird im fremden Prozess allocated.

    Um das zu erreichen benutzen wir VirtualAllocEx. Diese Funktion benötigt folgende Parameter:

    hProcess - Dieser Parameter erhält von uns das ProcessHandle das wir von CreateProcess oder OpenProcess erhalten haben.

    lpAddress - Dieser Parameter ist Optional und wird von uns mit NIL (Delphi) bzw. NULL (C/C++) gespeist. Er kann eine Speicheraddresse erhalten an der der Speicher allocated werden soll, uns ist aber egal wo dies geschieht.

    dwSize - Dieser Parameter gibt an wie viel Speicher freigegeben werden soll. Wir geben hier die Länge des Pfads der Dll an die wir injecten wollen. Addieren sie zu der Länge 1 hinzu wenn sie einen Ansi-String benutzen und 2 wenn sie einen Unicode-String benutzen. Das zuaddierte Zeichen mit dem Code 0 signalisiert das Ende des Strings.

    flAllocationType- Der Parameter spezifiziert den Typ der allocation. Die Flags MEM_COMMIT und MEM_RESERVE können wir für unsere Zwecke verwenden, auch andere Kombinationen sind möglich, lesen sie hierzu im MSDN.

    flProtect - Mit diesem Parameter gibt man die Zugriffsrechte des Speicherbereiches an. PAGE_READWRITE würde für unsere Zwecke ausreichen. Andere Konstanzen entnehmen sie bitte dem MSDN.

     

     

    3. An diesen neuen Speicherbereich wird der Pfad und Dateiname zur der Dll geschrieben.

    Um etwas in einen Fremden Prozess zu schreiben kann man WriteProcessMemory verwenden:

    hProcess - Dieser Parameter erhält von uns das ProcessHandle das wir von CreateProcess oder OpenProcess erhalten haben.

    lpBaseAddress - Hier wird die Addresse des Speicherbereichs der beschrieben werden soll angegeben, wir nehmen den Rückgabewert von VirtualAllocEx

    lpBuffer - Ein Pointer zu den Daten die geschrieben werden sollen, also in unserem Falle ein Pointer zu String des Dateinamens der zu injectenden Dll.

    nSize - Die Länge der zu schreibenden Daten. Die Länge des Strings + 1 (Zerobyte). Wenn man einen unicode String nimmt muss der Wert mal 2 genommen werden.

    lpNumberOfBytesWritten - Hier kann man eine Variable angeben die nach dem Aufruf die Anzahl der geschriebenen Bytes enthält. Sie kann zur fehlererkennung benutzt werden, ist aber optional.

     

     

    4. Im fremden Prozess wird ein Thread an der Addresse von der LoadLibrary API gestartet, als Parameter wird unser Speicherbereich angegeben der den Pfad enthält.

    CreateRemoteThread erlaubt es uns einen Thread in einem Fremden Prozess zu starten. Sie erlaubt es uns noch einen Parameter anzugeben der als Parameter an die Funktion übergeben wird an der wir unseren Thread starten wollen. Das die LoadLibrary API nur einen Parameter erwartet wird sich hier zu nutze gemacht. Der erwartete Parameter ist Pfad und Dateiname der Dll, den Pointer dazu brauchen wir also nur noch bei LoadLibrary anzugeben.

    hProcess - Dieser Parameter erhält von uns das ProcessHandle das wir von CreateProcess oder OpenProcess erhalten haben.

    lpThreadAttributes - Hier kann man Attribute angeben die wir aber nicht benötigen, daher ignorieren wir diesen Parameter und geben nil (NULL) an.

    dwStackSize - Wir können eine Stackgröße für den neuen Thread angeben. Wir geben 0 an, dadurch wird ein Standartwert benutzt.

    lpStartAddress - Hier die Startaddresse des Threads, wie bereits erwähnt die Addresse von LoadLibrary.

    lpParameter - Der Parameter den wir auch an LoadLibrary übergeben würden. Also der Pfad zur Dll.

    dwCreationFlags - Hier kann man Flags für den Thread angeben, da wir sie nicht brauchen benutzen wir 0.

    lpThreadId - Hier wird wenn gewünscht die Thread ID zurückgegeben, brauchen wir nicht also nil bzw. NULL.

     

     

     

    Ein Praxisbeispiel in Delphi 2010

     

    program loader;
    
    {$APPTYPE CONSOLE}
    
    uses
     SysUtils,
     Windows;
    
    var
     DllPfad:String='h00x.dll';
     startupinfo:_STARTUPINFOW;
     processinfo:_PROCESS_INFORMATION;
     Speicherbereich:Pointer;
     Unnoetig:Cardinal;
    
    begin
     DllPfad := ExtractFilePath(ParamStr(0))+DllPfad;
    
     //Schritt 1: Ein Prozess wird gestartet. (Wir starten ihn mit dem CREATE_SUSPENDED Flag damit er noch nicht startet!)
     startupinfo.cb := SizeOf(startupinfo);
     startupinfo.dwFlags := 0;
     if CreateProcess(nil, 'mspaint.exe', nil, nil, False, CREATE_SUSPENDED, nil, nil, startupinfo, processinfo) = True then begin
       //Schritt 2: Ein Speicherbereich wird im fremden Prozess allocated.
       Speicherbereich := VirtualAllocEx(processinfo.hProcess, nil, Length(DllPfad)*2+2, MEM_COMMIT OR MEM_RESERVE, PAGE_READWRITE);
    
       //Schritt 3: An diesen neuen Speicherbereich wird der Pfad und Dateiname zur der Dll geschrieben.
       WriteProcessMemory(processinfo.hProcess, Speicherbereich, PWideChar(DllPfad), Length(DllPfad)*2+2, Unnoetig);
    
       //Schritt 4: Im fremden Prozess wird ein Thread an der Addresse von der LoadLibrary API gestartet, als Parameter wird unser Speicherbereich angegeben der den Pfad enthält.
       CreateRemoteThread(processinfo.hProcess, nil, 0, GetProcAddress(LoadLibrary('kernel32.dll'), 'LoadLibraryW'), Speicherbereich, 0, Unnoetig);
    
       //Da der MainThread bisher Suspended ist startet wir ihn mit ResumeThread:
       ResumeThread(processinfo.hThread);
     end else begin
       WriteLn('Ein Fehler trat auf. (CreateProcess)');
     end;
     ReadLn;
    end. 

    Edited by Neo I.I.I
    Link to comment
    Share on other sites

    • 3 weeks later...
    • 3 weeks later...
    • 6 months later...
    • 4 months later...

    This won't work for WR as the WR window shows up just after hackshield started running, so there is no possibility to allocate the needed memory. What you need to do is receiving the PID under the usage of the process itself, see also "ToolHelp32SnapShot" ...

    Link to comment
    Share on other sites

    • 2 weeks later...

    Didn't think the fact that the topic might be kinda older would bother anyone, I rather wondered if no one cares about the fact that this is a way to do a injector that won't work at least for WR lol.

    Link to comment
    Share on other sites

    Guest
    This topic is now closed to further replies.
     Share

    • Recently Browsing   0 members

      • No registered users viewing this page.
    ×
    ×
    • Create New...