
Ein automatisches Verschleierungswerkzeug für Android-Apps, das im Black-Box-Verfahren arbeitet, erweiterte Verschleierungsfunktionen unterstützt und eine modulare Architektur besitzt, die leicht um neue Techniken erweiterbar ist.
[!WICHTIG] Dieses Projekt ist archiviert und wird nicht mehr weiterentwickelt.
Einige der häufigsten Fragen werden in der FAQ und Fehlerbehebung beantwortet.

Ein Black-Box-Verschleierungswerkzeug für Android-Apps.
Obfuscapk ist ein modulares Python-Tool zur Verschleierung von Android-Apps, ohne dass deren Quellcode benötigt wird, da apktool verwendet wird, um die ursprüngliche APK-Datei zu dekompilieren und eine neue Anwendung zu erstellen, nachdem einige Verschleierungstechniken auf den dekompilierten smali-Code, die Ressourcen und das Manifest angewendet wurden. Die verschleierte App behält die gleiche Funktionalität wie die ursprüngliche, aber die Unterschiede unter der Haube machen die neue Anwendung manchmal sehr unterschiedlich von der ursprünglichen (z. B. für signaturbasierte Antivirensoftware).
Obfuscapk fügt Unterstützung für
Android App Bundles (AAB-Dateien) hinzu,
indem BundleDecompiler verwendet wird (siehe
#121). Um diese neue Funktion zu nutzen,
laden Sie die neueste Version von BundleDecompiler von
hier herunter,
speichern Sie sie als BundleDecompiler.jar in einem Verzeichnis, das in PATH enthalten ist (z. B. unter Ubuntu in
/usr/local/bin oder /usr/bin) und stellen Sie sicher, dass die ausführbare Flagge gesetzt ist.
[!WICHTIG] BundleDecompiler funktioniert unter Windows noch nicht, daher wird die Verschleierung von App-Bundles von Obfuscapk unter Windows nicht unterstützt. Außerdem befindet sich die Unterstützung für App Bundles noch in der frühen Entwicklung. Wenn Sie auf Probleme stoßen oder uns bei der Verbesserung helfen möchten, lesen Sie bitte Mitwirken.
Weitere Details zu Obfuscapk finden Sie in der Arbeit "Obfuscapk: An open-source black-box obfuscation tool for Android apps". Sie können die Arbeit wie folgt zitieren:```BibTeX @article{aonzo2020obfuscapk, title = "Obfuscapk: An open-source black-box obfuscation tool for Android apps", journal = "SoftwareX", volume = "11", pages = "100403", year = "2020", issn = "2352-7110", doi = "https://doi.org/10.1016/j.softx.2020.100403", url = "https://www.sciencedirect.com/science/article/pii/S2352711019302791", author = "Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo", keywords = "Android, Obfuscation, Program analysis" }
## ❱ Demo

## ❱ Architektur

Obfuscapk ist modular und erweiterbar konzipiert und basiert daher auf einem
[Plugin-System](https://github.com/tibonihoo/yapsy). Folglich ist jeder Obfuskator ein
Plugin, das von einer abstrakten
[Basisklasse](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/obfuscator_category.py)
erbt und die Methode `obfuscate` implementieren muss. Wenn das Tool mit der Verarbeitung einer neuen
Android-Anwendungsdatei beginnt, erstellt es ein
[Obfuskationsobjekt](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/obfuscation.py),
um alle benötigten Informationen (z. B. den Speicherort des dekompilierten `smali`-Codes)
und den internen Zustand der Operationen (z. B. die Liste der bereits verwendeten Obfuskatoren) zu speichern.
Dann wird das Obfuskationsobjekt als Parameter an die Methode `obfuscate` an alle
aktiven Plugins/Obfuskatoren (nacheinander) übergeben, um verarbeitet und modifiziert zu werden. Die Liste und
die Reihenfolge der aktiven Plugins wird über [Kommandozeilenoptionen](#-usage) festgelegt.
Das Tool lässt sich leicht mit neuen Obfuskatoren erweitern: Es reicht aus, den Quellcode
zur Implementierung der Obfuskationstechnik und die Plugin-Metadaten (eine
`<obfuscator-name>.obfuscator`-Datei) im Verzeichnis
[`src/obfuscapk/obfuscators`](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators)
abzulegen (nehmen Sie einen einfachen bestehenden Obfuskator wie
[`Nop`](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/obfuscators/nop/nop.py)
als Ausgangsbeispiel). Das Tool erkennt das neue Plugin automatisch, sodass keine
weitere Konfiguration erforderlich ist (das neue Plugin wird wie alle anderen mit dem Tool
gebündelten Plugins behandelt).
## ❱ Installation
Es gibt zwei Möglichkeiten, um eine funktionsfähige Kopie von Obfuscapk auf Ihrem eigenen Computer zu erhalten: entweder
durch [Verwendung von Docker](#docker-image) oder durch [direkte Verwendung des Quellcodes](#from-source)
in einer `Python 3`-Umgebung. In beiden Fällen besteht der erste Schritt darin, eine lokale
Kopie dieses Repositorys zu erhalten. Öffnen Sie also ein Terminal in dem Verzeichnis, in dem Sie
das Projekt speichern möchten, und klonen Sie das Repository:```Shell
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
Dies ist die empfohlene Methode zur Installation von Obfuscapk, da die einzige Voraussetzung eine aktuelle Version von Docker ist:```Shell $ docker --version Docker version 20.10.21, build baeda1f
#### Offizielles Docker Hub Image
Das [offizielle Obfuscapk Docker-Image](https://hub.docker.com/r/claudiugeorgiu/obfuscapk) ist auf Docker Hub verfügbar (automatisch aus diesem Repository erstellt):```Shell
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
Wenn Sie das offizielle Image von Docker Hub heruntergeladen haben, sind Sie bereit, das Tool zu verwenden, also
schauen Sie sich die Verwendungshinweise an, andernfalls führen Sie den folgenden
Befehl im zuvor erstellten Verzeichnis Obfuscapk/src/ aus (dem Ordner, der die
Dockerfile enthält), um das Docker-Image zu erstellen:```Shell
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
Wenn das Docker-Image bereit ist, führen Sie einen kurzen Test durch, um zu überprüfen, ob alles korrekt installiert wurde:```Shell
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk ist jetzt bereit zur Verwendung, siehe die Nutzungshinweise für weitere Informationen.
Stellen Sie sicher, dass eine aktuelle Version von
apktool,
apksigner
und zipalign installiert
und über die Befehlszeile verfügbar ist:```Shell
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
```Shell
$ apksigner
Usage: apksigner <command> [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
Um die Verschleierung von App-Bundles zu unterstützen, benötigen Sie außerdem
BundleDecompiler. Laden Sie daher
die neueste verfügbare Version von
hier herunter,
speichern Sie sie als BundleDecompiler.jar in einem Verzeichnis, das in PATH enthalten ist
(z. B. unter Ubuntu /usr/local/bin oder /usr/bin) und stellen Sie sicher, dass das
execute-Bit gesetzt ist.
Um BundleDecompiler und apktool zu verwenden, benötigen Sie ebenfalls eine
aktuelle Version von Java. zipalign und apksigner sind im Android SDK enthalten.
Der Speicherort der ausführbaren Dateien kann auch über die folgenden Umgebungsvariablen
angegeben werden: APKTOOL_PATH, BUNDLE_DECOMPILER_PATH, APKSIGNER_PATH und
ZIPALIGN_PATH (z. B. unter Ubuntu führen Sie export APKTOOL_PATH=/custom/location/apktool
aus, bevor Sie Obfuscapk im selben Terminal starten).
Abgesehen von den oben genannten Werkzeugen ist die einzige Anforderung dieses Projekts eine
funktionierende Installation von Python 3 (mindestens 3.7) (zusammen mit seinem Paketmanager
pip).
Führen Sie die folgenden Befehle im Hauptverzeichnis des Projekts (Obfuscapk/) aus, um die
benötigten Abhängigkeiten zu installieren:
pip3 install -r requirements.txt
``````Shell
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended.
$ python3 -m venv venv
$ source venv/bin/activate
$ # Install Obfuscapk's requirements.
$ python3 -m pip install -r src/requirements.txt
Nachdem die Abhängigkeiten installiert sind, führen Sie einen schnellen Test durch, um zu überprüfen, ob alles korrekt funktioniert:```Shell $ cd src/ $ # The following command has to be executed always from Obfuscapk/src/ directory $ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable. $ python3 -m obfuscapk.cli --help usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] ...
Obfuscapk ist jetzt einsatzbereit, siehe die [Verwendungshinweise](#-usage) für weitere
Informationen.
## ❱ Verwendung
Ab jetzt wird Obfuscapk als ausführbare Datei unter dem Namen `obfuscapk` betrachtet,
sodass Sie die Befehle je nach Installationsmethode anpassen müssen:
* **Docker-Image**: Ein lokales Verzeichnis mit der zu obfuskierenden Anwendung muss im
Container unter `/workdir` bereitgestellt werden (z. B. das aktuelle Verzeichnis
`"${PWD}"`), daher der Befehl:
```Shell
$ obfuscapk [params...]
```
wird zu:
```Shell
$ docker run --rm -it -u $(id -u):$(id -g) -v "${PWD}":"/workdir" obfuscapk [params...]
```
* **Aus dem Quellcode**: Jeder Befehl muss aus dem Verzeichnis `Obfuscapk/src/`
ausgeführt werden (oder durch Hinzufügen des Verzeichnisses `Obfuscapk/src/` zur
Umgebungsvariablen `PYTHONPATH`) und der Befehl:
```Shell
$ obfuscapk [params...]
```
wird zu:
```Shell
$ python3 -m obfuscapk.cli [params...]
```
Beginnen wir mit einem Blick auf die Hilfemeldung:```Shell
$ obfuscapk --help
obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY]
[--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD]
[--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2]
<APK_OR_BUNDLE_FILE>
Es gibt zwei obligatorische Parameter: <APK_OR_BUNDLE_FILE>, der Pfad (relativ oder absolut) zur APK- oder App-Bundle-Datei, die verschleiert werden soll, und die Liste mit den Namen der anzuwendenden Verschleierungstechniken (angegeben mit einer -o-Option, die mehrfach verwendet werden kann, z. B. -o Rebuild -o NewAlignment -o NewSignature). Die anderen optionalen Argumente sind wie folgt:
-w DIR wird verwendet, um das Arbeitsverzeichnis festzulegen, in dem die Zwischendateien (von apktool generiert) gespeichert werden. Wenn nicht angegeben, wird ein Verzeichnis namens obfuscation_working_dir im selben Verzeichnis wie die eingegebene Anwendung erstellt. Dies kann zu Debug-Zwecken nützlich sein, aber wenn es nicht benötigt wird, kann es auf ein temporäres Verzeichnis gesetzt werden (z. B. -w /tmp/).
-d OUT_APK_OR_AAB wird verwendet, um den Pfad der Zieldatei festzulegen: die APK-Datei, die durch den Verschleierungsprozess erzeugt wird (z. B. -d /home/user/Desktop/obfuscated.apk oder -d /home/user/Desktop/obfuscated.aab). Wenn nicht angegeben, wird die endgültige verschleierte Datei im Arbeitsverzeichnis gespeichert. Hinweis: Vorhandene Dateien werden ohne Vorwarnung überschrieben.
-i ist ein Flag, um bekannte Drittanbieterbibliotheken während des Verschleierungsprozesses zu ignorieren, weniger Ressourcen zu verbrauchen, die Leistung zu steigern und das Risiko von Fehlern zu verringern. Die zu ignorierende Liste der Bibliotheken ist vom Projekt LiteRadar übernommen.
-p ist ein Flag, um Fortschrittsbalken während der Verschleierungsvorgänge anzuzeigen. Bei Verwendung des Tools in Batch-Operationen/automatischen Builds ist es praktisch, die Fortschrittsbalken zu deaktivieren, andernfalls sollte dieses Flag aktiviert werden, um den Verschleierungsfortschritt zu sehen.
Betrachten wir nun ein einfaches Arbeitsbeispiel, um zu sehen, wie Obfuscapk funktioniert:```Shell $ # original.apk is a valid Android apk file. $ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
Wenn der obige Befehl ausgeführt wird, passiert Folgendes im Hintergrund:
* da kein Arbeitsverzeichnis angegeben wurde, wird ein neues Arbeitsverzeichnis
(`obfuscation_working_dir`) am selben Ort wie `original.apk` erstellt (dies kann
nützlich sein, um die `smali`-Dateien/Manifest/Ressourcen bei Fehlern zu überprüfen)
* es werden einige Prüfungen durchgeführt, um sicherzustellen, dass alle benötigten Dateien/ausführbaren Programme
verfügbar und einsatzbereit sind
* der eigentliche Verschleierungsprozess beginnt: die angegebenen Obfuskatoren werden
(nacheinander) einer nach dem anderen ausgeführt, bis kein Obfuskator mehr übrig ist oder ein Fehler auftritt
- beim Ausführen des ersten Obfuskators wird `original.apk` mit `apktool`
dekompiliert und die Ergebnisse werden im Arbeitsverzeichnis gespeichert
- da der erste Obfuskator `RandomManifest` ist, werden die Einträge im dekompilierten
Android-Manifest zufällig neu angeordnet (ohne die `xml`-Strukturen zu beschädigen)
- der `Rebuild`-Obfuskator erstellt die Anwendung einfach neu (jetzt mit dem modifizierten
Manifest) mit `apktool`, und da keine Ausgabedatei angegeben wurde, wird die resultierende
APK-Datei im zuvor erstellten Arbeitsverzeichnis gespeichert
- der `NewAlignment`-Obfuskator verwendet das `zipalign`-Werkzeug, um die resultierende APK-Datei auszurichten
- der `NewSignature`-Obfuskator signiert die neu erstellte APK-Datei mit einem benutzerdefinierten
Zertifikat, das in einem
[mit Obfuscapk gebündelten Keystore](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/resources/obfuscation_keystore.jks) enthalten ist
(obwohl ein anderer Keystore mit dem Parameter `--keystore-file` angegeben werden kann)
* wenn alle Obfuskatoren fehlerfrei ausgeführt wurden, befindet sich die resultierende verschleierte
APK-Datei in `obfuscation_working_dir/original_obfuscated.apk`, signiert,
ausgerichtet und bereit zur Installation auf einem Gerät/Emulator
Wie im vorherigen Beispiel zu sehen, werden die Obfuskatoren `Rebuild`, `NewAlignment` und `NewSignature`
benötigt, um eine Verschleierungsoperation abzuschließen und die endgültige
verschleierte APK zu erstellen. Es handelt sich nicht um tatsächliche Verschleierungstechniken, aber sie werden im
Erstellungsprozess benötigt, daher sind sie in der Liste der Obfuskatoren enthalten, um die gesamte
Architektur modular zu halten.
Funktioniert nicht wie erwartet? Siehe
[FAQ](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/docs/FAQ.md) und
[Fehlerbehebung](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/docs/TROUBLESHOOTING.md).
## ❱ Obfuskatoren
Die in Obfuscapk enthaltenen Obfuskatoren können je nach den von ihnen durchgeführten Operationen in verschiedene Kategorien eingeteilt werden:
* **Trivial**: wie der Name schon sagt, umfasst diese Kategorie einfache Operationen (die
die ursprüngliche Anwendung nicht wesentlich verändern), wie das Signieren der APK-Datei mit einer neuen Signatur.
* **Umbenennen**: Operationen, die die Namen der verwendeten Bezeichner ändern (Klassen, Felder,
Methoden).
* **Verschlüsselung**: Verpacken verschlüsselten Codes/Ressourcen und deren Entschlüsselung während der App-Ausführung. Wenn Obfuscapk startet, generiert es automatisch einen zufälligen geheimen Schlüssel (32 Zeichen lang, mit ASCII-Buchstaben und Ziffern), der für die Verschlüsselung verwendet wird.
* **Code**: alle Operationen, die die Modifikation des dekompilierten Quellcodes beinhalten.
* **Ressourcen**: Operationen an den Ressourcendateien (wie die Änderung des Manifests).
* **Sonstiges**
Die derzeit in Obfuscapk gebündelten Obfuskatoren werden im Folgenden kurz vorgestellt (in alphabetischer Reihenfolge). Bitte lesen Sie den Quellcode des Projekts für weitere Details.
> [!TIP]
> Nicht alle der unten aufgeführten Obfuskatoren entsprechen echten Verschleierungstechniken (z.B.,
> `Rebuild`, `NewAlignment`, `NewSignature` und `VirusTotal`), aber sie sind als Obfuskatoren implementiert, um die Architektur modular und leicht um neue Funktionalitäten erweiterbar zu halten.
<details><summary><b>AdvancedReflection</b> [Code]</summary>
> Verwendet Reflektion, um gefährliche APIs des Android-Frameworks aufzurufen. Um herauszufinden, ob eine
> Methode zum Android-Framework gehört, bezieht sich Obfuscapk auf das Mapping, das von
> [Backes et al.](https://www.usenix.org/system/files/conference/usenixsecurity16/sec16_paper_backes-android.pdf) entdeckt wurde.
> [:page_facing_up: AdvancedReflection-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/advanced_reflection)
</details>
<details><summary><b>ArithmeticBranch</b> [Code]</summary>
> Fügt Junk-Code ein. In diesem Fall besteht der Junk-Code aus arithmetischen Berechnungen
> und einer Verzweigungsanweisung, die vom Ergebnis dieser Berechnungen abhängt, und zwar so,
> dass die Verzweigung nie genommen wird.
> [:page_facing_up: ArithmeticBranch-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/arithmetic_branch)
</details>
<details><summary><b>AssetEncryption</b> [Verschlüsselung]</summary>
> Verschlüsselt Asset-Dateien.
> [:page_facing_up: AssetEncryption-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/asset_encryption)
</details>
<details><summary><b>CallIndirection</b> [Code]</summary>
> Diese Technik modifiziert den Kontrollflussgraphen, ohne die Codesemantik zu beeinträchtigen:
> sie fügt neue Methoden hinzu, die die ursprünglichen aufrufen. Beispielsweise wird ein Aufruf der
> Methode *m1* durch eine neue Wrapper-Methode *m2* ersetzt, die beim Aufruf die ursprüngliche Methode *m1* aufruft.
> [:page_facing_up: CallIndirection-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/call_indirection)
</details>
<details><summary><b>ClassRename</b> [Umbenennen]</summary>
> Ändert den Paketnamen und benennt Klassen um (sogar in der Manifest-Datei).
> [:page_facing_up: ClassRename-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/class_rename)
</details>
<details><summary><b>ConstStringEncryption</b> [Verschlüsselung]</summary>
> Verschlüsselt konstante Zeichenketten im Code.
> [:page_facing_up: ConstStringEncryption-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/const_string_encryption)
</details>
<details><summary><b>DebugRemoval</b> [Code]</summary>
> Entfernt Debug-Informationen.
> [:page_facing_up: DebugRemoval-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/debug_removal)
</details>
<details><summary><b>FieldRename</b> [Umbenennen]</summary>
> Benennt Felder um.
> [:page_facing_up: FieldRename-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/field_rename)
</details>
<details><summary><b>Goto</b> [Code]</summary>
> Fügt einer Methode eine `goto`-Anweisung ein, die auf das Ende der Methode zeigt, und eine
> weitere `goto`, die auf die Anweisung nach der ersten `goto` zeigt; es modifiziert den
> Kontrollflussgraphen durch Hinzufügen von zwei neuen Knoten.
> [:page_facing_up: Goto-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/goto)
</details>
<details><summary><b>LibEncryption</b> [Verschlüsselung]</summary>
> Verschlüsselt native Bibliotheken.
> [:page_facing_up: LibEncryption-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/lib_encryption)
</details>
<details><summary><b>MethodOverload</b> [Code]</summary>
> Nutzt die Überladungsfunktion der Programmiersprache Java aus, um verschiedenen Methoden denselben Namen
> zuzuweisen, aber mit unterschiedlichen Argumenten. Gegeben eine bereits vorhandene
> Methode erstellt diese Technik eine neue void-Methode mit demselben Namen und denselben Argumenten,
> fügt aber zusätzlich neue zufällige Argumente hinzu. Der Rumpf der neuen Methode
> wird dann mit zufälligen arithmetischen Anweisungen gefüllt.
> [:page_facing_up: MethodOverload-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/method_overload)
</details>
<details><summary><b>MethodRename</b> [Umbenennen]</summary>
> Benennt Methoden um.
> [:page_facing_up: MethodRename-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/method_rename)
</details>
<details><summary><b>NewAlignment</b> [Trivial]</summary>
> Richtet die Anwendung neu aus.
> [:page_facing_up: NewAlignment-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/new_alignment)
</details>
<details><summary><b>NewSignature</b> [Trivial]</summary>
> Signiert die Anwendung mit einer neuen benutzerdefinierten Signatur neu.
> [:page_facing_up: NewSignature-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/new_signature)
</details>
<details><summary><b>Nop</b> [Code]</summary>
> Fügt Junk-Code ein. Nop, kurz für *no-operation*, ist eine dedizierte Anweisung, die nichts tut.
> Diese Technik fügt einfach zufällige `nop`-Anweisungen in jede Methodenimplementierung ein.
> [:page_facing_up: Nop-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/nop)
</details>
<details><summary><b>RandomManifest</b> [Ressource]</summary>
> Ordnet Einträge in der Manifest-Datei zufällig neu an.
> [:page_facing_up: RandomManifest-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/random_manifest)
</details>
<details><summary><b>Rebuild</b> [Trivial]</summary>
> Baut die Anwendung neu.
> [:page_facing_up: Rebuild-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/rebuild)
</details>
<details><summary><b>Reflection</b> [Code]</summary>
> Diese Technik analysiert den vorhandenen Code auf Methodenaufrufe der App,
> ignoriert dabei Aufrufe an das Android-Framework (siehe `AdvancedReflection`). Wenn eine
> Anweisung mit einem geeigneten Methodenaufruf gefunden wird (d.h. keine Konstruktormethoden,
> öffentliche Sichtbarkeit, genügend freie Register usw.), wird dieser Aufruf an eine
> benutzerdefinierte Methode umgeleitet, die die ursprüngliche Methode mit den Reflection-APIs aufruft.
> [:page_facing_up: Reflection-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/reflection)
</details>
<details><summary><b>Reorder</b> [Code]</summary>
> Diese Technik besteht darin, die Reihenfolge von Basisblöcken im Code zu ändern. Wenn eine
> Verzweigungsanweisung gefunden wird, wird die Bedingung invertiert (z.B. *Verzweigung, wenn kleiner als*,
> wird zu *Verzweigung, wenn größer oder gleich*) und die Zielbasisblöcke werden entsprechend
> neu angeordnet. Darüber hinaus wird der Code auch zufällig neu angeordnet, indem `goto`-Anweisungen
> missbraucht werden.
> [:page_facing_up: Reorder-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/reorder)
</details>
<details><summary><b>ResStringEncryption</b> [Verschlüsselung]</summary>
> Verschlüsselt Zeichenketten in Ressourcen (nur diejenigen, die im Code aufgerufen werden).
> [:page_facing_up: ResStringEncryption-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/res_string_encryption)
</details>
<details><summary><b>VirusTotal</b> [Sonstiges]</summary>
> Sendet die originale und die verschleierte Anwendung an VirusTotal. Sie müssen
> den VT-API-Schlüssel angeben (siehe Option `-k`).
> [:page_facing_up: VirusTotal-Quellcode](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators/virus_total)
</details>
## ❱ Lizenz
Sie sind frei, diesen Code unter der
[MIT-Lizenz](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/LICENSE) zu verwenden.
## ❱ Danksagungen
[](https://unige.it/en/)
[](https://www.dibris.unige.it/en/)
Diese Software wurde für Forschungszwecke am Computer Security Lab
([CSecLab](https://csec.it/)) entwickelt, das am DIBRIS der Universität Genua beheimatet ist.
## ❱ Team
* [Simone Aonzo](https://simoneaonzo.it/) - Wissenschaftlicher Mitarbeiter
* [Gabriel Claudiu Georgiu](https://github.com/ClaudiuGeorgiu) - Kernentwickler
* [Luca Verderame](https://csec.it/people/luca_verderame/) - Postdoktorand
* [Alessio Merlo](https://csec.it/people/alessio_merlo/) - Fakultätsmitglied
-k VT_API_KEY wird nur benötigt, wenn der VirusTotal-Verschleierer verwendet wird, um den API-Schlüssel festzulegen, der bei der Kommunikation mit Virus Total verwendet werden soll.
--keystore-file KEYSTORE_FILE, --keystore-password KEYSTORE_PASSWORD, --key-alias KEY_ALIAS und --key-password KEY_PASSWORD können verwendet werden, um einen benutzerdefinierten Keystore anzugeben (erforderlich für die APK-Signierung). Wenn --keystore-file verwendet wird, müssen auch --keystore-password und --key-alias angegeben werden, während --key-password nur benötigt wird, wenn der ausgewählte Schlüssel ein anderes Passwort als das Keystore-Passwort hat. Standardmäßig (wenn --keystore-file nicht angegeben ist) wird ein mit Obfuscapk gebündelter Keystore für die Signierungsvorgänge verwendet.
--ignore-packages-file IGNORE_PACKAGES_FILE ist ein Pfad zu einer Datei, die zu ignorierende Paketnamen enthält. Alle Klassen in diesen Paketen werden bei Verwendung dieser Option nicht verschleiert. Die Datei sollte einen Paketnamen pro Zeile enthalten, wie im folgenden Beispiel gezeigt:
com.mycompany.dontobfuscate
com.mycompany.ignore
...
--use-aapt2 ist ein Flag, um die aapt2-Option beim Neuerstellen einer App mit apktool zu verwenden.