
.NET-Deobfusktor und -Unpacker.
de4dot ist ein quelloffener (GPLv3) .NET-Deobfuskator und Unpacker, geschrieben in C#. Er versucht sein Bestes, eine gepackte und obfuskierte Assembly nahezu in die ursprüngliche Assembly zurückzuverwandeln. Der Großteil der Obfuskation kann vollständig rückgängig gemacht werden (z. B. Zeichenfolgenverschlüsselung), aber die Umbenennung von Symbolen kann nicht rückgängig gemacht werden, da die ursprünglichen Namen (normalerweise) nicht Teil der obfuskierten Assembly sind.
Er verwendet dnlib zum Lesen und Schreiben von Assemblys. Stellen Sie also sicher, dass Sie es besorgen, sonst wird es nicht kompilieren.
Holen Sie sich die Binärdateien vom Buildserver .
Es gibt keinen Support. Schreiben Sie mir keine E-Mail, wenn Sie es nicht verwenden können oder wenn es eine Datei nicht deobfuscieren kann, die mit einem aktualisierten Obfuskator obfuskiert wurde.
Versuchen Sie stattdessen, de4dot selbst zu aktualisieren. Es ist viel einfacher, als Sie denken. Wenn Sie das nicht können, suchen Sie im Internet und Sie sollten ein paar Foren finden, in denen Sie Ihre Frage stellen können.
Hier ist eine pseudozufällige Liste der Dinge, die er tun wird, je nachdem, welcher Obfuskator zum Obfuskieren einer Assembly verwendet wurde:
Einige der oben genannten Obfuskatoren werden selten verwendet (z. B. Goliath.NET), daher wurden sie viel weniger getestet. Helfen Sie mir, indem Sie Fehler oder Probleme melden, die Sie finden.
Manchmal werden die obfuskierte Assembly und alle ihre Abhängigkeiten zur Ausführung in den Speicher geladen. Verwenden Sie eine sichere Sandbox-Umgebung, wenn Sie den Verdacht haben, dass die Assembly oder die Assemblys Schadsoftware sind.
Selbst wenn die aktuelle Version von de4dot eine bestimmte Assembly nicht zur Ausführung in den Speicher lädt, könnte es eine zukünftige Version tun.
Ziehen Sie die Datei(en) auf de4dot.exe und warten Sie ein paar Sekunden.
Wenn mehr als eine Assembly obfuskiert wurde, müssen Sie sehr wahrscheinlich alle gleichzeitig deobfuscieren, es sei denn, Sie deaktivieren die Symbolumbenennung. Der Grund ist, dass, wenn Assembly A einen Verweis auf Klasse C in Assembly B hat und Sie nur in Assembly B Symbole umbenennen, Klasse C z. B. in Class0 umbenannt werden könnte, der Verweis in Assembly A jedoch weiterhin auf eine Klasse namens C in Assembly B verweist. Wenn Sie beide Assemblys gleichzeitig deobfuscieren, werden auch alle Verweise aktualisiert.
Die folgende Befehlszeile deobfusciert alle Assemblys, die von einem unterstützten Obfuskator obfuskiert wurden, und speichert die Assemblys in c:\output
de4dot -r c:\input -ru -ro c:\output
-r bedeutet rekursive Suche. -ru bedeutet, dass unbekannte Dateien ignoriert werden sollen. -ro bedeutet, dass die Ausgabedateien im folgenden Verzeichnis abgelegt werden sollen. Normalerweise würden Sie zuerst c:\input nach c:\output kopieren und dann den Befehl ausführen. Auf diese Weise befinden sich alle Dateien in c:\output, auch Nicht-Assemblys und nicht verarbeitete Assemblys. Wenn de4dot fertig ist, doppelklicken Sie einfach auf die Hauptassembly in c:\output, und sie sollte hoffentlich starten.
Verwenden Sie die Option -d, um den Obfuskator zu erkennen, ohne eine Assembly zu deobfuscieren.
Finden Sie alle .NET-Assemblys und erkennen Sie den Obfuskator. Wenn es sich um einen nicht unterstützten Obfuskator handelt oder wenn sie nicht obfuskiert ist, wird „Unknown obfuscator" ausgegeben.
de4dot -d -r c:\input
Dasselbe wie oben, außer dass nur angezeigt wird, welche Dateien von einem unterstützten Obfuskator obfuskiert wurden.
de4dot -d -r c:\input -ru
Obfuskator erkennen
de4dot -d file1.dll file2.dll file3.dll
In seltenen Fällen möchten Sie vielleicht die Metadaten-Tokens beibehalten. Verwenden Sie --preserve-tokens oder --preserve-table. Ziehen Sie auch die Verwendung von --keep-types in Betracht, da dadurch keine vom Obfuskator hinzugefügten Typen und Methoden entfernt werden. Eine weitere nützliche Option ist --dont-create-params. Wenn sie verwendet wird, erstellt der Renamer keine Param-Zeilen für Methodenparameter, die keine Param-Zeile haben. Auf diese Weise wird die ParamPtr-Tabelle nicht zu Ihren Assemblys hinzugefügt. Peverify hat einen Fehler und unterstützt dies nicht (Sie werden viele "errors" sehen).
Die #Strings-, #US- und #Blob-Heaps können ebenfalls beibehalten werden, indem Sie --preserve-strings, --preserve-us bzw. --preserve-blob verwenden. Von diesen dreien ist --preserve-us am nützlichsten, da die ldstr-Anweisung und module.ResolveString() direkt auf den #US-Heap verweisen.
--preserve-sig-data sollte verwendet werden, wenn der Obfuskator am Ende von Signaturen zusätzliche Daten hinzufügt, die er für eigene Zwecke verwendet, z. B. als Entschlüsselungsschlüssel. Confuser ist ein Obfuskator, der dies tut.
--preserve-tokens bewahrt alle wichtigen Tokens, aktiviert aber auch --preserve-us, --preserve-blob und --preserve-sig-data.
Wenn es als unbekannter (nicht unterstützter) Obfuskator erkannt wird (oder wenn Sie es mit -p un erzwingen), werden alle Tokens beibehalten, einschließlich des #US-Heaps und aller zusätzlichen Daten am Ende von Signaturen. Außerdem werden keine Obfuskator-Typen, -Felder oder -Methoden entfernt.
Alle wichtigen Tokens, #US, #Blob und zusätzliche Signaturdaten beibehalten.
de4dot --preserve-tokens file1.dll
Alle wichtigen Tokens, #US, #Blob und zusätzliche Signaturdaten beibehalten und keine vom Obfuskator hinzugefügten Typen/Felder entfernen
de4dot --keep-types --preserve-tokens file1.dll
Alle wichtigen Tokens, #US, #Blob und zusätzliche Signaturdaten beibehalten und keine zusätzlichen Param-Zeilen erstellen, um zu verhindern, dass die ParamPtr-Tabelle erstellt wird.
de4dot --dont-create-params --preserve-tokens file1.dll
Alle wichtigen Tokens außer den Param-Tokens beibehalten.
de4dot --preserve-table all,-pd file1.dll
Obwohl de4dot viele Obfuskatoren unterstützt, gibt es immer noch einige, die es nicht unterstützt. Um Zeichenfolgen zu entschlüsseln, müssen Sie zunächst herausfinden, welche Methode oder Methoden Zeichenfolgen entschlüsseln. Um das Methoden-Token dieser Zeichenfolgen-Entschlüsseler zu erhalten, können Sie ILDASM mit aktivierter Option 'show metadata tokens' verwenden. Ein Methoden-Token ist eine 32-Bit-Zahl und beginnt mit 06, z. B. 06012345.
Dieser Befehl lädt die Assembly file1.dll durch Aufruf von Assembly.Load() in den Speicher. Wenn er Aufrufe an die beiden Zeichenfolgen-Entschlüsseler (06012345 und 060ABCDE) erkennt, ruft er sie durch Erstellen einer dynamischen Methode auf und speichert das Ergebnis (die entschlüsselte Zeichenfolge). Der Aufruf an den Zeichenfolgen-Entschlüsseler wird entfernt und die entschlüsselte Zeichenfolge erscheint an seiner Stelle.
de4dot file1.dll --strtyp delegate --strtok 06012345 --strtok 060ABCDE
Da die Assembly geladen und ausgeführt wird, stellen Sie sicher, dass Sie dies in einer Sandbox ausführen, wenn Sie den Verdacht haben, dass die Datei Schadsoftware ist.
de4dot ist nicht perfekt. Wenn es einen Obfuskator nicht erkennt, können Sie die Option -p verwenden, um es zu zwingen, anzunehmen, dass die Assembly damit obfuskiert wurde.
SmartAssembly erzwingen
de4dot file1.dll -p sa
Nicht unterstützten Obfuskator erzwingen
de4dot file1.dll -p un
Für andere Obfuskator-Typen siehe den Hilfebildschirm.
Das Umbenennen von Symbolen ist nicht so einfach wie das Umbenennen von A in B, wenn Reflektion im Spiel ist. de4dot unterstützt derzeit kein Umbenennen von XAML. Wenn Sie also vermuten, dass es WPF verwendet (oder wenn es eine Silverlight-App ist), sollten Sie die Umbenennung deaktivieren, falls die Assembly nicht ausgeführt werden kann.
de4dot --dont-rename file1.dll file2.dll
--keep-names kann auch verwendet werden, um de4dot mitzuteilen, bestimmte Symbole nicht umzubenennen, z. B. "Felder nicht umbenennen".
Benennen Sie alles um, was umbenannt werden sollte, außer Eigenschaften, Ereignisse und Methoden.
de4dot --keep-names pem file1.dll
Die Standard-Regexes sollten ausreichen, außer möglicherweise der, die verwendet wird, wenn ein nicht unterstützter Obfuskator erkannt wird. Um alle Standard-Regexes zu sehen, starten Sie de4dot ohne Argumente; es listet alle Optionen und alle Standardwerte auf.
Z. B. ist derzeit die folgende Standard-Regex, die verwendet wird, wenn Dotfuscator erkannt wird:
!^[a-z][a-z0-9]{0,2}$&!^A_[0-9]+$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$
Wie Sie sehen, ist es nicht nur eine Regex, sondern mehr als eine. Jede wird durch & getrennt, und jede Regex kann durch ein vorangestelltes ! negiert werden. Um es deutlicher zu zeigen, werden diese Regexes verwendet:
(negiert) ^[a-z][a-z0-9]{0,2}$
(negiert) ^A_[0-9]+$
^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$
Zum Ändern der Regex(es) müssen Sie den kurzen Typnamen des Obfuskators kennen (siehe Hilfebildschirm). Z. B. ist es sa bei SmartAssembly und un bei einem nicht unterstützten/unbekannten Obfuskator. Die zu verwendende Option ist --TYPE-name (z. B. --sa-name für SmartAssembly und --un-name für unbekannte/nicht unterstützte Obfuskatoren):
de4dot --un-name "^[a-zA-Z]\w*$" file1.dll
Starten Sie de4dot ohne Argumente, und es zeigt alle Optionen an.