en | fr | Contact  | Imprimer  | Partager

Obfu-VBA

1 Qu'est-ce que l'Obfuscation ?

L'obfuscation est une opération générale qui consiste à masquer le sens d'une information, en la rendant ambigüe, d'apparence trompeuse ou simplement difficile à interpréter.

Dans le contexte du développement informatique, l'obfuscation est utilisée pour protéger la propriété intellectuelle d'un logiciel en rendant incompréhensible (pour un être humain) son code source tout en étant compilable ou interprétable par un ordinateur.

Les applications Excel-VBA sont particulièrement concernées par ce sujet : le code source VBA est embarqué en clair dans le classeur qui contient l'application. La protection par mot-de-passe du code VBA est tout-à-fait symbolique puisque certains logiciels du marché capables d'ouvrir une application Excel ignorent ce mot-de-passe.

Obfu-VBA combine les 3 méthodes suivantes pour obfusquer le code VBA d'une application Excel : suppression des commentaires, suppression du style de codage (lignes blanches, indentation et instructions sur plusieurs lignes) et renommage des identificateurs (variables, constantes, fonctions, procédures, paramètres, modules, classes, userforms et contrôles).

2 Principe d'utilisation

Obfu-VBA ne travaille pas directement sur le classeur Excel contenant votre application VBA. Voici les différentes étapes nécessaires à l'obfuscation de votre application :

1 Créez 1 répertoire d'entrée qui contiendra les objets exportés de votre application et 1 répertoire de sortie qui contiendra les objets obfusqués.

2 Exportez tous les modules, modules de classe et userforms de votre projet VBA dans le répertoire d'entrée : votre application étant chargée dans Excel, depuis l'éditeur VBA d'Excel, faite un clic-droit sur chaque objet contenant du code VBA puis sélectionner "Exporter un fichier..." (voir ci-contre). Vous pouvez ensuite refermer votre application.

3 Depuis Excel, ouvrez le classeur Obfu-VBA, effectuez le paramétrage nécessaire (voir le chapitre 3.1) et lancez le traitement qui peut durer quelques minutes, selon la taille des fichiers à traiter.

4 Créez dans Excel un nouveau classeur, copiez-y si nécessaire les feuilles de votre ancien classeur, importez depuis l'éditeur VBA les objets obfusqués contenus dans le répertoire de sortie.

5 La création d'une version obfusquée de votre application Excel-VBA est terminée. Reste à vérifier le bon fonctionnement de celle-ci : commencez par la sauvegarder, lancez une compilation (Editeur VBA -> menu Débogage -> Compiler) et testez complètement son bon fonctionnement.

Exporter un fichier

En cas de problème (la compilation échoue, l'éxécution plante, le fonctionnement n'est pas conforme à l'application d'origine, l'obfuscation n'est pas complète), la première action à réaliser est de vérifier que les recommandations de Obfu-VBA (voir chapitre 3.5) sont respectées. Après ces vérifications, vous pouvez contacter ToolOscope pour demande de support ou d'évolution.

3 L'application Obfu-VBA

3.1 La feuille Projet

Feuille de commande

Cette feuille constitue l'interface de commande de Obfu-VBA. Les cellules à renseigner par l'utilisateur sont sur fond jaune (numérotées de 2 à 9 en rouge). Chacune de ces cellules possède un commentaire qui décrit le contenu attendu. Ces commentaires sont repris dans l'encadré ci-contre.

Lorsque toutes les données en entrée sont saisies, l'utilisateur clique sur le bouton "Lancer Obfu-VBA" pour éxécuter le traitement, qui se déroule en 2 passes.

A chaque passe, Obfu-VBA lit successivement tous les modules en entrée (7) qui doivent être présents dans le dossier en entrée (5). Lors de la seconde passe, les modules obfusqués sont écrits dans le dossier de sortie (6). L'utilisateur peut suivre l'avancement du traitement par les nombres de lignes lues et écrites qui s'affichent sur la feuille.

Le nom des modules .bas et des classes .cls est obscurci. Le nom des userforms .frm est aussi obscurci mais pas les noms des fichiers qui les contiennent. Lors de l'import des userforms obfusqués, le nom des fichiers disparaît.

Vous pouvez dupliquer cette feuille pour conserver dans le classeur Obfu-VBA par exemple 1 feuille de commande par projet. Ainsi, lorsque vous modifierez le code source de vos projets, vous ne perdrez pas de temps à re-saisir dans Obfu-VBA les modules qui les composent.

Commentaires des cellules

1 Cette feuille peut être dupliquée dans ce même classeur autant de fois que vous avez de projets VBA différents à traiter.

2 Renseigner le nom de la feuille qui contient les mots réservés.
Facultatif. Si à blanc, les mots réservés ne sont pas nécessairement obfusqués, mais les performances peuvent diminuer.
Si renseigné, la feuille doit exister dans le même classeur.

3 Renseigner le nom de la feuille où sera écrit le code et les types détectés des variables (65530 lignes maximum).
Facultatif. Si à blanc, le code ne sera pas sorti.
Si renseigné, la feuille doit exister dans le même classeur.

4 Renseigner le nom de la feuille où sera écrite la table de correspondance entre les identificateurs en clair et obfusqués.
Facultatif. Si à blanc, la table ne sera pas sortie.
Si renseigné, la feuille doit exister dans le même classeur.

5 Renseigner le chemin du dossier qui contient les fichiers VBA à traiter, préalablement exportés d'Excel.
Obligatoire.

6 Renseigner le chemin du dossier qui contiendra les fichiers VBA obfusqués. Ces fichiers devront être importés manuellement dans un nouveau classeur Excel pour recomposer votre application.
Obligatoire.

7 Renseigner dans cette colonne les noms des fichiers VBA exportés de votre application Excel, sans extension. Ces fichiers doivent se trouver dans le dossier "Entrée".
64 fichiers maximum + limitation mémoire des projets Excel-VBA.

8 Renseigner l'extension du nom de chaque fichier VBA situé dans la cellule à gauche :
- cls pour les ModuleClass,
- bas pour les Modules,
- frm pour les UserForms.

9 Renseigner dans cette colonne les identificateurs qui ne doivent pas être obfusqués.
Facultatif.

3.2 Les mots réservés

Cette feuille facultative contient les mot-clés réservés du langage VBA. Elle peut être enrichie en cas de lacune.

Obfu-VBA analyse chaque mot rencontré dans le code à traiter afin de déterminer s'il doit être obscurci. Cette liste de mots réservés permet de gagner du temps lors du traitement.

Seuls les identificateurs explicitement déclarés dans votre projet seront obscurcis. Cette liste de mots réservés n'est donc pas discriminante.

Mots réservés

3.3 La table de correspondance des identificateurs

Table de conversion

Lors du traitement, Obfu-VBA extrait tous les identificateurs déclarés dans votre projet et leur associe un identificateur obscur. Si son nom est défini sur la feuille Projet, cette feuille restitue, en fonction de leur portée (projet, module ou locale), les identificateurs en clair et obscurcis, leur type et éventuellement leur conteneur pour les membres d'une classe ou d'un type déclaré par l'utilisateur.

3.4 La feuille du code lu

Code analysé

Obfu-VBA écrit sur cette feuille (si son nom est défini sur la feuille Projet) le code lu et analysé : séparation en identificateurs et autres caractères. Sous chaque identificateur, il indique sur 2 lignes la nature qu'il a détecté : libellé, mot-clé réservé, variable, fonction... et le type du conteneur.

3.5 La feuille d'aide

Cette feuille contient les recommandations concernant le code à traiter :

  • Toutes les variables doivent être déclarées (option explicit recommandée) et typées (pas de variant par défaut).
  • En cas d'obfucation à tort d'identificateurs, les déclarer en exceptions.
  • Les évènements sur contrôles doivent être déclarés Private.
  • Les contructeurs et destructeurs de classe doivent être déclarés Private.
  • Le constructeur doit être écrit "Class_Initialize" (attention aux majuscules !).
  • Le destructeur doit être écrit "Class_Terminate" (attention aux majuscules !).
  • Les identificateurs doivent être écrits précisément de la même manière (majuscules, accents...).
  • Eviter de faire porter le même nom à une fonction (ou sub) et à un type.
  • Eviter d'utiliser des caractères accentués ou spéciaux dans les identificateurs.
  • Déclarer en exceptions les contrôles ou variables dont le nom est testé dans un libellé.

4 Exemple : application ObfuTest

Application ObfuTest

La petite application ObfuTest ne fait rien de sérieux et est écrite pour tester et montrer le fonctionnement de Obfu-VBA. Elle comporte 1 module de code, 1 module de classe et 1 userform, dont les versions originales et obfusquées sont présentées ci-dessous.

Feuille Projet

4.1 Module de classe "MyClass.cls"

Code source
VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END Attribute VB_Name = "MyClass" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Option Explicit Const MYCONST1 = "toto" Const MYCONST2 = 3 Private mvar1 As String Private mvar2 As Long Public mvar3 As Boolean 'pour test de Me Rem constructeur : son nom ne doit pas être obfuscaté Private Sub Class_Initialize() mvar1 = MYCONST1 mvar2 = MYCONST2 Me.mvar3 = False End Sub Rem destructeur : son nom ne doit pas être obfuscaté Private Sub Class_Terminate() MsgBox "Object of class MyClass destroyed !" End Sub Friend Property Let var1(parm1 As String) mvar1 = parm1 End Property Friend Property Get var1() As String var1 = mvar1 End Property Friend Property Let var2(parm1 As Long) mvar2 = parm1 End Property Friend Property Get var2() As Long mvar2 = var2 End Property
Code obfusqué
VERSION 1.0 CLASS BEGIN MultiUse = -1 END Attribute VB_Name = "F1" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Option Explicit Const F12 = "toto" Const F13 = 3 Private F14 As String Private F15 As Long Public F2 As Boolean Private Sub Class_Initialize() F14 = F12 F15 = F13 Me.F2 = False End Sub Private Sub Class_Terminate() MsgBox "Object of class MyClass destroyed !" End Sub Friend Property Let F3(F16 As String) F14 = F16 End Property Friend Property Get F3() As String F3 = F14 End Property Friend Property Let F4(F16 As Long) F15 = F16 End Property Friend Property Get F4() As Long F15 = F4 End Property

4.2 Module de code "MyModule.bas"

Code source
Attribute VB_Name = "MyModule" Option Explicit Public Type myType mvar1 As String mvar2 As Long mvar3 As Boolean End Type Const MYCONST1 = "MyModule" Const MYCONST2 = 4 Public Type my2ndType mvar2(1 To 5) As myType mvar1 As Boolean End Type Rem sub de test Private Sub monsubPrive(ByRef pparm1 As String, ByVal pparm2 As Boolean, pparm3 As myType) Dim mvar1 As String, lvarA As Boolean, mvar2 As my2ndType pparm3.mvar1 = pparm1 With pparm3 .mvar2 = -3 End With Rem 3 identificateur mvar2 qui désignent tous des variables différentes mvar2.mvar2(5 + pparm3.mvar2).mvar2 = -1234567 lvarA = True mvar1 = MYCONST1 MsgBox "monsubPrive : " & pparm3.mvar1 & " " & mvar1 End Sub Public Sub lance() Dim laClasse As MyClass, var2 As String, mvar1 As myType Set laClasse = New MyClass With ActiveSheet .Cells(2, 2) = "Test démarré" End With Rem ne pas confondre les 2 "var2" laClasse.var2 = 12345 - 1234 var2 = " toto " monsubPrive "test", True, mvar1 MyUserForm.Show End Sub
Code obfusqué
Attribute VB_Name = "F5" Option Explicit Public Type F6 F1 As String F2 As Long F3 As Boolean End Type Const F12 = "MyModule" Const F13 = 4 Public Type F7 F1(1 To 5) As F6 F2 As Boolean End Type Private Sub F14(ByRef F15 As String, ByVal F16 As Boolean, F17 As F6) Dim F18 As String, F19 As Boolean, F1A As F7 F17.F1 = F15 With F17 .F2 = -3 End With F1A.F1(5 + F17.F2).F2 = -1234567 F19 = True F18 = F12 MsgBox "monsubPrive : " & F17.F1 & " " & F18 End Sub Public Sub lance() Dim F15 As F1, F16 As String, F17 As F6 Set F15 = New F1 With ActiveSheet .Cells(2, 2) = "Test démarré" End With F15.F4 = 12345 - 1234 F16 = " toto " F14 "test", True, F17 F8.Show End Sub

4.3 UserForm "MyUserForm.frm"

Code source
VERSION 5.00 Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} MyUserForm Caption = "Test Obfu-VBA" ClientHeight = 5250 ClientLeft = 45 ClientTop = 345 ClientWidth = 4950 OleObjectBlob = "MyUserForm.frx":0000 StartUpPosition = 1 'CenterOwner End Attribute VB_Name = "MyUserForm" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit Private var1 As MyClass Private var2 As myType Private Sub Fermer_Click() Unload MyUserForm End Sub Rem le nom de ce Sub ne doit pas être obfuscaté Private Sub UserForm_Initialize() Label1.Caption = "valeur initialisée par UserForm_Initialize" Set var1 = New MyClass End Sub Private Sub CommandButton1_Click() MsgBox "TextBox2.Value=" & var1.var1 'ne pas confondre l'instance de MyClass avec son membre de même nom Rem les controles peuvent être qualifiés complètement ou pas du tout MyUserForm.MultiPage1.Page2.TextBox2.Value = "-->" & var1.var1 End Sub Private Sub TextBox2_Change() Dim mvar1 As String, var_2 As Integer, _ var_3 As Boolean 'gestion d'une ligne avec caractère de continuation Rem les controles peuvent être qualifiés complètement ou pas du tout var1.var1 = TextBox2.Value Rem gestion du with : ne pas confondre la variable locale mvar1 avec le membre .mvar1 With var2 .mvar1 = "string" .mvar2 = 123456789 .mvar3 = True End With End Sub
Code obfusqué
VERSION 5.00 Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} F8 Caption = "Test Obfu-VBA" ClientHeight = 5250 ClientLeft = 45 ClientTop = 345 ClientWidth = 4950 OleObjectBlob = "MyUserForm.frx":0000 StartUpPosition = 1 End Attribute VB_Name = "F8" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit Private F12 As F1 Private F13 As F6 Private Sub F11_Click() Unload F8 End Sub Private Sub UserForm_Initialize() FF.Caption = "valeur initialisée par UserForm_Initialize" Set F12 = New F1 End Sub Private Sub FB_Click() MsgBox "TextBox2.Value=" & F12.F3 F8.FC.FE.F10.Value = "-->" & F12.F3 End Sub Private Sub F10_Change() Dim F14 As String, F15 As Integer, F16 As Boolean F12.F3 = F10.Value With F13 .F1 = "string" .F2 = 123456789 .F3 = True End With End Sub

5 Comment obtenir Obfu-VBA ?

ToolOscope vous propose une licence Shareware :

  • Vous souhaitez essayer Obfu-VBA : Enregistrez-vous et téléchargez gratuitement le logiciel en version complète. Vous bénéficiez d'une licence d'évaluation.
  • "A quoi bon ?" : Détruisez vos copies du logiciel et les sous-produits générés par lui.
  • "Ce logiciel n'est pas mal, mais..." : Demandez une évolution ou une correction en décrivant précisément votre besoin.
  • "Ca marche et je vais continuer à m'en servir ou à me servir des sous-produits" : Envoyez un e-mail de remerciements à son créateur.

Pour tout cela, rendez-vous à l'Espace Utilisateurs.

Ne modifiez pas ce logiciel, ne le diffusez pas : ToolOscope s'en charge.

© ToolOscope SASU 2010-2015. © Arnaud De Rette 2016-2018. Tous droits réservés.