Der Begriff Trojanisches Pferd oder Trojaner tritt im Bereich der IT-Sicherheit öfters auf.
In diesem Artikel wird kurz dargestellt, was ein Trojaner ist. Des weiteren wird die prinzipielle Vorgehensweise zur Erstellung eines Trojaners beschrieben.
Was ist ein Trojaner ?
Der Name stammt aus einer Mythologie in der Griechische Krieger den Trojanern ein Friedensangebot machten und ein großes holz Pferd schenkten, indem sich Krieger befanden.
Als Trojaner bezeichnet man eine Malware, die den Anschein einer normalen und nützlichen Software hat.
Neben der eigentlichen Funktionalität wird weiterer Programmcode ausgeführt
Einer "Wirtsdatei" wird weiterer Code beigefügt, sodass die eigentliche Datei problemlos ausgeführt werden kann. So wird die Malware mit den entsprechenden Benutzer Rechten des Anwenders ausgeführt und oftmals nicht als diese Identifiziert.
Funktionsweise der Erstellung eines Trojaners
Vorneweg: Der Folgende Abschnitt wird etwas technischer.
Voraussetzung ist ein grundlegendes Verständnis von dem Aufbau eines Programmes(Stack, Register, Pointer)
Disclaimer: Ich möchte niemanden motivieren einen Trojaner zu erstellen um anderen damit zu schaden.
Hier soll lediglich die prinzipielle Vorgehensweise bei der Erstellung aufgezeigt werden.
1 Code Cave suchen
Um in einer Datei weiteren Code einzuschleusen gibt es grundsätzlich zwei Möglichkeiten. Entweder fügt man eine Section hinzu. Dies hat den Nachteil, dass die Datei sich in ihrer Größe verändert. Besser ist es, eine bereits bestehende Section zu verwenden. Dafür sucht man sich einen Code Cave. Ein Code Cave sind grob gesagt leere Bytes innerhalb einer Section die überschrieben werden können, ohne das Programm zu beeinflussen.
Wichtig zu beachten ist hierbei, dass das gewählte Programmsegment die Flags zum beschreiben und zum Ausführen gesetzt hat.
2 Programmfluss hijacken
Damit ist gemeint, im normalen Programmfluss an einer Stelle einen Sprungbefehl zum Code Cave einfügen(Schritt 1. in der Graphik). Somit springt das Programm zu unserem Teil einer Section, in die wir Code einfügen.
3 Schadcode einschleusen
3.1 Register sichern
Als erstes müssen die Register gesichert werden. Damit wird sichergestellt, dass unser Programm nach der Ausführung unseres Codes regulär weiter laufen kann.
3.2 Schadcode/Shellcode einfügen
Als Shellcode bezeichnet man OP-Codes (also eine Reihe von Maschinenbefehlen abhängig vom Prozessortyp), die eine Shell öffnen. In der Regel möchte man hier eine Reverse Shell erzeugen.
3.3 Stackpointer ausrichten
Um die Register zurücksetzen zu können muss der Stackpointer wieder an die Stelle ausgerichtet werden, an der die Register abgelegt worden sind.
3.4 Register laden
Die in 3.1 gesicherten Register des normalen Programmflusses werden wieder geladen, damit das Programm nach Ausführung unseres Codes normal weiter laufe kann.
3.5 Instruktionen wiederherstellen
An der Stelle, wo der Sprung auf unsern Code stattgefunden hat, wurde eine "reguläre" Instruktion des Programmes überschrieben. Diese wird an dieser Stelle ausgeführt.
3.6 Sprungbefehl zurück zu normalen Programmcode
Jetzt muss nur noch an die Stelle gesprungen werden, an der das eigentliche Programm weiterlaufen würde. Das Programm kann nun regulär weiterlaufen nachdem unser Code ausgeführt wurde.
Weitere Schritte
Der Trojaner wird an vermutlich direkt von einem Anti-Viren-Programm erkannt (Der Shellcode ist in der Signaturliste des Hersetellers). Der nächste Schritt wäre also diesen vor der Erkennung von AV Programmen zu schützen. Dies würde den Rahmen dieses Beitrags sprengen. Über die von AV Software genutzten Erkennungsmechanismen werde ich einen separaten Beitrag schreiben.
Ich hoffe ihr konntet diesem diesmal etwas technischeren Beitrag folgen. Bei Anmerkungen / offenen Fragen beantworte ich diese natürlich gerne in den Kommentaren.