Partager via


Observation et compréhension de la sortie obfusquée

Étape 1 - Utilisation d'un désassembleur

Le Kit de développement .NET Framework SDK est livré avec un désassembleur appelé ildasm, qui vous permet de décompiler les assemblys .NET en instructions de langage assembleur IL. Pour démarrer ildasm, assurez-vous que le Kit de développement .NET Framework SDK est installé et qu'il se trouve sur le chemin d'accès approprié ; tapez ensuite ildasm sur la ligne de commande.

Remarque : si cela ne fonctionne pas alors que vous avez installé Visual Studio, ildasm n'est probablement pas situé sur le chemin d'accès approprié. Pour ouvrir une invite de commandes Visual Studio, dans le menu Démarrer, sélectionnez Visual Studio [version] | Outils Visual Studio | Invite de commandes Visual Studio [version]. Tapez ildasm.

  • Sélectionnez le menu Fichier | Ouvrir et recherchez :
C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\bin\Debug 
  • Sélectionnez ensuite GettingStarted.exe. Cliquez sur Ouvrir. L'assembly désassemblé s'affiche :

  • Pour comparer l'application HelloWorld non obfusquée à la version obfusquée, démarrez une autre copie de l'outil ildasm. Cette fois, recherchez :
C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\Dotfuscated 
  • Sélectionnez ensuite GettingStarted.exe. Cliquez sur Ouvrir.

Placez côte à côte chaque fenêtre de l'outil ildasm. Comparez les deux affichages.

Notez que le code machine non obfusqué contient des noms de méthodes qui sont assez compréhensibles. Par exemple, il est fort probable que la méthode ConverseButton_Click: void (object, class [mscorlib]System.EventArgs) est appelée lorsqu'un clic est effectué sur le bouton Converse. Examinez à présent la version obfusquée. Quelle méthode est appelée lorsqu'un clic est effectué sur le bouton Converse ? C'est difficile à dire. Notez également l'absence de la méthode SaySomething. Elle a été supprimée, car elle n'était utilisée nulle part dans le code.

Double-cliquez sur les méthodes SayHello:string () de l'assembly d'origine et a:string () de l'assembly obfusqué. Ces deux méthodes sont en fait identiques ; toutefois, lorsque vous examinez plus précisément le code IL désassemblé, vous remarquez que les chaînes ont été chiffrées dans la version obfusquée pour rendre le code plus difficile à lire. Par exemple, localisez la ligne suivante dans la version non obfusquée :

IL_0000:  ldstr      "Hello, my name is "

À présent, examinez la version obfusquée et recherchez la chaîne ci-dessus. Si vous avez des difficultés à la trouver, c'est parce qu'elle est chiffrée et prend une apparence similaire à celle-ci :

IL_0000: ldstr bytearray (09 42 26 44 29 46 2B 48 26 4A 67 4C 6D 4E 22 50   
                          28 52 73 54 3B 56 36 58 34 5A 3E 5C 7D 5E 36 60   
                          12 62 43 64 )

Vous pouvez imaginer combien cela peut être confus pour les personnes qui essaient d'effectuer une ingénierie à rebours sur le code, surtout avec des applications plus complexes.

Étape 2 – Décompilation

Si vous pensez que votre code source est uniquement accessible à un petit cercle de techniciens qui comprennent réellement le langage assembleur IL, voyez ce qui suit. Vous pouvez aller plus loin et recréer le code source de notre application en utilisant un décompilateur tel que Reflector ou Anakrino. Ces utilitaires peuvent décompiler directement un assembly .NET dans un langage évolué tel que C#, VB .NET ou C++.

Dans cette section, nous utilisons deux décompilateurs librement accessibles :

  1. Reflector pour .NET, http://www.aisto.com/roeder/dotnet/
  2. Anakrino (version d'interface GUI) / Exemplar (version de ligne de commande), http://www.saurik.com/net/exemplar/

L'exécution d'Anakrino/Exemplar sur le fichier GettingStarted.exe obfusqué provoque l'erreur suivante :

Exemplar.exe has encountered a problem and needs to close.  We are sorry for the inconvenience.

L'exécution de .NET Reflector sur le fichier GettingStarted.exe obfusqué et l'examen d'une méthode telle que a() lève l'exception suivante :

This item appears to be obfuscated and can not be translated.

System.NotSupportedException: Cannot resolve local variable 'Label_0047'.
   at Reflector.CodeModel.Memory.GotoStatement.Resolve()
   at _12.VisitBlockStatement(IBlockStatement statement)
   at _111.VisitStatement(IStatement value)
   at _119.VisitMethodDeclaration(IMethodDeclaration value)
   at _125.VisitMethodDeclaration(IMethodDeclaration value)
   at _126.VisitMethodDeclaration(IMethodDeclaration value)
   at _123.VisitMethodDeclaration(IMethodDeclaration value)
   at _146._1(Boolean )

Par conséquent, Dotfuscator Professional est capable d'empêcher avec succès deux décompilateurs majeurs d'effectuer une ingénierie à rebours sur votre code obfusqué.

© 2002-2007 PreEmptive Solutions. Tous droits réservés.