
.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.