Die vorliegende Arbeit dient der genaueren Betrachtung der Obfuscation auf der Windows-Kommandozeile (sog. DOSfucation), unterteilt in ein theoretisches und ein praktisches Segment.
Im Kontext der Computertechnik findet man den Begriff Verschleierung (engl. Obfuscation) bei verschiedenen Methoden, die eines gemeinsam haben: Die Lesbarkeit der Inhalte für den menschlichen Leser zu unterbinden oder zumindest zu erschweren. Davon abzugrenzen ist der allgemeine Begriff Obfuscation, der auch für die Beschreibung von Möglichkeiten zur Erhöhung von Privatsphäre im digitalen Raum verwendet wird.
Die Gründe für Obfuscation sind vielfältig. So gibt es Entwickler, die den eigenen programmierten Code veröffentlichen oder weitergeben möchten, eine Veränderung oder Analyse des Programms aber nicht wünschen. Gerade bei Skriptsprachen oder vom Endnutzer selbst zu kompilierenden Quellen sind die Algorithmen im Klartext vorhanden und können diesem Konflikt unterliegen. Auch fertig compilierte Executables sind dem Risiko von Code-Analyse und Reverse Engeneering (Rückgewinnung von Informationen über die Alogrithmen oder gar Generierung von lesbarem Quellcode aus Binärcode) ausgesetzt.
Für die verschiedenen Programmiersprachen gibt es unzählige Frameworks, die den Entwicklern helfen, ihre Quelltexte und Programme derart unlesbar zu machen, dass eine Analyse mit ungleich höherem (Zeit-)aufwand verbunden ist. Der Schutz geistigen Eigentums wird derart nach Bedarf automatisiert und für den Urheber unkompliziert gewährleistet.
Die Möglichkeiten zur Verschleierung, gerade im Programmierbereich, sind aufgrund der nahezu unendlichen Freiheitsgrade auch für kreative Coder interessant. So gibt es seit Jahren verschiedene Wettbewerbe um den unlesbarsten noch funktionierenden Code.
Inhaltsverzeichnis
Abbildungsverzeichnis
Abkürzungsverzeichnis
1 Theorieteil: Verschleierungstechniken
1.1 Einleitung
1.1.1 Malware-Obfuscation
1.1.2 Malware-Verhalten
1.2 Obfuscation-Methoden in der Kommandozeile
1.2.1 Slicing von Umgebungsvariablen
1.2.2 Variablen-Verkettung
1.2.3 Einfügen von Junk-Zeichen
1.2.4 FOR-Loops
1.2.5 Reversal FOR-Loops
1.2.6 FINcoding
1.2.7 Ergänzende Möglichkeiten der Verschleierung
1.2.8 Fazit und Übersicht Verschleierung
1.3 Revoke Obfuscation
2 Praktischer Teil: Invoke-Obfuscation Framework
2.1 Überblick Obfuscation Frameworks
2.2 Invoke-DOSfuscation
2.2.1 Anwendungsgebiete DOSfuscation-Framework
2.2.2 Funktionsweise
2.2.3 Limitierung
2.3 Test-Setup
2.4 Payload-Sample
2.5 F azit: Obfuscation in der Praxis
3 Aufgabenstellung
Literaturverzeichnis
Abbildungsverzeichnis
1 BatchEncryption1
2 FIN-Coding – Ein-/Ausgabe Shell
3 PowerShell.exe base64 encoding
4 VBAfuscation- und DOSfuscation-Layer
5 AST-Analysis2
6 obfuscated symbolic.ps13
7 Cosinus-Ähnlichkeit im Vergleich4
8 Revoke-Obfuscation Framework Output5
9 Hauptmenü Invoke-DOSfuscation
10 Ausführung einfacher RemoteCode
11 Windows-Defender - Ausführung RemoteCode unterbunden
12 VirusTotal-Prüfung von einfachem RemoteCode
13 RemoteCode-Obfuscaion mit FORcoding
14 RemoteCode-Obfuscaion mit reversal FORcoding
15 Windows Defender Message-Database Foretype.A!ml
16 PS-Skript Ausführung mit aktivem Bitdefender Total Security
Abkürzungsverzeichnis
Abbildung in dieser Leseprobe nicht enthalten
1 Theorieteil: Verschleierungstechniken
1.1 Einleitung
Im Kontext der Computertechnik findet man den Begriff Verschleierung (engl. Obfus-cation) bei verschiedenen Methoden, die eines gemeinsam haben: Die Lesbarkeit der Inhalte für den menschlichen Leser zu unterbinden oder zumindest zu erschweren. Da-von abzugrenzen ist der allgemeine Begriff Obfuscation, der auch für die Beschreibung von Möglichkeiten zur Erhöhung von Privatsphäre im digitalen Raum verwendet wird6.
Die Gründe für Obfuscation sind vielfältig. So gibt es Entwickler, die den eigenen pro-grammierten Code veröffentlichen oder weitergeben möchten, eine Veränderung oder Analyse des Programms aber nicht wünschen. Gerade bei Skriptsprachen oder vom Endnutzer selbst zu kompilierenden Quellen sind die Algorithmen im Klartext vorhan-den und können diesem Konflikt unterliegen.
Auch fertig compilierte Executables sind dem Risiko von Code-Analyse und Reverse Engeneering (Rückgewinnung von Informationen über die Alogrithmen oder gar Ge-nerierung von lesbarem Quellcode aus Binärcode) ausgesetzt.
Für die verschiedenen Programmiersprachen gibt es unzählige Frameworks 7, die den Entwicklern helfen ihre Quelltexte und Programme derart unlesbar zu machen, dass eine Analyse mit ungleich höherem (Zeit-)aufwand verbunden ist. Der Schutz geistigen Eigentums wird derart nach Bedarf automatisiert und für den Urheber unkompliziert gewährleistet. Die Möglichkeiten zur Verschleierung, gerade im Programmierbereich, sind aufgrund der nahezu unendlichen Freiheitsgrade auch für kreative Coder inter-essant. So gibt es seit Jahren verschiedene Wettbewerbe um den unlesbarsten noch funktionierenden Code8
1.1.1 Malware-Obfuscation
Eines der Hauptanwendungsfelder von Verschleierung findet man jedoch im Bereich Cyber Security. Viren, Trojaner, Würmer und andere Arten von Malware sind meist statisch generiert. Aus Angreifer-Sicht sind die Attacken laufend mit Gegenmaßnah-men wie Intrusion Detection Systems (IDS) 9 konfrontiert. Diese basieren größtenteils auf statischen Signaturen von bereits bekannter und analysierter Malware und ergän-zend dazu werden auffällige Operationen dynamisch mittels Verhaltensanalyse geblockt oder zumindest protokolliert. Obfuscation hilft hier den Angreifern dabei, den Schad-code zu variieren und dadurch die Erkennungswahrscheinlichkeit zu senken.
Die vorliegende Arbeit dient der genaueren Betrachtung der Obfuscation auf der Windows-Kommandozeile (sog. DOSfucation 10 ). Zwar sind die Mechanismen schon sehr alt, dennoch ist VBA-Makrocode (VisualBasic for Applications) in präparierten Office-Dokumenten, die Dropper auf Kommandozeilenebene ausführen lassen, aktueller den je11. Dropper sind Malware-Module, die weiteren Schadcode nachladen, Eine Verschleierung von Shell -Befehlen scheint jedoch relativ neu zu sein. Malware-Analysten des Antiviren-Herstellers G-Data beispielsweise waren bei einer der ersten Entdeckungen 2018 von einem Versehen ausgegangen. Man habe zunächst angenom-men, es handele sich um einen Exportfehler bei der Analyse12.
Sicherlich einer der bekanntesten Angriffe der letzten Monate ist unter dem Namen Emotet bekannt gewordene. Die Malware, welche als Einfallstor die klassische, auto-matisierte und individualisierte E-Mail mit Microsoft Office Dateien verwendet. Hier führen einfache CMD-Kommandos (Commandline) zu einem Nachladen weiterer Module13. Als Basis diente das Whitepaper der Firma FireEye (vgl. [Boh19]), dessen Grundlagen bereits auf der BlackHat USA 2017 der breiten Öffentlichkeit vorgestellt wurden14.
1.1.2 Malware-Verhalten
Meist um der statischen Malware-Erkennung auf Basis von Signaturen zu entgehen, wird die eigentliche Payload (z.B. Keylogger 15 , Verschlüsselungstrojaner, Reverse-Shell 16 und andere Hintertüren) erst nach dem ersten Angriff vom sog. Dropper nachgeladen und deren Einsatz ggf. vorbereitet. Um den Initialangriff möglichst unauffällig zu ge-stalten, greift man oftmals auf betriebssystemeigene Programme und Schnittstellen zurück, da diese von Hause aus zum Normalbetrieb gehören und per se unauffälli-ger erscheinen als Drittanbieter- Executables. So nutzen nicht wenige Malware-Autoren gerne die Office-Produkte mit VBA, die von vielen Nutzern unbedarft geöffnet wer-den und leicht einen automatisierten Einstieg in die Kommandozeilenebene mit deren Microsoft-Systemprogrammen cmd.exe und PowerShell.exe bieten. Deren Freiheits-grade scheinen schier unendlich und daher gilt es einen anderen Ansatz für die Entde-ckung zu wählen. Gerade PowerShell.exe ist besonders beliebt, da Windows Dateien wie .exe, .bat, .wsf, .LNK einen direkten Aufruf der Shell grundsätzlich erlauben. Man kann diese Kombination aus Office-VBA und Kommandozeile auch als ’Schema F’ bezeichnen, da die Angriffe seit längerem prinzipiell gleich ablaufen17.
IDS beobachten zur Erkennung, zusätzlich zur statischen Analyse, das Verhalten der aktiven Prozesse und Dienste. Malware startet in vielen Fällen Subprozesse, die nach bestimmten Kriterien als auffällig gelten. So sind Prozesse oder Registry-Vorgänge, die einen Powershell-Aufruf über die cmd.exe enthalten, genauer zu betrachten. Diese verdächtigen Operationen können als sog. IOC 18 (Indicator of Compromise) definiert und durch ein IDS automatisert überprüft werden. Allerdings sind diese Filter, die Übergabeparameter an Executables analysieren, gezielt durch Obfuscation umgehbar. Standard-Filter zielen nämlich auf die entsprechenden namentlichen Strings in den Subprozess-Aufrufen.
1.2 Obfuscation-Methoden in der Kommandozeile
Während andere Obfuskationsarten, wie bspw. bei Quellcodes (vgl. Abschnitt 1.1), auf die Lesbar- respektive Unlesbarkeit für Menschen abzielen, stellt das aufwändi-gere Reverse-Engineering bei der DOSfucation nur einen Nebeneffekt dar. Hier geht es vor allem darum, durch Komplexität die Filter möglicherweise eingesetzter IDS zu umgehen. Die Faszination bei der Obfuscation könnte auch darin zu sehen sein, dass die verschleierten Kommandos genauso uneingeschränkt funktionieren, wie die lesba-ren Pendants. Nach der vollständigen Interpretation und damit unmittelbar vor der Ausführung durch die Shell-Executables sind sie de facto identisch.
Schwerpunkt der Bemühungen liegen oftmals auf der Verschleierung der aufgerufenen System-Executables wie die PowerShell.exe, bei deren Aufruf als Subprocess nahezu alle ’Warnlampen’ angehen sollten.
Die nachfolgend beschrieben Methoden sind beliebig kombinierbar und kommen in der ’freien Wildbahn’ weiterhin vor, obwohl sie bereits länger bekannt sind. Die Vor-stellung ist natürlich nicht abschließend und unterliegt immer wieder der Ergänzung von kreativen neuen Ideen und Verbesserungen durch Sicherheitsforscher und natürlich auch den Gegnern auf der Seite der Malware-Entwickler.
1.2.1 Slicing von Umgebungsvariablen
Ein einfacher Typ der Verschleierungsmethoden, die auf die Subprocess-Aufrufe der cmd.exe zielen, ist das ’Ausschneiden’ von Teilen einzelner oder mehrerer Umgebungs-variablen. Dabei kann man auf im System vorhandene Umgebungsvariablen zurück-greifen, die teilweise auch unabhängig von der Sprachversion des Betriebssytems im-mer gleich lauten und daher eine Art Konstante darstellen. Darauf aufbauende Ob-fuscations sind relativ zuverlässig, was die Funktion angeht. Eine dieser ’konstanten’ Variablen wäre bspw. der PSModulePath, der den Pfad zu den internen Modulen der PowerShell.exe beinhaltet und damit auch den String der Executable. Die Umge-bungsvariablen sind änderbar und werden durch den Interpreter der cmd.exe bei Ver-wendung des Prozentzeichens vor und nach dem Variablennamen (z.B. %USERPROFILE% für das Home-Verzeichnis des angemeldeten Benutzers) aufgelöst. Auf Teile der Um-gebungsvariable kann man mittels Index zugreifen: %NAME: POSITION,ANZAHL%, dabei beginnt die Zählung der Position bei der in der Informatik üblichen Stelle 0.
Abbildung in dieser Leseprobe nicht enthalten
Zur Maskierung von PowerShell.exe reicht es also bereits einen der Buchstaben zu ersetzen, um eine reine Stringsuche nach der Executable ins Leere laufen zu lassen. Gebräuchlich sind auch RegEx-Suchpattern 19, die aber gleichsam bereits durch diese einfache Maßnahme unterlaufen werden, sofern sie nicht auf Obfuscation hin opti-miert werden. Nachfolgend die Verschleierung des Aufrufs von PowerShell.exe aus der Kommandozeile heraus, die Ausführungen wurden zum besseren Verständnis stark vereinfacht:
Abbildung in dieser Leseprobe nicht enthalten
Dabei spielt es keine Rolle, ob Groß- oder Kleinbuchstaben gewählt werden, da die Shell nicht case sensitiv ist.
Neben dem Rückgriff auf vorhandene Environment-Variablen ist eine Definition ei-gens angelegter Alphabet-Variablen denkbar. So wären nicht nur einzelne Buchstaben von Parametern substituierbar, sondern ganze Befehlsketten. Die gewählten Variablen-namen haben dabei keinerlei Bedeutung und können zudem die Lesbarkeit zusätzlich erschweren. Möglich ist auch die Verwendung negativer Indizes, welche den definierten Zeichensatz vom Ende her betrachten:
Abbildung in dieser Leseprobe nicht enthalten
Eine Kombination der Nutzung aus vorhandenen und proprietären Variablen (engl.: known and custom environment variable substring encoding) wurde bereits im Einsatz entdeckt.
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 1: BatchEncryption20
Das Framework BatchEncryption 21 verschleiert Batch-Shell-Skripte wie die Malware MSWORD_WRAPPER.bat mit beiden Varianten, dabei wurde der Name der Um-gebungsvariable auf ein Zeichen (einfaches Hochkomma) beschränkt und die Payload aus Einzelbuchstaben zusammengesetzt. (s. Abbildung 1, oberer Bereich: Variablende-finition der Variable ’, unterer Bereich: Payload kombiniert aus einzelnen Teilen der Variablen ’).
1.2.2 Variablen-Verkettung
Neben dem Slicing (vgl. Abschnitt 1.2.1) kann die Payload natürlich auch auf verschie-dene Variablen aufgeteilt und zur Ausführung wieder kombiniert werden. Der Parameter /c beim Aufruf der cmd.exe im dargestellten Beispiel sorgt dafür, dass nach Ausführung der übergebenen Parameter die Instanz wieder beendet wird. Das Minuszeichen am Ende der PIPE-chain unterdrückt die sonstigen Ausgaben der PowerShell.exe, da die Anzeige der Versionsinformationen und des Prompts nur stö-ren würden.
Abbildung in dieser Leseprobe nicht enthalten
1.2.3 Einf ü gen von Junk-Zeichen
Es existieren zahlreiche Zeichen, die von der cmd.exe als solches nicht interpretiert wer-den oder derart zu Zwecken der Obfuscation verwendet werden, dass diese neutralisiert werden und so keine Auswirkungen haben. Auch können Zeichen als ’Schmutz-Zeichen’ hinzugefügt werden, die wiederum zur späteren Laufzeit wieder durch Ersetzungen her-ausgefiltert werden.
Als Escape-Character werden Sonderzeichen bezeichnet, die reservierte Funktions-zeichen außer Kraft setzen. So dient das kaufmännische Und ’&’ auf der Komman-dozeilenebene unter cmd.exe zur Verkettung aufeinanderfolgender Befehle innerhalb einer Zeile, die doppelte Ausführung ’&&’ lässt den folgenden Befehl nur starten, wenn der erste erfolgreich war. Möchte man das Symbol als Text ausgeben, muss man es mit dem Zirkumflex ’ˆ’ escapen 22 23 Sofern kein reserviertes Funktionszeichen auf ein Escape-Character folgt, wird es schlicht und ergreifend ignoriert und hat keine Funk-tion. Auch das Escape-Zeichen selbst kann escaped werden, mit gleichem Ergebnis. So entstehen mehrere Stufen der Obfuscation, die sukzessive aufgelöst den eigentlichen Kommandozeilen-Befehl ergeben:
Abbildung in dieser Leseprobe nicht enthalten
Ebenso beliebt sind doppelte ’Gänsefüßchen’, die in ihrer eigentlichen Funktion bspw. Strings mit Leerzeichen innerhalb der Kommandozeilen-Argumente gruppieren. Sie tre-ten immer paarweise auf, die Verwendung einer ungeraden Anzahl bei der Obfuscation führt daher zu Fehlermeldungen. Vorteile liegen darin, dass Hochkommata bzw. ’Gänsefüßchen’ (engl: Quotes und Double Quotes) bei nichtbösartigen Aufrufen deutlich häufiger anzutreffen sind. Mehrfaches Auftreten von Escape-Sequenzen (siehe oben) ist kein natürliches Verhalten und kann daher leichter von IOCs detektiert werden24. Der Einsatz von Double Quotes schaut dem Escaping optisch recht ähnlich:
Abbildung in dieser Leseprobe nicht enthalten
Eine geschickte Klammersetzung in Kombination mit einer alternierenden Anzahl von Leerzeichen erfordert von Seiten der IOCs einen weiteren Mehraufwand. Die Befehle in den Klammern werden mit Konjunktionen verkettet und es muss lediglich darauf geachtet werden, dass es sich um Klammern-Paare handelt25.
Abbildung in dieser Leseprobe nicht enthalten
Als letzte Zeichen für die Obfuscation werden die ‘Schmutz-Zeichen’ Komma und Se-mikolon vorgestellt. Diese können überall dort eingesetzt werden, wo auch Leerzeichen verwendet bzw. auch ignoriert werden. Die Anzahl ist dementsprechend beliebig, da sie ohnehin an der eingesetzten Stelle nicht als solches interpretiert werden:
Abbildung in dieser Leseprobe nicht enthalten
1.2.4 FOR-Loops
Etwas weniger trivial ist die Obfuscation mit den Möglichkeiten der Programmablauf-steuerung, die vom Kommandozeilen-Interpreter cmd.exe angeboten werden. Es han-delt sich also nicht um Zusatzprogramme, sondern sie sind in der Binary implementiert und führen nicht zwangsläufig zu einem Subprocess. Besonders geeignet scheint hier die FOR-Loop, die auch Namensgeber dieser Methode ist: FOR Coding.
Zum Verständnis ist zunächst die Syntax wichtig: FOR %Variable IN (Satz) DO Befehl [Parameter]26 ist das Grundgerüst. Für die Verwendung weiterer Optionen wird der Parameter /F [”Optionen”] aktiviert. Um der Komplexität gerecht zu wer-den, wird in den weiteren Ausführungen Top-down vorgegangen und der Beispiel-Befehl schrittweise obfuskiert27:
Abbildung in dieser Leseprobe nicht enthalten
Für den Aufruf der Shell ist ein Rückgriff auf andere Variablen denkbar. Im vorlie-genden Fall wird auf ein Konstrukt mit einer FOR-Schleife zurückgegriffen, in der ein Output eines Systemprogramms gefiltert wird. Die Tools ftype und assoc zeigen zei-lenweise die Datei-Assoziationen bzw. verknüpften Anwenderprogramme an. Es bietet sich für das Ziel der Verschleierung von cmd ein Eintrag der Liste an, der zumindest die aufeinanderfolgenden Buchstaben in der Reihenfolge beinhaltet.
Die als nächstes einzuführende Kommandozeilen-Suche ist genau darauf zugeschnit-ten, aus der gesamten Ausgabe des Programms ftype den Teil zu finden, der die gewünschte Zeichenfolge enthält: SHCmdFile=%SystemRoot%\explorer.exe mit dem Substring: SHCmdFile=(. . . ). Als Suchstring dient ein eindeutiger Identifier, der aber keine Schlussfolgerungen auf den zu obfuskierenden Begriff zulässt.
Abbildung in dieser Leseprobe nicht enthalten
Mithilfe der Optionen28 einer FOR-Loop können Strings anhand von selbst gewählten Trennzeichen (delims = Delimiter) separiert werden und die aufgeteilten Segmente sind numerisch ansprechbar (tokens). Bei den Delimitern kann es sich auch um Buch-staben handeln. Im folgenden Beispiel sind nur zwei Delimiter aktiv (weil im String vorhanden) und folglich erhält man drei Segmente, wovon lediglich der rot markierte den gewünschten Zielstring darstellt, der mit tokens=2 ansprechbar wird:
Abbildung in dieser Leseprobe nicht enthalten
Die gesamte FOR-Loop wird folgend dargestellt. Die nicht case sensitiven Elemente erhalten zur weiteren Konfusion noch alternierende cases:
Abbildung in dieser Leseprobe nicht enthalten
Abschließend zur Darstellung der kombinierten Möglichkeiten werden die bisher be-sprochenen Obfuscation - Methoden auf die FOR-Loop angewandt29:
[...]
1 vgl. Brunton/Fissenbaum. Obfuscation: A User’s Guide for Privacy and Protest. MIT-Press 2016.
2 vgl. Brunton/Fissenbaum. Obfuscation: A User’s Guide for Privacy and Protest. MIT-Press 2016.
3 vgl. Brunton/Fissenbaum. Obfuscation: A User’s Guide for Privacy and Protest. MIT-Press 2016.
4 vgl. Brunton/Fissenbaum. Obfuscation: A User’s Guide for Privacy and Protest. MIT-Press 2016.
5 vgl. Brunton/Fissenbaum. Obfuscation: A User’s Guide for Privacy and Protest. MIT-Press 2016.
6 vgl. Brunton/Fissenbaum. Obfuscation: A User’s Guide for Privacy and Protest. MIT-Press 2016.
7 bspw. <https://docs.microsoft.com/en-us/visualstudio/ide/dotfuscator/>
8 bspw. The International Obfuscated C Code Contest. <https://www.ioccc.org/>
9 vgl. <https://www.security-insider.de/was-ist-ein-intrusion-detection-system-ids-a-612870/> [abgerufen: 29. März 2020]
10 Kunstwort aus DOS (Disc-Operating-System) und einem Wortbestandteil von Obfuscation
11 Prof. Dr. Rieger, vgl. [Rie20] [S. 171ff.]
12 vgl. Blogeintrag der Fa. G-Data. <https://www.gdata.de/blog/2018/07/30923-dosfuscation-g-data-forscher-entdecken-trickreich-versteckte-malware> [abgerufen: 29. März 2020]
13 vgl. Leichte Beute. c’t, Magazin für Computertechnik. Heft 6/2020 S. 18ff.
14 vgl. <https://www.blackhat.com/us-17/briefings.html#revoke-obfuscation-powershell-obfuscation-detection-and-evasion-using-science> [abgerufen: 29. März 2020]
15 Tastatureingaben-Protokollierung, vgl. https://www.security-insider.de/was-ist-ein-keylogger-a-673050/ [abgerufen: 29. März 2020]
16 Remote-Shell, die von Serverseite initiiert wird, vgl. <https://www.acunetix.com/blog/web-security-zone/what-is-reverse-shell/> [abgerufen: 29. März 2020]
17 vgl. c’t [Wes19] [S. 177] vgl. FireEye [Boh19] [S. 7]
18 vgl. c’t [Wes19] [S. 177] vgl. FireEye [Boh19] [S. 7]
19 Regular Expressions (dt. Reguläre Ausdrücke), vgl. <https://docs.microsoft.com/en-us/dotnet/ standard/base-types/regular-expression-language-quick-reference> [abgerufen: 29. März 2020]
20 vgl. <https://ss64.com/nt/for_f.html> [abgerufen: 29. März 2020]
21 vgl. FireEye [Boh19] [S. 12f.]
22 vgl. Kommandozeilenhilfe cmd.exe /c FOR /?, Windows 10 v1909
23 vgl. c’t [Wes19] [S. 178]
24 vgl. c’t [Wes19] [S. 178]
25 vgl. c’t [Wes19] [S. 178]
26 vgl. c’t [Wes19] [S. 178]
27 vgl. https://www.security-insider.de/was-ist-ein-keylogger-a-673050/ [abgerufen: 29. März 2020]
28 vgl. https://www.security-insider.de/was-ist-ein-keylogger-a-673050/ [abgerufen: 29. März 2020]
29 vgl. https://www.security-insider.de/was-ist-ein-keylogger-a-673050/ [abgerufen: 29. März 2020]