Laufzeitverschlüsselte Zeichenketten
Heute werden wir die Grundlagen der laufzeitverschlüsselten Zeichenketten durchgehen, warum wir unsere Zeichenketten verschlüsseln müssen und lernen, wie wir unsere eigenen erstellen.
In diesem Artikel werden Sie verstehen und lernen:
- Was Laufzeitverschlüsselung und -entschlüsselung ist
- Warum Sie Ihre Zeichenketten verschlüsseln müssen
- Sehen, wie jeder Ihre sensiblen Daten einsehen kann
- Ihre eigene benutzerdefinierte Verschlüsselung erstellen
Was ist Laufzeitverschlüsselung und -entschlüsselung
Dies bezieht sich auf Daten, die während der Laufzeit eines Programms (Software, Anwendung) verschlüsselt und/oder entschlüsselt werden. Die Daten können von jedem Typ sein, von Speicherblöcken, Netzwerkverkehr, Zeichenketten usw.
Eine der gebräuchlichsten Methoden für diesen Zweck ist Obfuskation (grundlegend). Die anderen (fortgeschrittenen) Mechanismen umfassen die Mutation/Virtualisierung von kompiliertem Code.
Heute konzentrieren wir uns auf einen Mechanismus mit XOR-Obfuskation .
Warum Zeichenketten verschlüsseln?
In dem Moment, in dem Sie Ihre Software ausführen, ist alles im Speicher sichtbar. Dies gilt auch für Ihre Endbenutzer, was bedeutet, dass sie alles sehen können.
Eines der ersten Dinge, die ein Angreifer tun wird, ist nach Zeichenketten in Ihrer Software zu suchen. Dies ermöglicht es ihm, mit minimalem Aufwand alles über Ihre Software zu verstehen.
Wenn Sie sensible Daten (wie Passwörter oder Lizenzen) speichern, ist es entscheidend, sie nicht im Klartext zu belassen. Klartext macht es einem Angreifer leicht.
Es gibt verschiedene Möglichkeiten, wie Personen Ihre Software analysieren können. Die bekanntesten und gebräuchlichsten Methoden sind die statische und die Laufzeitanalyse.
Schauen wir uns ein einfaches Beispiel mit einer Konsolenanwendung an:
Wir kompilieren dies im Release-Modus (um Debug-Informationen zu vermeiden). Fahren wir fort und testen die statische und Laufzeitanalyse.
Statische Analyse Test
Bei der statischen Analyse muss die Software nicht ausgeführt werden. Öffnen wir das Beispiel in Ghidra .
Aus dem Screenshot unten können Sie sehen, dass das Beispiel ohne Debug-Informationen kompiliert wurde:
Wenn wir nach Zeichenketten suchen, können Sie sehen, dass alle unsere sensiblen Informationen sichtbar sind:
Sobald Sie die Zeichenkette markiert haben, können Sie die Decompiler-Ansicht öffnen und den gesamten relevanten Code sehen:
Ziemlich traurig, oder? 😕 Stellen Sie sich vor, Sie haben monatelang an Ihrer großartigen Software gearbeitet und sind bereit, sie zu verkaufen.
Ich denke, der Rest ist selbsterklärend, aber ich bin sicher, Sie verstehen den Punkt.
Was noch trauriger ist: Das ist so einfach, dass sogar ein 12-Jähriger es kann. (und einige tun es tatsächlich)
Laufzeitanalyse Test
Bei der Laufzeitanalyse muss die Software ausgeführt werden. Das bedeutet, wir müssen eine Software verwenden, um den Prozess zu öffnen und zu lesen (normalerweise ein Debugger).
Allerdings wird für diesen Zweck kein Debugger wirklich benötigt. Wir können einfach ein kostenloses Tool wie Process Hacker herunterladen und den Prozess öffnen:
Das war ziemlich einfach, oder? Und bedenken Sie, dass wir noch nicht einmal einen Debugger angehängt haben. Eine geschickte und entschlossene Person wird einen Debugger verwenden.
Wenn Sie einen Debugger anhängen, sehen Sie viel mehr, aber diese Diskussion ist für ein anderes Mal.
Laufzeitverschlüsselte Zeichenketten erstellen
Es gibt zahlreiche Möglichkeiten, dies zu erreichen:
- Verwendung von Drittanbieter-Software wie VMProtect , Themida .
- Kompilierzeit-Zeichenkettenverschlüsselung wie xorstr .
- Verwendung benutzerdefinierter Methoden
Die ersten 2 Optionen passen möglicherweise nicht zu Ihren Bedürfnissen. Jede hat viele Vor- und Nachteile, die wir an dieser Stelle nicht besprechen werden.
Eine Sache, die Sie verstehen müssen: Popularität bedeutet Risiko. Wenn Sie Dinge verwenden, die zufällig bei Google gefunden werden, weiß jemand bereits davon.
Die meisten Leute haben ein Tool gegen Ihr Tool entwickelt. So sind die Dinge einfach. Sie tun es als Herausforderung oder um Ihre Arbeit zu stehlen, aber sie tun es.
Mit diesem Wissen müssen Sie individuell vorgehen. Sie können Ihre eigene Zeichenkettenverschlüsselung von einfach bis fortgeschritten erstellen.
Der Plan
- Eine einfach zu verwendende Lösung erstellen
- Zeichenketten jederzeit verschlüsselt halten
- Entschlüsselung nur bei Bedarf
- Die Zeichenketten an zufälligen Stellen platzieren (optional - nicht abgedeckt)
- Die Zeichenketten nach der Verwendung zerstören (optional - nicht abgedeckt)
Die Lösung
Beginnen Sie damit, unsere Zeichenketten einzeln als Array zu definieren:
Das Array kann eine unbegrenzte Anzahl von Zeichenketten mit einer Längenbegrenzung von 256 aufnehmen.
Ich weiß, dass dies eine mühsame Aufgabe ist, besonders wenn Ihre Zeichenketten lang sind. Dies dient nur zur Demonstration, und später werden wir eine praktischere Lösung erstellen.
Die Idee ist, jedes Zeichen der Zeichenkette zu verschlüsseln. Ich werde dafür eine einfache XOR-Verschlüsselung verwenden.
Unten können Sie ein Beispiel sehen, wie dies funktionieren würde:
Das oben Gezeigte hat nichts Kompliziertes, es ist einfach und simpel, aber dennoch ziemlich leistungsfähig. Sie können dies innerhalb einer Konsolenanwendung verwenden.
Nach dem Kompilieren und Ausführen ist das Ergebnis für das menschliche Auge unlesbare Bytes:
Da haben Sie es, Ihre eigene kleine Software zum Erstellen laufzeitverschlüsselter Zeichenketten. 😏
Das Ergebnis
Es ist Zeit, unsere Lösung in die Praxis umzusetzen. Erstellen wir ein weiteres Beispiel zu diesem Zweck und fügen unseren Code hinzu:
Beachten Sie 2 wichtige Dinge:
- Ich habe einige Zeichenketten absichtlich im Klartext gelassen, damit Sie den Unterschied sehen können
- Die Entschlüsselungsfunktion benötigt die Länge (mehr dazu später)
Wir kompilieren das oben Gezeigte im Release-Modus und führen es aus. Das neue Beispiel funktioniert normal:
Wenn wir die neue Beispiel-Software in IDA (oder Ghidra) öffnen, sind die verschlüsselten Zeichenketten nicht sichtbar:
Ich habe erwähnt, dass in diesem Beispiel absichtlich einige Zeichenketten im Klartext belassen wurden. Der Grund dafür ist, dass wir ihnen folgen können, um den Code zu sehen:
Ich musste nach unten scrollen, um den Text im obigen Bild zu erreichen. Sie können sehen, wie unterschiedlich der kompilierte Code ist.
Wir haben das Problem der statischen Analyse gelöst, kommen wir zur Laufzeit.
Öffnen wir es in Process Hacker:
Voila! Wir haben auch das Problem der Laufzeitanalyse gelöst 😎
Mehr über verschlüsselte Zeichenketten
Das obige Beispiel ist nicht sehr praktisch. Jede Zeichenkette manuell zu definieren ist eine mühsame Aufgabe, ebenso wie die Angabe der Länge der Zeichenkette jedes Mal.
Idealerweise bräuchten wir Folgendes:
- Lesen einer Textdatei für Zeichenketten
- Schreiben der resultierenden Zeichenketten in eine Textdatei
- Hinzufügen der Escape-Sequenzen zu Zeichenketten, um die Angabe der Länge jedes Mal zu vermeiden.
- Komplexeres XOR oder eine andere Methode hinzufügen (optional)
- Die Zeichenketten an zufälligen Stellen platzieren (optional)
Ich habe eine nette Lösung zum Experimentieren vorbereitet. Sie können alles testen, was in diesem Artikel beschrieben wurde, und auch Ihr eigenes einsatzbereites Tool zum Erstellen laufzeitverschlüsselter Zeichenketten haben.
Es umfasst 4 Projekte:
- RuntimeStringEcryptor liest Zeichenketten aus einer Textdatei, verschlüsselt sie und schreibt sie in eine andere Textdatei.
- Sample ist die einfache Konsole zur Demonstration mit IDA.
- SampleEncryptedStrings ist die einfache Konsole mit verschlüsselten Zeichenketten zur Demonstration mit IDA.
- SimpleRuntimeStringEncryption ist der anfängliche Spielplatz, auf dem Sie diese Methode testen können.
Hinweise:
- Wenn Sie keine Escape-Sequenz hinzufügen, weiß die Entschlüsselung nicht, wann sie “aufhören” soll. Das Ergebnis sind Kauderwelsch/Null-Daten, bis die definierte Array-Größe erreicht ist.
- Stellen Sie sicher, dass Sie die XOR-Schlüssel ändern, die ich in meinem Beispiel verwendet habe.
- Vermeiden Sie die mehrfache Verwendung derselben Wörter. Sie generieren dieselben Bytes und es besteht die Gefahr der Erkennung.
Download
Um die einsatzbereite Lösung herunterzuladen, unterstützen Sie bitte diesen Blog 😘
Kommentare