Verschleierungsprojekte
Ein Verschleierungsprojekt fasst die zu schützenden Assemblys, ihre Abhängigkeiten und die Einstellungen jeder einzelnen zusammen. Babel Desktop stellt es als Graph auf einer Zeichenfläche dar und führt es mit der Engine von Babel Obfuscator aus.
Babel Desktop speichert Projekte als .babel-Dateien, dem MSBuild-Projektformat, das auch die MSBuild-Aufgabe verwendet. Ein in Babel Desktop gespeichertes Projekt können Sie mit MSBuild ausführen, und ein vorhandenes .babel-Projekt können Sie in Babel Desktop öffnen.
Ein Projekt anlegen
Assemblys hinzufügen
Klicken Sie auf dem Startbildschirm auf Assemblys hinzufügen oder in der Symbolleiste der Zeichenfläche auf + Assembly hinzufügen (Ctrl+Shift+A, Cmd+Shift+A unter macOS), oder ziehen Sie .NET-Assemblys aus dem Dateimanager auf die Zeichenfläche. Jede Assembly wird zu einem primären Ziel: einem Knoten auf der Zeichenfläche, den die Engine verschleiert.
Abhängigkeiten verbinden
Fügen Sie die Assemblys hinzu, die mit einem Ziel zusammengeführt, in ein Ziel eingebettet oder von ihm referenziert werden, wie unter Abhängigkeiten beschrieben.
Jedes Ziel konfigurieren
Wählen Sie einen Knoten aus und öffnen Sie den Eigenschaftenbereich, um seine Einstellungen und XML-Regeln zu bearbeiten. Siehe Zieleinstellungen.
Speichern und ausführen
Speichern Sie das Projekt mit Datei > Speichern (Ctrl+S, Cmd+S unter macOS) und klicken Sie dann auf Projekt ausführen (Ctrl+Enter, Cmd+Enter unter macOS). Speichern schreibt die geöffnete .babel-Datei und fragt nur bei einem neuen Projekt nach einem Dateinamen. Um eine Kopie unter anderem Namen zu speichern, verwenden Sie Datei > Speichern unter… (Ctrl+Shift+S, Cmd+Shift+S unter macOS).
Um neu zu beginnen, verwenden Sie Projekt: Neu (Ctrl+N) oder die Schaltfläche Neues Projekt auf der Zeichenfläche. Projekt: Zuletzt verwendete öffnen… in der Befehlspalette öffnet ein kürzlich verwendetes Projekt erneut, und der Dialog Projekt öffnen beginnt im Ordner des zuletzt geöffneten Projekts. Hat das aktuelle Projekt ungespeicherte Änderungen, fragt Babel Desktop, ob sie verworfen werden sollen, bevor es ein anderes Projekt anlegt oder öffnet. Warten Sie vorher, bis ein laufender Auftrag abgeschlossen ist.
Die Zeichenfläche des Projekts
Die Zeichenfläche zeigt jede Assembly als Knoten. Um den Ausschnitt zu verschieben, ziehen Sie den Hintergrund, drehen Sie das Mausrad oder wischen Sie mit zwei Fingern. Um an der Zeigerposition zu zoomen, verwenden Sie die Zwei-Finger-Geste zum Aufziehen und Zusammenziehen oder halten Sie beim Scrollen Ctrl (Cmd unter macOS) gedrückt. Die Zoom-Schaltflächen und Ansicht einpassen bringen den Graphen ins Bild. Ordnen Sie die Knoten durch Ziehen an, oder lassen Sie Ansicht > Graph automatisch anordnen (Ctrl+Shift+L, Cmd+Shift+L unter macOS) die Ziele in der Ausführungsreihenfolge von links nach rechts platzieren, wobei die Abhängigkeiten jedes Ziels links von ihm gestapelt werden. Die Positionen der Knoten werden in der Projektdatei gespeichert.



Ein primäres Ziel mit vier zusammengeführten Assemblys
Lassen Sie den Zeiger eine halbe Sekunde auf einem Knoten ruhen oder steuern Sie den Knoten mit der Tastatur an, um seine Karte zu öffnen. Die Karte eines primären Ziels zeigt seinen Zustand, seine Ausführungsreihenfolge, die Anzahl der Assemblys, die es zusammenführt, einbettet und referenziert, seine Map-Verknüpfungen und den Pfad der Eingabedatei. Nach einem Lauf zeigt sie außerdem den Verschleierungswert.
Abhängigkeiten
Über den oberen und den unteren Anker eines Knotens verbinden Sie Abhängigkeiten. Ziehen Sie vom unteren Anker der Quell-Assembly zum oberen Anker des Ziels, oder klicken Sie die beiden Anker nacheinander an. Eine neue Abhängigkeit erhält einen von drei Typen:
| Typ | Wirkung |
|---|---|
| Zusammenführen | Die Quell-Assembly wird in das Ziel integriert und mit ihm zusammen verschleiert, sodass eine einzige Ausgabe-Assembly entsteht. Siehe Assembly-Zusammenführung. |
| Einbetten | Die Quell-Assembly wird als Ressource im Ziel abgelegt und zur Laufzeit geladen. Siehe Assembly-Einbettung. |
| Referenz | Die Quell-Assembly dient nur dazu, die Referenzen des Ziels aufzulösen. |
Babel Desktop wählt den Typ für Sie. Wenn das Ziel genau die Identität der Quell-Assembly referenziert (Name, Version, Gebietsschema und Token des öffentlichen Schlüssels), erhält die neue Abhängigkeit den Typ „Zusammenführen“, andernfalls den Typ „Referenz“. Um den Typ zu ändern, klicken Sie auf die Linie der Abhängigkeit, wählen Sie im Popover „Zusammenführen“, „Einbetten“ oder „Referenz“ und klicken Sie auf Anwenden. Der Befehl Assembly: Abhängigkeit automatisch hinzufügen… und die Befehle Assembly: Zusammenführungseingabe hinzufügen…, Assembly: eingebettete Assembly hinzufügen… und Assembly: Referenz hinzufügen… in der Befehlspalette fügen Abhängigkeiten über einen Dateiauswahldialog hinzu.
Eine Assembly, die als Zusammenführungseingabe dient, bleibt auf der Zeichenfläche, wird aber nicht eigens verschleiert, weil sie Teil ihres Ziels wird.
Ausführungsreihenfolge und Map-Dateien
Der linke und der rechte Anker verbinden zwei Ziele so, dass das eine vor dem anderen läuft. Ziehen Sie vom rechten Anker des ersten Ziels zum linken Anker des zweiten. Babel Desktop fragt dann, wozu die Verbindung dient:
| Auswahl | Wirkung |
|---|---|
| Nur Ausführungsreihenfolge | Eine Ablaufkante: Ziel A läuft vor Ziel B. Von A nach B wird nichts weitergegeben. |
| Map-Datei weitergeben | Eine Map-Verknüpfung, gezeichnet mit der Beschriftung MAP: A schreibt seine XML-Umbenennungs-Map und B liest sie, sodass B die neuen Namen der öffentlichen Symbole von A verwendet. A läuft vor B. Siehe Assemblyübergreifende Umbenennung. |
Eine Map-Verknüpfung schaltet beim ersten Ziel Generate Map Out File ein und nimmt dessen Map in die Map In Files des zweiten Ziels auf. Legt das erste Ziel weder einen Ausgabepfad noch einen Map-Pfad fest, wird seine Map an einem festen Ort neben seiner Eingabe abgelegt, zum Beispiel BabelOut/Library2.dll.map.xml, damit das zweite Ziel sie immer findet. Map-Verknüpfungen werden nicht gesondert gespeichert: Babel Desktop liest sie aus diesen beiden Einstellungen. Deshalb zeigt auch ein von Hand oder mit Babel UI geschriebenes Projekt seine Map-Verknüpfungen.
Jeder Knoten zeigt seinen Schritt, also die Position, an der er in seinem Ablauf ausgeführt wird. Ein Ablauf ist eine Gruppe von Zielen, die durch Ablaufkanten, Map-Verknüpfungen oder Abhängigkeiten der Typen „Zusammenführen“, „Einbetten“ und „Referenz“ miteinander verbunden sind. Ziele ohne Verbindung zueinander bilden getrennte Abläufe. Innerhalb eines Ablaufs laufen die Ziele in der Reihenfolge der Schritte und dort, wo nichts die Reihenfolge festlegt, in der Reihenfolge des Projekts. Ablaufkanten werden im Projekt als gewöhnliche Abhängigkeiten zwischen MSBuild-Zielen gespeichert.
Babel Desktop weist Verbindungen eines Ziels mit sich selbst und doppelte Kanten zurück und lehnt jede Verbindung ab, durch die Ziele gegenseitig aufeinander warten würden. Warten in einem von der Festplatte geöffneten Projekt Ziele gegenseitig auf ihre Map-Dateien, wird das Projekt trotzdem geöffnet. Babel Desktop zeigt einen Fehler an, der den Kreis benennt, zum Beispiel Library1.dll → Library2.dll → Library1.dll, und das Projekt läuft erst, wenn Sie eine der Verknüpfungen entfernen. Um eine Kante oder eine Map-Verknüpfung zu entfernen, klicken Sie darauf und drücken Sie Delete oder Backspace. Esc bricht eine begonnene Verbindung ab oder hebt die Auswahl auf.
Eine Eingabe ersetzen
Um ein Ziel auf einen neuen Build seiner Assembly umzustellen, ohne seine Einstellungen zu verlieren, wählen Sie den Knoten aus und führen Sie in der Befehlspalette Assembly: Eingabe ersetzen und Einstellungen beibehalten… aus. Assembly: Ausgewähltes Ziel entfernen entfernt ein Ziel samt seinen Kanten.
Einrichtungsbefehle
Drei Befehle der Befehlspalette konfigurieren ein Projekt in einem einzigen Schritt. Fügen Sie zuerst die Assemblys hinzu und führen Sie dann den Befehl aus, der zur Anwendung passt.



Die Einrichtungsbefehle in der Befehlspalette
| Befehl | Wirkung |
|---|---|
| Verschleierung: Zusammenführung in die Hauptassembly einrichten | Führt alle anderen Ziele mit der Hauptassembly zusammen, sodass das Projekt eine einzige Ausgabedatei erzeugt. Die Hauptassembly ist die einzige .exe des Projekts oder, wenn es keine oder mehrere gibt, das erste Ziel. Eine Assembly, die die Engine nicht zusammenführen kann, bleibt unverändert. |
| Verschleierung: Öffentliche Verschleierung einrichten (alle Assemblys) | Bereitet eine Gruppe von Assemblys, die gemeinsam ausgeliefert werden, darauf vor, dass ihre öffentlichen Symbole umbenannt werden. Jedes Ziel erhält eine XML-Regel namens obfuscate public und schreibt seine Umbenennungs-Map, und ein Ziel, das von einem anderen abhängt, liest dessen Map über eine Map-Verknüpfung. |
| Verschleierung: Stufe festlegen… | Wendet eine von drei Schutzstufen auf das ausgewählte Ziel an. |
Die Stufen setzen die folgenden Optionen und lassen alle anderen unverändert:
| Stufe | Schutz |
|---|---|
| Leicht | Umbenennung von Typen, Methoden, Feldern, Eigenschaften und Ereignissen. Der Kontrollfluss, die Verschlüsselungsfunktionen und die Schutzmaßnahmen gegen Analyse sind ausgeschaltet. |
| Ausgewogen | Umbenennung, Kontrollflussverschleierung mit dem Algorithmus goto, Zeichenfolgenverschlüsselung und ILDASM-Unterdrückung. |
| Maximal | Umbenennung, Kontrollflussverschleierung mit goto, switch, case, if und Chained State, Zeichenfolgenverschlüsselung mit dem Algorithmus „stream“, Wertverschlüsselung, MSIL-Verschlüsselung, Manipulationserkennung, Debugging-Schutz und ILDASM-Unterdrückung. Wenn die Lizenz den Algorithmus „stream“ nicht einschließt, wird die Standard-Zeichenfolgenverschlüsselung verwendet. |
Die beiden Einrichtungsbefehle überspringen Paketziele (.apk, .appx und .xap). Keiner der drei Befehle wird ausgeführt, solange ein Auftrag läuft oder eine Änderung noch nicht übernommen ist. Sie ändern das geöffnete Projekt, speichern es aber nicht. So können Sie das Ergebnis zuerst auf der Zeichenfläche und im Eigenschaftenbereich prüfen. Wenden Sie nach einer höheren Stufe eine niedrigere an, werden die zusätzlichen Schutzmaßnahmen wieder ausgeschaltet.
Zieleinstellungen
Wählen Sie einen Knoten aus und klicken Sie oben rechts auf der Zeichenfläche auf die Schaltfläche Eigenschaften, oder drücken Sie bei ausgewähltem Knoten Enter, um den Eigenschaftenbereich zu öffnen. Die Registerkarte Einstellungen führt alle Optionen von Babel Obfuscator für das ausgewählte Ziel auf, gegliedert in die Gruppen Umbenennung, Kontrollfluss, Codeverschlüsselung, Optimierung, Signierung und Schutz, Dateien und Abhängigkeiten, Output & diagnostics und Advanced. Tippen Sie in das Feld Einstellung suchen, um die Liste zu filtern.



Der Eigenschaftenbereich des ausgewählten Ziels
Die Einstellungen tragen die Optionsnamen der MSBuild-Aufgabe. Was sie bewirken, beschreiben daher die Referenz der Babel-Aufgabe und die Seiten der einzelnen Schutzfunktionen. Jede Option erhält ein Steuerelement, das zu ihrem Typ passt: Kontrollkästchen für Schalter, Listen für Algorithmen, Datei- und Ordnerauswahl für Pfade sowie Editoren für Filter und Eigenschaftszuordnungen.



Einstellungen der Codeverschlüsselung: Zeichenfolgen-, MSIL- und Wertverschlüsselung
Zusammengesetzte Optionen wie Control Flow Obfuscation zeigen ein Steuerelement je Eigenschaft. Das nächste Bild zeigt die Schalter für den Kontrollfluss. Der letzte, chain, schaltet den Algorithmus Chained State der Ultimate-Edition ein.



Eigenschaften von Control Flow Obfuscation
Passwörter, etwa für einen Signaturschlüssel oder eine Map-Datei, werden nur für die laufende Sitzung behalten. Sie werden nie in die Projektdatei geschrieben, nach einem Neustart geben Sie sie daher erneut ein. Braucht die Engine während eines Laufs ein Passwort, fragt Babel Desktop danach.
Babel Desktop erhält die Teile einer .babel-Datei, die es nicht bearbeitet, etwa Kommentare, benutzerdefinierte Eigenschaften und benutzerdefinierte MSBuild-Aufgaben. MSBuild-Importe, Bedingungen und benutzerdefinierte Aufgaben wertet es nicht aus: Ein Projekt, das davon abhängt, muss mit MSBuild ausgeführt werden.
Map-Dateien
Die Gruppe Map-Dateien im Eigenschaftenbereich fasst die Map-Einstellungen des ausgewählten Ziels zusammen:
- Schreibt seine Umbenennungs-Map schaltet die Map-Datei des Ziels ein oder aus. Der Pfad darunter gibt an, wohin die Map geschrieben wird, standardmäßig neben die verschleierte Assembly. Mit Ändern… wählen Sie eine andere Datei.
- Maps aus anderen Zielen führt die Map-Verknüpfungen auf, die an diesem Ziel enden. Klicken Sie auf den Namen eines Ziels, um es auszuwählen.
- Weitere Map-Dateien führt die Maps auf, die dieses Ziel liest und die kein Ziel des Projekts schreibt, etwa die Map einer Bibliothek, die in einem früheren Build verschleiert wurde. Map-Datei hinzufügen… fügt eine hinzu, Entfernen nimmt sie wieder heraus.
XML-Regeln
Auf der Registerkarte XML-Regeln bearbeiten Sie die eingebetteten XML-Verschleierungsregeln des ausgewählten Ziels. Der Editor hebt die XML-Syntax hervor, und Validieren prüft die Regeln gegen das Schema der Babel-Regeln und meldet Zeile und Spalte jedes Fehlers. XML öffnen lädt eine Regeldatei in den Editor, XML-Datei speichern schreibt den Inhalt des Editors in eine Datei, und Auf Assembly anwenden legt die Regeln im Ziel ab. Eingebettete Regeln werden in der Projektdatei gespeichert.



Eingebettete XML-Regeln eines Ziels
Engine-Plugins
Plugins für Babel Obfuscator werden je Ziel mit Engine-Plugins: DLL-Pfade konfigurieren festgelegt. Engine-Plugins: Argumentnamen ermitteln liest die Argumentnamen, die ein Plugin deklariert, sodass Sie seine Argumente ausfüllen können. Plugins sind .NET-Code, der innerhalb der Engine läuft. Verwenden Sie deshalb nur Plugins, denen Sie vertrauen.
Das Projekt ausführen
Klicken Sie oben rechts auf der Zeichenfläche auf Projekt ausführen, drücken Sie Ctrl+Enter (Cmd+Enter unter macOS) oder wählen Sie Ausführen > Verschleierung ausführen. Sofern ein Ziel keinen eigenen Ausgabepfad festlegt, wird die verschleierte Assembly in einen Ordner BabelOut neben der jeweiligen Eingabe-Assembly geschrieben. Vor dem Start des Laufs prüft Babel Desktop, wohin die Ausgabe geschrieben wird. Es überschreibt weder eine Eingabe-Assembly noch eine Schlüsseldatei oder ein Plugin, und es fragt nach, bevor es vorhandene Ausgabedateien ersetzt.
Der Bereich Aktivität zeigt die laufende Phase, eine Fortschrittsanzeige und das Engine-Protokoll. Die Registerkarte Protokoll führt jede Meldung auf, die die Engine auf dem Verbose Level des Ziels ausgibt. Warnungen und Fehler werden zusätzlich auf der Registerkarte Probleme gesammelt. Jeder Zielknoten meldet seinen Zustand auf der Zeichenfläche. Auftrag abbrechen hält den Lauf an. Die Ziele laufen nacheinander. Schlägt ein Ziel fehl, werden die nachfolgenden Ziele nicht ausgeführt.



Ein abgeschlossener Lauf im Bereich „Aktivität“
Nach einem Lauf öffnen die Schaltflächen oben im Bereich Aktivität den Ausgabeordner und starten die verschleierte Anwendung. Datei > Ausgabe im Ordner anzeigen und Ausführen > Verschleierte App starten (Ctrl+F5, Cmd+F5 unter macOS) bewirken dasselbe. Babel Desktop startet eine ausführbare Windows-Datei direkt und eine .NET-Anwendung über dotnet, wenn ihre Datei .runtimeconfig.json vorhanden ist. Eine Bibliothek bietet es nicht zum Starten an.
Verschleierungswert
Nach einem abgeschlossenen Lauf zeigt die Karte jedes Ziels einen Verschleierungswert von 0 bis 100. Damit sehen Sie auf einen Blick, ob der Lauf die erwarteten Schutzfunktionen angewendet hat. Lassen Sie den Zeiger auf dem Ziel ruhen, um die Karte zu öffnen.



Der Verschleierungswert eines Ziels, das vier Assemblys zusammenführt
Der Wert ist die Summe der Punkte aus fünf Schutzebenen. Jeder Balken zeigt, wie viele Punkte eine Ebene von ihrem Höchstwert erreicht hat. Bei einem niedrigen Wert erkennen Sie so, welche Ebene fehlt.
| Ebene | Punkte | Punkte gibt es für |
|---|---|---|
| Umbenennung | 30 | Den Anteil der geeigneten Symbole, die umbenannt wurden |
| Kontrollfluss | 25 | Den Anteil der Methoden, die verwürfelt wurden. Methoden ohne Verzweigungen bleiben unangetastet, deshalb genügt die Hälfte der Methoden für die volle Punktzahl |
| Zeichenfolgenverschlüsselung | 15 | Verschlüsselte Zeichenfolgen |
| Codeschutz | 15 | MSIL-Verschlüsselung (7), dynamische Proxy-Aufrufe (4) und Wertverschlüsselung (4) |
| Analyseschutz | 15 | Manipulationserkennung, Debugging-Schutz und ILDASM-Unterdrückung, je 5 Punkte |
Der Wert wird unter 35 als Schwach eingestuft, ab 35 als Mittel, ab 60 als Gut und ab 80 als Stark. Er stammt aus den Statistiken des letzten abgeschlossenen Laufs des Projekts. Assemblys, die mit einem Ziel zusammengeführt werden, zählen zu dessen Wert und zeigen keinen eigenen. Ein Ziel, das noch nicht gelaufen ist, zeigt keinen Wert.
Der Wert zählt die Schutzfunktionen, die ein Lauf angewendet hat. Er sagt nichts darüber aus, wie lange das Ergebnis einem bestimmten Werkzeug standhält. Ein niedrigerer Wert kann der richtige sein: Eine Bibliothek mit öffentlicher API behält ihre öffentlichen Namen und erhält deshalb weniger Punkte für die Umbenennung.
Abläufe parallel ausführen
Ein Projekt mit mehreren unabhängigen Abläufen, etwa Bibliotheken, die einander nicht referenzieren, kann diese gleichzeitig verschleiern. Schalten Sie unter Einstellungen > Verschleierung die Option Unabhängige Abläufe parallel ausführen ein und wählen Sie, wie viele Abläufe gleichzeitig laufen, von 2 bis 4. Die Option ist standardmäßig ausgeschaltet.
Jeder Ablauf läuft in einem eigenen Engine-Prozess, und innerhalb eines Ablaufs laufen die Ziele weiterhin der Reihe nach. Babel Desktop prüft das gesamte Projekt, bevor ein Ablauf startet, wie bei einem einzelnen Lauf. Während die Abläufe laufen, gilt:
- Die Fortschrittsanzeige zählt die abgeschlossenen Ziele im Verhältnis zu den geplanten, und jede Zeile des Protokolls beginnt mit dem Namen ihrer Assembly, zum Beispiel
[Library1.dll]. - Ein Ziel, das fehlschlägt, hält seinen eigenen Ablauf an. Die anderen Abläufe laufen weiter, und der Lauf wird als fehlgeschlagen gemeldet.
- Auftrag abbrechen hält alle Abläufe an.
- Brauchen mehrere Ziele ein Zertifikatspasswort, fragt Babel Desktop nach einem Passwort nach dem anderen und nennt die Assembly, die es benötigt.
Jeder Engine-Prozess braucht ein paar Sekunden zum Starten. Die parallele Ausführung spart daher bei großen Assemblys Zeit. Ein kleines Projekt kann schneller fertig sein, wenn die Ziele nacheinander laufen. Mit einer Floating-Lizenz führt Babel Desktop immer nur einen Ablauf aus.
Werkzeuge: Auftragswarnungen in der Befehlspalette führt die Warnungen des aktuellen Laufs auf, und Werkzeuge: Warnungsreferenz öffnet den durchsuchbaren Katalog der Warncodes der Engine mit ihren Beschreibungen.



Die Referenz der Engine-Warnungen
Ausführungsergebnisse
Nach einem Lauf öffnet die Schaltfläche Ausführungsergebnisse in der Symbolleiste der Zeichenfläche die Schutzstatistiken. Wählen Sie einen Lauf aus dem Verlauf, eine verschleierte Assembly und einen Bericht:
| Bericht | Inhalt |
|---|---|
| Umbenennung | Umbenannte und insgesamt vorhandene Typen, Methoden, Felder, Eigenschaften und Ereignisse, mit einem Diagramm der Abdeckung |
| Kontrollfluss | Verwürfelte Methoden, eingefügte Verzweigungsanweisungen und Iterationen, mit einer Treemap nach Namespace und Typ und, wenn vollständige Statistiken erfasst werden, der zyklomatischen Komplexität vor und nach der Transformation |
| Zeichenfolgenverschlüsselung | Der Verschlüsselungsalgorithmus und die verschlüsselten Zeichenfolgen je Methode |
| Codeverschlüsselung | Die verschlüsselten Methoden nach Namespace und Typ |
| Dynamischer Proxy | Die über Proxys geleiteten Aufrufe und die Delegattypen je Zielmethode |
| Optimierungen | Entfernung ungenutzten Codes und Zähler der Optimierung |
| Ausführungszeit | Die Dauer jeder Engine-Phase |
Sie können die Tabellen durchsuchen und sortieren und in den Treemaps vom Namespace zum Typ hineinzoomen. Ausgabe anzeigen, Engine-Protokoll anzeigen und Statistikdaten anzeigen öffnen den Ausgabeordner, das vollständige Engine-Protokoll und die Rohdatei mit den Statistiken des Laufs. Babel Desktop bewahrt die Ergebnisse der letzten 30 Läufe auf.



Statistiken der Umbenennung



Statistiken des Kontrollflusses
Die Statistikdateien enthalten ursprüngliche Symbolnamen und Zeichenfolgenwerte. Halten Sie sie, wie die XML-Map-Dateien, von der ausgelieferten Anwendung fern.
Stacktraces decodieren
Um die verschleierten Stacktraces einer geschützten Anwendung mit ihren XML-Map-Dateien in die ursprünglichen Namen zurückzuübersetzen, verwenden Sie den Stack-Decoder.