• Vous avez aimé ?
    Partagez ;-)

Après avoir passé des jours, des semaines ou des mois à développer votre application Excel et son code VBA, vous n’avez pas forcément envie que n’importe qui puisse y accéder pour s’en servir à d’autres fins

Le mot de passe VBA

La première étape consiste à ajouter un mot de passe au projet VBA pour interdire l’accès au code VBA.

 

Pour cela, faites un clic droit sur le projet :

 

propriétés-projet-vba

 

Et rendez-vous sur le second onglet :

 

mot-de-passe-vba-projet

Oui mais …

Cette protection est suffisante pour empêcher un utilisateur lambda d’accéder au code mais insuffisante pour un utilisateur averti (sachant qu’il existe des solutions pour accéder au code VBA malgré la protection par mot de passe).

La solution : l’obfuscation

C’est quoi ça ?

 

Cela consiste à rendre votre code illisible (en retirant notamment les commentaires et l’indentation, et en remplaçant les noms des variables, procédures et fonctions par des chaînes de texte aléatoires).

 

Le code reste toujours fonctionnel malgré l’obfuscation mais il devient incompréhensible pour l’utilisateur.

 

Il sera donc extrêmement difficile au petit malin qui s’est amusé à contourner la protection par mot de passe de faire quelque chose avec le code obfusqué ;-)

A quoi ça ressemble un code obfusqué ?

Voici un exemple de code AVANT obfuscation :

Function ARGUMENT_FONCTION(cellule As Range, position As Integer)
 
    formule = cellule.FormulaLocal
 
    'Formule sans la première fonction
    formule_b = Split(formule, "(")
    formule_b(0) = ""
    formule = Join(formule_b, "(")
    formule = Mid(formule, 2, Len(formule) - 2)
 
    'Split des arguments
    compteur = 0
    Do
        compteur = compteur + 1
        formule_b = Split(formule, ";")
        recommencer = False
        For i = 0 To UBound(formule_b)
            If UBound(Split(formule_b(i), "(")) <> UBound(Split(formule_b(i), ")")) Then
                formule_b(i) = formule_b(i) & ";;"
                formule = Join(formule_b, ";")
                formule = Replace(formule, ";;;", "XLP")
                recommencer = True
                Exit For
            End If
        Next
    Loop While recommencer And compteur < 10000
 
    If compteur < 10000 Then
        ARGUMENT_FONCTION = Replace(formule_b(position - 1), "XLP", ";")
    Else
        ARGUMENT_FONCTION = "Erreur formule"
    End If
 
End Function

 

Et ce même code APRES obfuscation :

Function q20e9f5d6ff43dd9ff6d42d4d073302c9(k3948312e2cb23220eb0ce9cef4dacef8 As Range, d4757fe07fd492a8be0ea6a760d683d6e As Integer)
r88097393809906ba0bb28972af25b3ec = k3948312e2cb23220eb0ce9cef4dacef8.FormulaLocal
h22c29cbe36ad4bd86f0f4157c09cbb14 = Split(r88097393809906ba0bb28972af25b3ec, "(")
h22c29cbe36ad4bd86f0f4157c09cbb14(0) = ""
r88097393809906ba0bb28972af25b3ec = Join(h22c29cbe36ad4bd86f0f4157c09cbb14, "(")
r88097393809906ba0bb28972af25b3ec = Mid(r88097393809906ba0bb28972af25b3ec, 2, Len(r88097393809906ba0bb28972af25b3ec) - 2)
z5ea24539bda2f6ac946f1f9f04dfd358 = 0
Do
z5ea24539bda2f6ac946f1f9f04dfd358 = z5ea24539bda2f6ac946f1f9f04dfd358 + 1
h22c29cbe36ad4bd86f0f4157c09cbb14 = Split(r88097393809906ba0bb28972af25b3ec, ";")
l2ed6c668db434126a7587ac3626666d6 = False
For i865c0c0b4ab0e063e5caa3387c1a8741 = 0 To UBound(h22c29cbe36ad4bd86f0f4157c09cbb14)
If UBound(Split(h22c29cbe36ad4bd86f0f4157c09cbb14(i865c0c0b4ab0e063e5caa3387c1a8741), "(")) <> UBound(Split(h22c29cbe36ad4bd86f0f4157c09cbb14(i865c0c0b4ab0e063e5caa3387c1a8741), ")")) Then
h22c29cbe36ad4bd86f0f4157c09cbb14(i865c0c0b4ab0e063e5caa3387c1a8741) = h22c29cbe36ad4bd86f0f4157c09cbb14(i865c0c0b4ab0e063e5caa3387c1a8741) & ";;"
r88097393809906ba0bb28972af25b3ec = Join(h22c29cbe36ad4bd86f0f4157c09cbb14, ";")
r88097393809906ba0bb28972af25b3ec = Replace(r88097393809906ba0bb28972af25b3ec, ";;;", "XLP")
l2ed6c668db434126a7587ac3626666d6 = True
Exit For
End If
Next
Loop While l2ed6c668db434126a7587ac3626666d6 And z5ea24539bda2f6ac946f1f9f04dfd358 < 10000
If z5ea24539bda2f6ac946f1f9f04dfd358 < 10000 Then
q20e9f5d6ff43dd9ff6d42d4d073302c9 = Replace(h22c29cbe36ad4bd86f0f4157c09cbb14(d4757fe07fd492a8be0ea6a760d683d6e - 1), "XLP", ";")
Else
q20e9f5d6ff43dd9ff6d42d4d073302c9 = "Erreur formule"
End If
End Function

 

Maintenant, imaginez cela sur un code VBA de centaines ou de milliers de lignes … C’est très efficace pour protéger un code !

 

A titre informatif, sachez qu’il serait encore possible de pousser plus loin l’obfuscation, par exemple, en remplaçant les chiffres par des constantes, en cryptant les textes, etc.

Ok, mais comment obfusquer un code VBA ?

Pour gagner un temps précieux, j’ai créé un outil en ligne qui permet de le faire automatiquement.

 

Cet outil gratuit est disponible ici : obfusquer un code VBA

 

Il vous suffira ensuite de remplacer le code VBA de votre fichier par le code obfusqué.

 

Attention : veillez à toujours conserver une copie de votre fichier avec le code original, vous en aurez besoin pour modifier votre code !