# Kryptografische/Kompressionsalgorithmen
## Kryptografische/Kompressionsalgorithmen
{% hint style="success" %}
Lerne & übe AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Lerne & übe GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Unterstütze HackTricks
* Überprüfe die [**Abonnementpläne**](https://github.com/sponsors/carlospolop)!
* **Tritt der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folge** uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Teile Hacking-Tricks, indem du PRs zu den** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repos einreichst.
{% endhint %}
## Identifizierung von Algorithmen
Wenn du in einem Code **Rechts- und Linksverschiebungen, XORS und mehrere arithmetische Operationen** siehst, ist es sehr wahrscheinlich, dass es sich um die Implementierung eines **kryptografischen Algorithmus** handelt. Hier werden einige Möglichkeiten gezeigt, um **den verwendeten Algorithmus zu identifizieren, ohne jeden Schritt zurückverfolgen zu müssen**.
### API-Funktionen
**CryptDeriveKey**
Wenn diese Funktion verwendet wird, kannst du herausfinden, welcher **Algorithmus verwendet wird**, indem du den Wert des zweiten Parameters überprüfst:
![](<../../.gitbook/assets/image (375) (1) (1) (1) (1).png>)
Hier findest du die Tabelle möglicher Algorithmen und ihrer zugewiesenen Werte: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
**RtlCompressBuffer/RtlDecompressBuffer**
Komprimiert und dekomprimiert einen gegebenen Datenpuffer.
**CryptAcquireContext**
Aus [den Dokumenten](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Die **CryptAcquireContext**-Funktion wird verwendet, um einen Handle für einen bestimmten Schlüsselcontainer innerhalb eines bestimmten kryptografischen Dienstanbieters (CSP) zu erwerben. **Dieser zurückgegebene Handle wird in Aufrufen von CryptoAPI**-Funktionen verwendet, die den ausgewählten CSP nutzen.
**CryptCreateHash**
Initiiert das Hashing eines Datenstroms. Wenn diese Funktion verwendet wird, kannst du herausfinden, welcher **Algorithmus verwendet wird**, indem du den Wert des zweiten Parameters überprüfst:
![](<../../.gitbook/assets/image (376).png>)
\
Hier findest du die Tabelle möglicher Algorithmen und ihrer zugewiesenen Werte: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
### Code-Konstanten
Manchmal ist es wirklich einfach, einen Algorithmus zu identifizieren, da er einen speziellen und einzigartigen Wert verwenden muss.
![](<../../.gitbook/assets/image (370).png>)
Wenn du die erste Konstante bei Google suchst, erhältst du Folgendes:
![](<../../.gitbook/assets/image (371).png>)
Daher kannst du annehmen, dass die dekompilierte Funktion ein **sha256-Rechner** ist.\
Du kannst jede der anderen Konstanten suchen und wirst (wahrscheinlich) dasselbe Ergebnis erhalten.
### Dateninfo
Wenn der Code keine signifikante Konstante hat, könnte er **Informationen aus dem .data-Bereich laden**.\
Du kannst auf diese Daten zugreifen, **die erste dword gruppieren** und sie in Google suchen, wie wir es im vorherigen Abschnitt getan haben:
![](<../../.gitbook/assets/image (372).png>)
In diesem Fall, wenn du nach **0xA56363C6** suchst, kannst du feststellen, dass es mit den **Tabellen des AES-Algorithmus** verbunden ist.
## RC4 **(Symmetrische Kryptografie)**
### Eigenschaften
Es besteht aus 3 Hauptteilen:
* **Initialisierungsphase/**: Erstellt eine **Tabelle von Werten von 0x00 bis 0xFF** (insgesamt 256 Bytes, 0x100). Diese Tabelle wird häufig als **Substitutionsbox** (oder SBox) bezeichnet.
* **Scrambling-Phase**: Wird **durch die zuvor erstellte Tabelle** (Schleife von 0x100 Iterationen, erneut) schleifen und jeden Wert mit **semi-zufälligen** Bytes modifizieren. Um diese semi-zufälligen Bytes zu erstellen, wird der RC4 **Schlüssel verwendet**. RC4 **Schlüssel** können **zwischen 1 und 256 Bytes lang** sein, es wird jedoch normalerweise empfohlen, dass sie länger als 5 Bytes sind. Häufig sind RC4-Schlüssel 16 Bytes lang.
* **XOR-Phase**: Schließlich wird der Klartext oder Chiffretext mit den zuvor erstellten Werten **XORed**. Die Funktion zum Verschlüsseln und Entschlüsseln ist dieselbe. Dazu wird eine **Schleife durch die erstellten 256 Bytes** so oft durchgeführt, wie es notwendig ist. Dies wird normalerweise in einem dekompilierten Code mit einem **%256 (mod 256)** erkannt.
{% hint style="info" %}
**Um einen RC4 in einem Disassemblierungs-/dekompilierten Code zu identifizieren, kannst du nach 2 Schleifen der Größe 0x100 (unter Verwendung eines Schlüssels) suchen und dann ein XOR der Eingabedaten mit den 256 zuvor in den 2 Schleifen erstellten Werten durchführen, wahrscheinlich unter Verwendung eines %256 (mod 256)**
{% endhint %}
### **Initialisierungsphase/Substitutionsbox:** (Beachte die Zahl 256, die als Zähler verwendet wird, und wie eine 0 an jedem Platz der 256 Zeichen geschrieben wird)
![](<../../.gitbook/assets/image (377).png>)
### **Scrambling-Phase:**
![](<../../.gitbook/assets/image (378).png>)
### **XOR-Phase:**
![](<../../.gitbook/assets/image (379).png>)
## **AES (Symmetrische Kryptografie)**
### **Eigenschaften**
* Verwendung von **Substitutionsboxen und Nachschlagetabellen**
* Es ist möglich, **AES anhand der Verwendung spezifischer Nachschlagetabellenwerte** (Konstanten) zu unterscheiden. _Beachte, dass die **Konstante** **im Binärformat gespeichert** oder _**dynamisch erstellt**_ werden kann._
* Der **Verschlüsselungsschlüssel** muss **durch 16** (normalerweise 32B) teilbar sein, und es wird normalerweise ein **IV** von 16B verwendet.
### SBox-Konstanten
![](<../../.gitbook/assets/image (380).png>)
## Serpent **(Symmetrische Kryptografie)**
### Eigenschaften
* Es ist selten, Malware zu finden, die es verwendet, aber es gibt Beispiele (Ursnif)
* Einfach zu bestimmen, ob ein Algorithmus Serpent ist oder nicht, basierend auf seiner Länge (extrem lange Funktion)
### Identifizierung
In der folgenden Abbildung beachte, wie die Konstante **0x9E3779B9** verwendet wird (beachte, dass diese Konstante auch von anderen Krypto-Algorithmen wie **TEA** -Tiny Encryption Algorithm verwendet wird).\
Beachte auch die **Größe der Schleife** (**132**) und die **Anzahl der XOR-Operationen** in den **Disassemblierungs**-Anweisungen und im **Code**-Beispiel:
![](<../../.gitbook/assets/image (381).png>)
Wie bereits erwähnt, kann dieser Code in jedem Decompiler als **sehr lange Funktion** visualisiert werden, da es **keine Sprünge** darin gibt. Der dekompilierte Code kann wie folgt aussehen:
![](<../../.gitbook/assets/image (382).png>)
Daher ist es möglich, diesen Algorithmus zu identifizieren, indem man die **magische Zahl** und die **initialen XORs** überprüft, eine **sehr lange Funktion** sieht und einige **Anweisungen** der langen Funktion **mit einer Implementierung** (wie der Linksverschiebung um 7 und der Linksrotation um 22) vergleicht.
## RSA **(Asymmetrische Kryptografie)**
### Eigenschaften
* Komplexer als symmetrische Algorithmen
* Es gibt keine Konstanten! (benutzerdefinierte Implementierungen sind schwer zu bestimmen)
* KANAL (ein Krypto-Analyzer) versagt darin, Hinweise zu RSA zu zeigen, da er auf Konstanten angewiesen ist.
### Identifizierung durch Vergleiche
![](<../../.gitbook/assets/image (383).png>)
* In Zeile 11 (links) gibt es ein `+7) >> 3`, das dasselbe ist wie in Zeile 35 (rechts): `+7) / 8`
* Zeile 12 (links) überprüft, ob `modulus_len < 0x040` und in Zeile 36 (rechts) wird überprüft, ob `inputLen+11 > modulusLen`
## MD5 & SHA (Hash)
### Eigenschaften
* 3 Funktionen: Init, Update, Final
* Ähnliche Initialisierungsfunktionen
### Identifizieren
**Init**
Du kannst beide identifizieren, indem du die Konstanten überprüfst. Beachte, dass die sha\_init eine Konstante hat, die MD5 nicht hat:
![](<../../.gitbook/assets/image (385).png>)
**MD5 Transform**
Beachte die Verwendung von mehr Konstanten
![](<../../.gitbook/assets/image (253) (1) (1) (1).png>)
## CRC (Hash)
* Kleiner und effizienter, da seine Funktion darin besteht, zufällige Änderungen in Daten zu finden
* Verwendet Nachschlagetabellen (so kannst du Konstanten identifizieren)
### Identifizieren
Überprüfe **Nachschlagetabellenkonstanten**:
![](<../../.gitbook/assets/image (387).png>)
Ein CRC-Hash-Algorithmus sieht wie folgt aus:
![](<../../.gitbook/assets/image (386).png>)
## APLib (Kompression)
### Eigenschaften
* Nicht erkennbare Konstanten
* Du kannst versuchen, den Algorithmus in Python zu schreiben und online nach ähnlichen Dingen zu suchen
### Identifizieren
Der Graph ist ziemlich groß:
![](<../../.gitbook/assets/image (207) (2) (1).png>)
Überprüfe **3 Vergleiche, um ihn zu erkennen**:
![](<../../.gitbook/assets/image (384).png>)
{% hint style="success" %}
Lerne & übe AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Lerne & übe GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Unterstütze HackTricks
* Überprüfe die [**Abonnementpläne**](https://github.com/sponsors/carlospolop)!
* **Tritt der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folge** uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Teile Hacking-Tricks, indem du PRs zu den** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repos einreichst.
{% endhint %}