
Désobfuscateur et unpacker .NET.
de4dot est un désobfuscateur et unpacker .NET open source (GPLv3) écrit en C#. Il fera de son mieux pour restaurer un assembly empaqueté et obfusqué pour le ramener presque à l'assembly d'origine. La plupart des obfuscations peuvent être complètement restaurées (par ex. le chiffrement des chaînes), mais le renommage des symboles est impossible à restaurer car les noms d'origine ne font (généralement) pas partie de l'assembly obfusqué.
Il utilise dnlib pour lire et écrire les assemblies, alors assurez-vous de l'obtenir, sinon il ne compilera pas.
Téléchargez les binaires depuis le serveur de build .
Il n'y a aucun support. Ne m'envoyez pas d'e-mail si vous n'arrivez pas à l'utiliser ou s'il échoue à désobfusquer un fichier obfusqué avec un obfuscateur mis à jour.
Essayez plutôt de mettre à jour de4dot vous-même. C'est beaucoup plus facile que vous ne le pensez. Si vous n'y arrivez pas, cherchez sur Internet et vous devriez trouver quelques forums où poser votre question.
Voici une liste pseudo-aléatoire de ce qu'il fera selon l'obfuscateur utilisé pour obfusquer un assembly :
Certains des obfuscateurs ci-dessus sont rarement utilisés (par ex. Goliath.NET), ils ont donc été beaucoup moins testés. Aidez-moi en signalant les bogues ou les problèmes que vous trouvez.
Parfois, l'assembly obfusqué et toutes ses dépendances sont chargés en mémoire pour être exécutés. Utilisez un environnement sandbox sûr si vous soupçonnez que l'assembly ou les assemblies sont des malwares.
Même si la version actuelle de de4dot ne charge pas un assembly donné en mémoire pour l'exécuter, une version future pourrait le faire.
Glissez-déposez le ou les fichiers sur de4dot.exe et attendez quelques secondes.
Lorsque plusieurs assemblies ont été obfusqués, il est très probable que vous deviez tous les désobfusquer en même temps, sauf si vous désactivez le renommage des symboles. La raison est que si l'assembly A a une référence à la classe C dans l'assembly B, et que vous renommez les symboles uniquement dans l'assembly B, la classe C pourrait être renommée en par ex. Class0, mais la référence dans l'assembly A référence toujours une classe nommée C dans l'assembly B. Si vous désobfusquez les deux assemblies en même temps, toutes les références seront également mises à jour.
La ligne de commande suivante désobfusquera tous les assemblies qui ont été obfusqués par un obfuscateur pris en charge et enregistrera les assemblies dans c:\output
de4dot -r c:\input -ru -ro c:\output
-r signifie recherche récursive. -ru signifie qu'il doit ignorer les fichiers inconnus. -ro signifie qu'il doit placer les fichiers de sortie dans le répertoire suivant. En général, vous copiez d'abord c:\input vers c:\output, puis vous exécutez la commande. Ainsi, tous les fichiers seront dans c:\output, même ceux qui ne sont pas des assemblies et les assemblies non traités. Une fois de4dot terminé, il vous suffit de double-cliquer sur l'assembly principal dans c:\output et il devrait, espérons-le, démarrer.
Utilisez l'option -d pour détecter l'obfuscateur sans désobfusquer aucun assembly.
Recherche tous les assemblies .NET et détecte l'obfuscateur. Si c'est un obfuscateur non pris en charge ou s'il n'est pas obfusqué, il affichera « Unknown obfuscator ».
de4dot -d -r c:\input
Identique à la commande précédente, sauf qu'il affichera uniquement les fichiers qui ont été obfusqués par un obfuscateur pris en charge.
de4dot -d -r c:\input -ru
Détecter l'obfuscateur
de4dot -d file1.dll file2.dll file3.dll
Parfois, dans de rares cas, vous pouvez vouloir préserver les jetons de métadonnées. Utilisez --preserve-tokens ou --preserve-table. Pensez également à utiliser --keep-types car cela ne supprimera aucun type ni aucune méthode ajoutés par l'obfuscateur. Une autre option utile est --dont-create-params. Si elle est utilisée, le renommeur ne créera pas de lignes Param pour les paramètres de méthode qui n'ont pas de ligne Param. Ainsi, la table ParamPtr ne sera pas ajoutée à vos assemblies. Peverify a un bug et ne la prend pas en charge (vous verrez beaucoup d'« erreurs »).
Les tas #Strings, #US et #Blob peuvent également être préservés en utilisant respectivement --preserve-strings, --preserve-us et --preserve-blob. De ces trois, --preserve-us est le plus utile car l'instruction ldstr et module.ResolveString() référencent directement le tas #US.
--preserve-sig-data doit être utilisé si l'obfuscateur ajoute des données supplémentaires à la fin des signatures qu'il utilise à ses propres fins, par ex. comme clés de déchiffrement. Confuser est un obfuscateur qui fait cela.
--preserve-tokens préserve tous les jetons importants mais activera également --preserve-us, --preserve-blob et --preserve-sig-data.