Einleitung
Hallo Elite PvPer! [Only registered and activated users can see links. Click Here To Register...]
Auf folgende Fragen wirst du in diesem Tutorial Antworten finden:
Was ist eine "Code/Dll injection" und was bringt mir das - kann man das essen? [Only registered and activated users can see links. Click Here To Register...]
Was sind Dll-Dateien (dynamische/statische Bibliotheken) - kann man die ebenfalls essen? [Only registered and activated users can see links. Click Here To Register...]
Wie erstelle ich etwas, was "injected" werden soll?
und das wichtigste,
Wie mache ich so eine "Code injection" (/erstelle einen Injector)?
[Only registered and activated users can see links. Click Here To Register...]
Falls Fragen auftreten, die in diesem Tutorial unbeantwortet bleiben, habt ihr natürlich die Erlaubnis sie zu stellen! (doch nur, wenn ihr zuvor eine online Suchmaschine zu Rate gezogen habt. [Only registered and activated users can see links. Click Here To Register...] )
Was ist eine "Code/Dll injection"?
Abgesehen davon, dass die meisten, die dieses Tutorial lesen, es wahrscheinlich schon wissen, erkläre ich es hier nocheinmal: [Only registered and activated users can see links. Click Here To Register...]
Eine Code Injection ist das Zwischenfügen von einem Programmcode in einem Fremden Prozess. Stellen wir uns also folgendes vor:
Wir sind mal wieder am Programmieren [Only registered and activated users can see links. Click Here To Register...] und haben uns soeben eine Pizza in den Ofen geschoben - da wir gerade an einem äußerst kniffligem Algorithmus arbeiten vergessen wir darüber die Zeit. Eine volle Stunde später holen wir dann unsere verbrannte Pizza aus dem Ofen und ärgern uns, dass unser Programmier Editor keinen Wecker hat, der dieses hätte verhindern können.
Dank Code Injection könn man jedoch in den Editor genau so eine Funktion hinzufügen. Neben den Menüellementen "New", "Open" und "Save" könnte dann im Editor zusätzlich noch "Wecker" stehen und ein Fenster mit einstellbarer Alarmzeit würde sich bei einem Draufklicken öffnen.
Funktionieren tut dies folgendermaßen:
1. Wir schreiben eine Dll (siehe unten), die einige Weckerfunktionen beinhaltet.
2. Wir schreiben einen "Injector" (Spritzer [Only registered and activated users can see links. Click Here To Register...]) , der die Dll zu einem Teil des Editors macht - sprich: Einen von uns selbst erstellten Wecker Code (in form einer Dll) in den Editor schleust.
(Für wen Bibliotheken & Dll's bereits reine Routine sind, kann diesen Teil überspringen)
Was sind Dll-Dateien (dynamische/statische Bibliotheken)
"Dll" ist eine abkürzung für "Dynamic Link Library" -> also eine Dynamisch verbindbare Bibliothek. [Only registered and activated users can see links. Click Here To Register...]
Es gibt 2 gängige Arten von Bibliotheken (Bibliotheken = Dateien welche für andere Programme nutzbare Funktionen endhalten):
Die statischen (Static; meist die Dateiendungen ".o" und ".lib") und die dynamischen (Dynamic; ".dll") Librarys (Bibliotheken) [Only registered and activated users can see links. Click Here To Register...] .
Static library:
Eine Static library ist eine Datei, in der sich von andern Endwicklern vorgefertigte (compilite) Funktionen befinden. Diese Datein haben unter Windows meist die Datei-Endungen .o oder .lib und werden beim Erstellen einer .exe (ausführbaren Datei) die dessen Funktionen benutzt in das Programm (per Linker[=siehe Google oder einfach weiterlesen]) eingebunden [Only registered and activated users can see links. Click Here To Register...]. Man hat also nun eine ausführbare Datei.
Warum Leute soetwas machen -> genügt der source code denn nicht? [Only registered and activated users can see links. Click Here To Register...]
Wenn ein Entwickler anderen Leuten viele Funktionen zur Verfügung stellen will, dauert es lange, bis der Computer diese in Maschinencode übersetzt hat. Darum werden sie schon vorübersetzt mitgeliefert und man kann sie wesentlich schneller in sein neues Programm integrieren. [Only registered and activated users can see links. Click Here To Register...].
Vorteil einer Static library [Only registered and activated users can see links. Click Here To Register...] :
->Immer erreichbar und bloß 1 File, statt vieler. Außerdem bei erster Benutzung geringfügig schneller als eine dynamische Bibliothek, da die funktionen sich im Programm selbst befinden. und nicht erst eingefügt werden müssen.
->Schnelleres einbinden des Maschinen Codes in das Programm, als bei reinem Sourcecode - Somit ein schnelleres Erstellen
Nachteile [Only registered and activated users can see links. Click Here To Register...] :
->Die Static Library muss von jeder Datei, die dessen Funktionen nutzen will beim erstellen mit dem Linker eingebunden werden und erhöht so unnötig die Programmgröße, falls sie von mehr als nur einer .exe benutzt wird.
Und jetzt habt ihr die Erlaubnis laut aufzustöhnen, denn die static library ist für eine Dll injection nicht von Relevanz [Only registered and activated users can see links. Click Here To Register...] . Jedoch Solltet ihr über ein Gegenstück zu Dll-Datein informiert sein und die Dll lässt sich wesentlich leichter verstehen [Only registered and activated users can see links. Click Here To Register...], wenn man auch die static library kennt. Lieber zu viel wissen, als zu wenig :P
Dynamic Link Library (.dll):
Eine Dll enthält wie die Static library ebenfalls schon fertige (compilite) Funktionen, doch kann die Dll nicht (durch einen Linker) in die exe integriert werden, sondern muss vom laufendem Programm geladen werden werden.
Vorteile [Only registered and activated users can see links. Click Here To Register...] :
->Keine überflüssige Filegröße, wenn die funktionen von mehreren datein genutzt werden sollen.
->Leichter wartbar, da man wenn neue funktionen bei einem Update kommen man nicht das ganze programm neu ersetzen muss, sondern nur einige kleine Dll's.
->Die funktionen können zur Laufzeit geladen werden und müssen nicht beim erstellen der Datei eingebunden sein. Dies hat zum einen einen Resourcen Vorteil und zum anderen ist es für eine Code Injection ideal. [Only registered and activated users can see links. Click Here To Register...]
->Durch die Funktion DllMain kann die Dll beim eingebunden werden noch Vorkehrungen zum Initialisieren der Funktionen treffen.
Nachteile:
->Man hat mehrere Datein und es wird unter Umständen unübersichtlich [Only registered and activated users can see links. Click Here To Register...]
->Eine EXTRA Datei verbraucht geringfügig mehr Speicher als eine eingebundene und lohnt sich so gesehen also nur bei Benutzung von verschiedenen Prozessen.
Sie müssen extra in den Prozess geladen werden, bevor man dessen Funktionen nutzen kann -> was Zeit kostet. [Only registered and activated users can see links. Click Here To Register...]
Fazit:
Bei einer Dll injection macht man sich zum Vorteil, dass Dll-Dateien während der Laufzeit eingebunden werden können und spart somit beim Abändern eines fremden Prozesses eine menge Arbeit:
Statt, dass man seine "neuen" Funktionen komplett in Assembler (siehe Google) in den Prozess einfügen muss, muss man einfach nur den fremden Prozess die Dll laden lassen und dann in der DllMain funktion einen neuen Thread (Unterprozess des fremden Programmes, der parallele zum Hauptprozess ausgeführt wird) erstellen, der die gwünschten Funktionen aus der Dll aufruft. In unserem Hack beispiel, wäre das eine Funktion, die ein Menü Ellement hinzufügt und beim anklicken von diesem einen Wecker erstellt.
Praktisch ist hierbei, dass nahezu jeder Windows Prozess die kernel32.dll (näheres wie immer [Only registered and activated users can see links. Click Here To Register...]) benutzen muss, in der die Funktionen zum Dll laden vordefiniert sind.
Man muss also nur einen Aufruf dieser Kernel Funktionen mit der zu ladenen Dll als Parametern in das fremde Programm einfügen und schwups hat man seine Dll (bzw. Code) Injection! [Only registered and activated users can see links. Click Here To Register...].
Wie erstelle ich etwas, was "injected" werden soll?
So viel zur Theorie... die Praxis ist da leider etwas komplizierter [Only registered and activated users can see links. Click Here To Register...]
Wir brauchen also einen Injector (ein Programm, dass den fremden Prozess so verändert, dass die gewünschte Dll geladen wird) und eine Dll, die wir injecten können.
Als erstes erstellen wir die Dll. Ich benutze hier die Programmiersprache C++, doch kann auch eine beliebig andere Sprache zum erstellen von Dll-Datein verwendet werden [Only registered and activated users can see links. Click Here To Register...]
Ich habe die Dll übrigens auch angehängt.
Wer bereits einen Injector wie z.B. winject17b besitzt kann einmal probieren die Dll in NotePad zu injitieren und wird sehen, dass Notepad plötzlich fähig ist, eine Message Box auszugeben [Only registered and activated users can see links. Click Here To Register...]
Wie mache ich so eine "Code injection" (/erstelle einen Injector)?
Unser zweites Ziel ist es jetzt aber, selbst einen Injector zu basteln, der unsere Dll in einen fremden Prozess (ich nehme Notepad [Only registered and activated users can see links. Click Here To Register...] ) läd.
Dabei gehen wir nach folgendem Konzepte:
1. Wir schreiben den Pfad unserer Dll in das fremde Programm
2. Wir rufen die "LoadLibraryA" Funktion der Kernel Dll auf und übergeben ihr den Dll-Pfad als Parameter
3. Wir warten, bis alles geklappt hat und löschen dann den nicht mehr länger benötigten Dll Pfad aus dem fremden Prozess
Wir beginnen also mit einer schlichten Konsolen Anwendung - dem Grundgerüst eines solchen Programmes:
Dann brauchen wir natürlich den Pfad zu unserer Dll und eine Prozess ID des Programmes, in das wir den Code einschleusen wollen. Ich hole mir die PID über den Fensternamen, doch kann man sie alternativ natürlich auch eingeben lassen. [Only registered and activated users can see links. Click Here To Register...]
Jetzt müssen wir den Ziel Prozess für uns zum bearbeiten freigeben. Dies kann man mit der Funktion "OpenProcess" machen, die ein verwaltendes Handle zurück gibt.
Wir müssen also zu unseren Variablen noch eine weitere Variable vom Typ "HANDLE" hinzufügen. [Only registered and activated users can see links. Click Here To Register...]
Nun brauchen wir freien Speicherplatz im Ziel Prozess , um unseren Pfad in das Programm zu schreiben - täten wir das nicht, überschrieben wir im Ernstfall andere wichtige Funktionen oder Variablen. [Only registered and activated users can see links. Click Here To Register...] Diesen freien Platz kann man mit der Funktion "VirtualAllocEx" anfordern (alternativ kann man aber auch Code Caves benutzen), die uns die Adresse des Speichers übergibt und die wir wieder in einem HANDLE speichern.
Da uns jetzt nichts mehr im Wege steht den Pfad in den Prozess zu schreiben tun wir dies nun mit der Funktion "WriteProcessMemory":
Jetzt haben wir endlich den Pfad in den fremden Prozess geschleust und einem Aufruf der "LoadLibraryA" Funktion steht nichts mehr im Wege. Da dies jedoch im Ziel Prozess gemacht werden muss, bedienen wir uns der "CreateRemoteThread" Funktion und speichern wie gewohnt die Rückgabe in einem Handle. [Only registered and activated users can see links. Click Here To Register...]
Bravo[Only registered and activated users can see links. Click Here To Register...]! Der wichtigste Teil ist geschafft. Jetzt müssen wir nur noch warten bis die "LoadLibraryA" Funktion beendet und unsere Dll geladen ist und wir können die benutzen Resourcen weder freigeben. Zum warten eignet sich die Funktion "WaitForSingleObject", zum Speicherplatz freigeben die "VirtualFreeEx" Funktion und zum beenden der Prozessbearbeitung die "CloseHandle" Funktion. [Only registered and activated users can see links. Click Here To Register...]
Herzlichen Glückwunsch! Du du hast soeben einen eigenen Code Injector programmiert! [Only registered and activated users can see links. Click Here To Register...]
zusammengefügt sollte der Code etwa folgendermaßen aussehen:
Debug Rechte setzen:
Wenn wir unseren Injector an mehreren Programmen testen, merken wir jedoch, dass es Prozesse gibt, in die wir nicht injecten können [Only registered and activated users can see links. Click Here To Register...]
Doch keine Sorge, denn es ist nur unser Betriebssystem, das der meinung ist, unser Programm sei noch viel zu klein um über andere Programme bestimmen zu können :werderw:
Wir müssen uns also einfach nur das besondere Pivileg verleihen, fremde Prozesse bearbeiten zu dürfen. [Only registered and activated users can see links. Click Here To Register...] Dieses Privileg wird auch "Debug Privilege" genannt, da es in erster Linie von Debuggern (Wartungsprogramme; Eines der bekanntesten Debugger ist OllyDbg) benutzt wird.
Da wir also ein Debug Recht setzen müssen, heißt unsere Funktion:
Bei der Anmeldung eines Benutzers, wird ein Token (das unter anderem die Debug Privileg Information enthält) erstellt, in dem steht, was der User (und somit auch die Programme) darf oder nicht darf. Jeder Prozess bekommt eine Kopie dieses Tokens zugewiesen und eben diese nutzen wir jetzt um unser Recht durchzusetzen. (man beachte den Wortwitz [Only registered and activated users can see links. Click Here To Register...])
Wir brauchen also eine Variable für das Handle unsere Prozesses und eine für das Handle des Tokens.
Jetzt brauchen wir noch das neue Debug Privileg, dass wir in das Token statt des alten einsetzen können. [Only registered and activated users can see links. Click Here To Register...]
und eine LUID (Locally Unique Identifier). Dies ist eine Variable, die nur einmal auf dem PC vorkommt und in der eine art Privilegien-Erkennungsnummer abgespeichert wird, die wir brauchen, um festzulegen, was genau unser "neues" privileg bewirken soll. In unserem Falle wäre das die LUID von "seDebugPrivilege". [Only registered and activated users can see links. Click Here To Register...]
Da wir jetzt die LUID besitzen und unser token zum bearbeiten freigegeben haben, können wir jetzt endlich unser privileg konkretisieren und anpassen. Für den Fall, dass man mehrere Rechte auf einmal setzen will, ist das struct "[Only registered and activated users can see links. Click Here To Register...]" in ein Privilegien array und ein integer mit der anzahl der Privilegien, die man hinzufügen will, eingeteilt.
wir müssen also die Anzahl der zusetzenden Privilegen angeben (in unserem Fall nur eins) und dann noch schnell das Privileg beschreiben, bevor wir es dann setzen. [Only registered and activated users can see links. Click Here To Register...]
zum Schluss müssen wir nurnoch unsere beiden Handle wieder schließen und wir haben unsere funktion fertig! :burns:
Diese Funktion rufen wir dann am Anfang der "Main"-Funktion des injectors auf und können neue erfolgreichere Testversuche machen. [Only registered and activated users can see links. Click Here To Register...]
ACHTUNG: Der Injector muss mit Administratorrechten ausgeführt werden!
Ich hoffe sehr, dass euch das Tutorial gefallen hat und epvp&AutoitBot (Das Original Tutorial habe ich heir veröffentlicht: [Only registered and activated users can see links. Click Here To Register...]) freuen sich selbstverständlich über Ergebnisse! [Only registered and activated users can see links. Click Here To Register...]
MFG,
Deathly Assassin
Anmerkung: Im Anhang Befindet sich die im Tutorial benutzte Dll und eine Autoit UDF, die es ermöglicht in der Scriptsprache Autoit einen Injector zu erstellen (enthaltene Funktionen: _InjectAttachDll; _InjectDetachDllEx; _InjectDetachDll; _InjectModulInfo)
Hallo Elite PvPer! [Only registered and activated users can see links. Click Here To Register...]
Auf folgende Fragen wirst du in diesem Tutorial Antworten finden:
Was ist eine "Code/Dll injection" und was bringt mir das - kann man das essen? [Only registered and activated users can see links. Click Here To Register...]
Was sind Dll-Dateien (dynamische/statische Bibliotheken) - kann man die ebenfalls essen? [Only registered and activated users can see links. Click Here To Register...]
Wie erstelle ich etwas, was "injected" werden soll?
und das wichtigste,
Wie mache ich so eine "Code injection" (/erstelle einen Injector)?
[Only registered and activated users can see links. Click Here To Register...]
Falls Fragen auftreten, die in diesem Tutorial unbeantwortet bleiben, habt ihr natürlich die Erlaubnis sie zu stellen! (doch nur, wenn ihr zuvor eine online Suchmaschine zu Rate gezogen habt. [Only registered and activated users can see links. Click Here To Register...] )
Was ist eine "Code/Dll injection"?
Abgesehen davon, dass die meisten, die dieses Tutorial lesen, es wahrscheinlich schon wissen, erkläre ich es hier nocheinmal: [Only registered and activated users can see links. Click Here To Register...]
Eine Code Injection ist das Zwischenfügen von einem Programmcode in einem Fremden Prozess. Stellen wir uns also folgendes vor:
Wir sind mal wieder am Programmieren [Only registered and activated users can see links. Click Here To Register...] und haben uns soeben eine Pizza in den Ofen geschoben - da wir gerade an einem äußerst kniffligem Algorithmus arbeiten vergessen wir darüber die Zeit. Eine volle Stunde später holen wir dann unsere verbrannte Pizza aus dem Ofen und ärgern uns, dass unser Programmier Editor keinen Wecker hat, der dieses hätte verhindern können.
Dank Code Injection könn man jedoch in den Editor genau so eine Funktion hinzufügen. Neben den Menüellementen "New", "Open" und "Save" könnte dann im Editor zusätzlich noch "Wecker" stehen und ein Fenster mit einstellbarer Alarmzeit würde sich bei einem Draufklicken öffnen.
Funktionieren tut dies folgendermaßen:
1. Wir schreiben eine Dll (siehe unten), die einige Weckerfunktionen beinhaltet.
2. Wir schreiben einen "Injector" (Spritzer [Only registered and activated users can see links. Click Here To Register...]) , der die Dll zu einem Teil des Editors macht - sprich: Einen von uns selbst erstellten Wecker Code (in form einer Dll) in den Editor schleust.
(Für wen Bibliotheken & Dll's bereits reine Routine sind, kann diesen Teil überspringen)
Was sind Dll-Dateien (dynamische/statische Bibliotheken)
"Dll" ist eine abkürzung für "Dynamic Link Library" -> also eine Dynamisch verbindbare Bibliothek. [Only registered and activated users can see links. Click Here To Register...]
Es gibt 2 gängige Arten von Bibliotheken (Bibliotheken = Dateien welche für andere Programme nutzbare Funktionen endhalten):
Die statischen (Static; meist die Dateiendungen ".o" und ".lib") und die dynamischen (Dynamic; ".dll") Librarys (Bibliotheken) [Only registered and activated users can see links. Click Here To Register...] .
Static library:
Eine Static library ist eine Datei, in der sich von andern Endwicklern vorgefertigte (compilite) Funktionen befinden. Diese Datein haben unter Windows meist die Datei-Endungen .o oder .lib und werden beim Erstellen einer .exe (ausführbaren Datei) die dessen Funktionen benutzt in das Programm (per Linker[=siehe Google oder einfach weiterlesen]) eingebunden [Only registered and activated users can see links. Click Here To Register...]. Man hat also nun eine ausführbare Datei.
Warum Leute soetwas machen -> genügt der source code denn nicht? [Only registered and activated users can see links. Click Here To Register...]
Wenn ein Entwickler anderen Leuten viele Funktionen zur Verfügung stellen will, dauert es lange, bis der Computer diese in Maschinencode übersetzt hat. Darum werden sie schon vorübersetzt mitgeliefert und man kann sie wesentlich schneller in sein neues Programm integrieren. [Only registered and activated users can see links. Click Here To Register...].
Vorteil einer Static library [Only registered and activated users can see links. Click Here To Register...] :
->Immer erreichbar und bloß 1 File, statt vieler. Außerdem bei erster Benutzung geringfügig schneller als eine dynamische Bibliothek, da die funktionen sich im Programm selbst befinden. und nicht erst eingefügt werden müssen.
->Schnelleres einbinden des Maschinen Codes in das Programm, als bei reinem Sourcecode - Somit ein schnelleres Erstellen
Nachteile [Only registered and activated users can see links. Click Here To Register...] :
->Die Static Library muss von jeder Datei, die dessen Funktionen nutzen will beim erstellen mit dem Linker eingebunden werden und erhöht so unnötig die Programmgröße, falls sie von mehr als nur einer .exe benutzt wird.
Und jetzt habt ihr die Erlaubnis laut aufzustöhnen, denn die static library ist für eine Dll injection nicht von Relevanz [Only registered and activated users can see links. Click Here To Register...] . Jedoch Solltet ihr über ein Gegenstück zu Dll-Datein informiert sein und die Dll lässt sich wesentlich leichter verstehen [Only registered and activated users can see links. Click Here To Register...], wenn man auch die static library kennt. Lieber zu viel wissen, als zu wenig :P
Dynamic Link Library (.dll):
Eine Dll enthält wie die Static library ebenfalls schon fertige (compilite) Funktionen, doch kann die Dll nicht (durch einen Linker) in die exe integriert werden, sondern muss vom laufendem Programm geladen werden werden.
Vorteile [Only registered and activated users can see links. Click Here To Register...] :
->Keine überflüssige Filegröße, wenn die funktionen von mehreren datein genutzt werden sollen.
->Leichter wartbar, da man wenn neue funktionen bei einem Update kommen man nicht das ganze programm neu ersetzen muss, sondern nur einige kleine Dll's.
->Die funktionen können zur Laufzeit geladen werden und müssen nicht beim erstellen der Datei eingebunden sein. Dies hat zum einen einen Resourcen Vorteil und zum anderen ist es für eine Code Injection ideal. [Only registered and activated users can see links. Click Here To Register...]
->Durch die Funktion DllMain kann die Dll beim eingebunden werden noch Vorkehrungen zum Initialisieren der Funktionen treffen.
Nachteile:
->Man hat mehrere Datein und es wird unter Umständen unübersichtlich [Only registered and activated users can see links. Click Here To Register...]
->Eine EXTRA Datei verbraucht geringfügig mehr Speicher als eine eingebundene und lohnt sich so gesehen also nur bei Benutzung von verschiedenen Prozessen.
Sie müssen extra in den Prozess geladen werden, bevor man dessen Funktionen nutzen kann -> was Zeit kostet. [Only registered and activated users can see links. Click Here To Register...]
Fazit:
Bei einer Dll injection macht man sich zum Vorteil, dass Dll-Dateien während der Laufzeit eingebunden werden können und spart somit beim Abändern eines fremden Prozesses eine menge Arbeit:
Statt, dass man seine "neuen" Funktionen komplett in Assembler (siehe Google) in den Prozess einfügen muss, muss man einfach nur den fremden Prozess die Dll laden lassen und dann in der DllMain funktion einen neuen Thread (Unterprozess des fremden Programmes, der parallele zum Hauptprozess ausgeführt wird) erstellen, der die gwünschten Funktionen aus der Dll aufruft. In unserem Hack beispiel, wäre das eine Funktion, die ein Menü Ellement hinzufügt und beim anklicken von diesem einen Wecker erstellt.
Praktisch ist hierbei, dass nahezu jeder Windows Prozess die kernel32.dll (näheres wie immer [Only registered and activated users can see links. Click Here To Register...]) benutzen muss, in der die Funktionen zum Dll laden vordefiniert sind.
Man muss also nur einen Aufruf dieser Kernel Funktionen mit der zu ladenen Dll als Parametern in das fremde Programm einfügen und schwups hat man seine Dll (bzw. Code) Injection! [Only registered and activated users can see links. Click Here To Register...].
Wie erstelle ich etwas, was "injected" werden soll?
So viel zur Theorie... die Praxis ist da leider etwas komplizierter [Only registered and activated users can see links. Click Here To Register...]
Wir brauchen also einen Injector (ein Programm, dass den fremden Prozess so verändert, dass die gewünschte Dll geladen wird) und eine Dll, die wir injecten können.
Als erstes erstellen wir die Dll. Ich benutze hier die Programmiersprache C++, doch kann auch eine beliebig andere Sprache zum erstellen von Dll-Datein verwendet werden [Only registered and activated users can see links. Click Here To Register...]
Ich habe die Dll übrigens auch angehängt.
Wer bereits einen Injector wie z.B. winject17b besitzt kann einmal probieren die Dll in NotePad zu injitieren und wird sehen, dass Notepad plötzlich fähig ist, eine Message Box auszugeben [Only registered and activated users can see links. Click Here To Register...]
Wie mache ich so eine "Code injection" (/erstelle einen Injector)?
Unser zweites Ziel ist es jetzt aber, selbst einen Injector zu basteln, der unsere Dll in einen fremden Prozess (ich nehme Notepad [Only registered and activated users can see links. Click Here To Register...] ) läd.
Dabei gehen wir nach folgendem Konzepte:
1. Wir schreiben den Pfad unserer Dll in das fremde Programm
2. Wir rufen die "LoadLibraryA" Funktion der Kernel Dll auf und übergeben ihr den Dll-Pfad als Parameter
3. Wir warten, bis alles geklappt hat und löschen dann den nicht mehr länger benötigten Dll Pfad aus dem fremden Prozess
Wir beginnen also mit einer schlichten Konsolen Anwendung - dem Grundgerüst eines solchen Programmes:
Code:
#include "windows.h"//Für spätere Funktionen nötig
#include <iostream>//Für spätere Funktionen nötig
using namespace std;//Für spätere Funktionen nötig
int main(int argc, char* argv)//Programm Einstieg
{
}
Code:
#include "windows.h"
#include <iostream>
using namespace std;
char const Path[]="C:\\Message Box.dll";//deklariert den Pfad zu unserer dll
int main(int argc, char* argv)
{
HANDLE hWnd;
DWORD PID;
hWnd = FindWindow(0, "Unbenannt - Editor");//sucht nach dem angegebenen Fenster und gibt das Hwnd zurück
//Parameter 1: evtl. Klasse des Fensters; Parameter 2: Titel des Fensters
GetWindowThreadProcessId((HWND)hWnd, &PID);//legt die PID in der Variable PID ab
//Parameter 1: hWnd eines Fensters des Prozesses; Parameter 2: Variable, in die die PID abgelegt werden soll
}
Wir müssen also zu unseren Variablen noch eine weitere Variable vom Typ "HANDLE" hinzufügen. [Only registered and activated users can see links. Click Here To Register...]
Code:
HANDLE hWnd, hProcess;
DWORD PID;
hWnd = FindWindow(0, "Unbenannt - Editor");
GetWindowThreadProcessId((HWND)hWnd, &PID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);//öffnet den Prozess mit den Berechtigungen, zum schreiben, lesen, ausführen, etc. (PROCESS_ALL_ACCESS)
//Parameter 1: Zugriffs Berechtigungen; Parameter 2: unwichtig, aber auf google nachlesbar; Parameter 3: Die PID des Prozesses, der geöffnet werden soll
Code:
HANDLE hWnd, hProcess, AllocAdresse;
DWORD PID;
hWnd = FindWindow(0,"Unbenannt - Editor");
GetWindowThreadProcessId((HWND)hWnd, &PID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
AllocAdresse = VirtualAllocEx(hProcess, 0, sizeof(Path), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
//Parameter 1: Handle zum Prozess; Parameter 2: Adresse ab der nach freiem Speicher gesucht werden soll
//Parameter 3: Größe des anzuvordernen Speichers; Parameter 4: siehe [url=http://msdn.microsoft.com/en-us/library/aa366890%28VS.85%29.aspx]VirtualAllocEx Function (Windows)[/url]
//Parameter 5: Wofür der Speicher verwendet werden soll (siehe [url=http://msdn.microsoft.com/en-us/library/aa366786%28VS.85%29.aspx]Memory Protection Constants (Windows)[/url])
Code:
WriteProcessMemory(hProcess, (void*)AllocAdresse, (void*)Path, sizeof(Path), 0); //Parameter 1: Handle zum Prozess; Parameter 2: StartAdresse, des zu beschreibenen Speichers //Parameter 3: der Wert, der in den Speicher geschrieben werden soll; Parameter 4: Speichergröße des Wertes //Parameter 5: unwichtig - siehe [url=http://msdn.microsoft.com/en-us/library/ms681674%28VS.85%29.aspx]WriteProcessMemory Function (Windows)[/url]
Code:
HANDLE hWnd, hProcess, AllocAdresse, hRemoteThread;
DWORD PID;
hWnd = FindWindow(0,"Unbenannt - Editor Editor");
GetWindowThreadProcessId((HWND)hWnd, &PID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
AllocAdresse = VirtualAllocEx(hProcess, 0, sizeof(Path), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess, (void*)AllocAdresse, (void*)Path, sizeof(Path), 0);
hRemoteThread=CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"), AllocAdresse, 0, 0);
//Parameter 1: Prozess Handle; Parameter 2: unwichtig - siehe [url=http://msdn.microsoft.com/en-us/library/ms682437%28VS.85%29.aspx]CreateRemoteThread Function (Windows)[/url]
//Parameter 3: Thread Stack Größe (siehe [url=http://msdn.microsoft.com/en-us/library/ms686774(VS.85).aspx]Thread Stack Size (Windows)[/url])
//Parameter 4: Die Adresse der Funktion, die aufgerufen werden soll; Parameter 5: übergebene Parameter
//Parameter 5&6: unwichtig -> siehe [url=http://msdn.microsoft.com/en-us/library/ms682437%28VS.85%29.aspx]CreateRemoteThread Function (Windows)[/url]
Code:
WaitForSingleObject(hRemoteThread, INFINITE);
//Parameter 1: Handle zum Object; Parameter 2: Wartezeit in Millisekunden (INFINITE steht für unendlich lang, ist aber einfach nur eine sehr hohe Zahl)
VirtualFreeEx(hProcess, AllocAdresse, sizeof(Path), MEM_DECOMMIT);
//Parameter 1: Handle zum Prozess; Parameter 2: freizugebende Startadresse; Parameter 3: größe des freizugebenden Speichers
//Parameter 4: Typ des freizugebenden Speichers (siehe [url=http://msdn.microsoft.com/en-us/library/aa366894%28VS.85%29.aspx]VirtualFreeEx Function (Windows)[/url])
CloseHandle(hProcess);
//Parameter 1: Handle zum Prozess
zusammengefügt sollte der Code etwa folgendermaßen aussehen:
Debug Rechte setzen:
Wenn wir unseren Injector an mehreren Programmen testen, merken wir jedoch, dass es Prozesse gibt, in die wir nicht injecten können [Only registered and activated users can see links. Click Here To Register...]
Doch keine Sorge, denn es ist nur unser Betriebssystem, das der meinung ist, unser Programm sei noch viel zu klein um über andere Programme bestimmen zu können :werderw:
Wir müssen uns also einfach nur das besondere Pivileg verleihen, fremde Prozesse bearbeiten zu dürfen. [Only registered and activated users can see links. Click Here To Register...] Dieses Privileg wird auch "Debug Privilege" genannt, da es in erster Linie von Debuggern (Wartungsprogramme; Eines der bekanntesten Debugger ist OllyDbg) benutzt wird.
Da wir also ein Debug Recht setzen müssen, heißt unsere Funktion:
Code:
void SetDebugPrivilege() {}
Wir brauchen also eine Variable für das Handle unsere Prozesses und eine für das Handle des Tokens.
Code:
void SetDebugPrivilege()
{
HANDLE hProcess=GetCurrentProcess(), hToken;
}
Code:
void SetDebugPrivilege()
{
HANDLE hProcess=GetCurrentProcess(), hToken;
TOKEN_PRIVILEGES priv;
}
Code:
void SetDebugPrivilege()
{
HANDLE hProcess=GetCurrentProcess(), hToken;
TOKEN_PRIVILEGES priv;
LUID luid;
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);//öffnet unser Prozess token zum "anpassen"(adjust) und speichert ein handle zum verwalten in hToken ab.
LookupPrivilegeValue(0, "seDebugPrivilege", &luid)/*speichert den LUID wert von "seDebugPrivilege" in die LUID-Variable. 0 heißt,
dass es die LUID von unserem System und nicht etwa die eines remote-systems sein soll*/
}
wir müssen also die Anzahl der zusetzenden Privilegen angeben (in unserem Fall nur eins) und dann noch schnell das Privileg beschreiben, bevor wir es dann setzen. [Only registered and activated users can see links. Click Here To Register...]
zum Schluss müssen wir nurnoch unsere beiden Handle wieder schließen und wir haben unsere funktion fertig! :burns:
Diese Funktion rufen wir dann am Anfang der "Main"-Funktion des injectors auf und können neue erfolgreichere Testversuche machen. [Only registered and activated users can see links. Click Here To Register...]
ACHTUNG: Der Injector muss mit Administratorrechten ausgeführt werden!
Ich hoffe sehr, dass euch das Tutorial gefallen hat und epvp&AutoitBot (Das Original Tutorial habe ich heir veröffentlicht: [Only registered and activated users can see links. Click Here To Register...]) freuen sich selbstverständlich über Ergebnisse! [Only registered and activated users can see links. Click Here To Register...]
MFG,
Deathly Assassin
Anmerkung: Im Anhang Befindet sich die im Tutorial benutzte Dll und eine Autoit UDF, die es ermöglicht in der Scriptsprache Autoit einen Injector zu erstellen (enthaltene Funktionen: _InjectAttachDll; _InjectDetachDllEx; _InjectDetachDll; _InjectModulInfo)