L’obfuscation qui n’existe pas (encore) dans le dictionnaire est un mot emprunté à la langue anglaise définissant l’acte de cacher son code source, de le rendre illisible.

Les programmes managés comme ceux issus des langages dotnet et Java, ne sont pas directement compilés en code binaire. Il sont compilés en un langage intermédiaire puis « vraiment compilés » en temps réel en s’exécutant.

Ces langages permettent donc de retrouver le code source initial à l’aide de « dé-compilateurs » comme le fameux .NET Reflector.

Depuis la popularisation de cet outil, l’obfuscation n’a jamais autant été à la mode.

On peut noter parmi ceux-là, Xenocode Postbuild, SmartAssembly ou encore Babel.

Ils sont souvent payants, ou peu fiables pour certains. On dit d’ailleurs souvent qu’une personne acharnée trouvera quand même le code source même si il lui faut des mois pour le décortiquer.

Cela dit, on arrive donc à un choix double :

  • Payer un programme complet comme SmartAssembly (que je recommande vivement pour une utilisation professionnelle)
  • Utiliser un obfuscateur fait maison très simple qui rendra les programmes comme Reflector non utilisables de façon plutôt fiable

Et je vais vous détailler la seconde méthode tout de suite.

Obfuscation : comment faire

Les pilotes, DLLs et autres fichiers exécutables de Microsoft utilisent ce qu’on appelle un Portable Executable Header. C’est un entête portable à travers les différentes versions de Windows. Entendez par là une normalisation permettant l’exécution de différents codes à travers Windows.

Ce PE header est composé de plusieurs parties dont vous je vous passe les détails parce-que je ne les connais pas trop, et que ça ne nous servira pas vraiment.

Sachez simplement que Reflector a besoin de cet entête pour « désassembler » le fichier et retrouver le code source. On va donc à l’aide d’un simple bout de code en VB.NET corrompre une partie de cet entête appelée le NT header.

C’est très simple, voici le code en question :

Dim FS As New FileStream("C:Users......fichier.exe", FileMode.Open, FileAccess.Write)
 FS.Seek(244, SeekOrigin.Begin)
 FS.WriteByte(10)
 FS.Flush()
 FS.Close()

Remplacez bien-sûr le chemin par un fichier à « obfusquer ».

Ce code va donc écrire (remplacer) la valeur à l’adresse 244 qui correspond au début du NT header.

(Je ne suis pas à l’origine de ce bout de code)

obfuscation

Emplacement de l’octet que l’obfuscateur va modifier. Adresse 244.

Essayez ensuite de l’ouvrir avec Reflector, et vous obtiendrez une erreur « Invalid number of data directories in NT header ».

Vous pouvez donc à présent protéger vos programmes à l’aide de cette solution très simple…. ou désobfusquer (commencent à devenir moches ces mots) les programmes des lecteurs avant vous…

Plus d’information pour apprendre à programmer : 5 étapes pour Débuter en Programmation

Articles similaires

Menu