Protéger un code VBA grâce à l'obfuscation

Bonjour à tous,

Comme le savent déjà les utilisateurs avertis, la protection du code VBA par mot de passe n'est pas une solution sûre.

En revanche, une solution plutôt efficace pour protéger un code VBA contre la copie ou la modification est l'obfuscation (qui consiste à rendre le code illisible).

En voici un exemple :

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

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

Obfusquer un code VBA automatiquement

Pour le projet XLSync, j'avais créé un outil spécifique au code de ce projet pour l'obfusquer automatiquement ...

Et, bonne nouvelle, aujourd'hui j'en ai créé une nouvelle version utilisable par tout le monde

Cet outil gratuit est disponible dans les astuces VBA du site ou depuis ce lien : protéger son code VBA

J'espère que vous apprécierez et qu'il vous sera utile

Merci de me signaler à la suite de ce post si vous rencontrez des problèmes d'obfuscation avec cet outil ...

Merci Sébastien pour l'astuce

bonjour

Merci Sebastien pour cet utilitaire....je crois que je vais l'utilisé très prochainement sur un projet en cours

j'ai déjà réussit a faire pour un code présent sur un seul module....

prochain essai avec avec un code qui fait appel a des fonctions/sub présents dans d'autres modules

Fréd

Bonjour à tous,

J'ai apporté quelques modifications au script pour gérer quelques cas supplémentaires.

Si vous recherchez cet outil à l'occasion, sachez que vous pouvez le retrouver grâce au lien "Utilitaires" en bas de chaque page du site (idem pour l'outil d'anonymisation des données)

Cordialement,

Bonjour à tous,

Suite au message de "piratman38" qui m'a signalé un cas qui n'était pas correctement géré (les apostrophes dans un texte entre ""), j'ai décidé de faire une mise à jour complète de l'outil en réécrivant presque totalement le script d'obfuscation.

https://www.excel-pratique.com/fr/astuces_vba/proteger-code-vba

Nouveau : les noms de variables, procédures et fonctions peuvent maintenant être entrés en vrac dans la zone de texte (séparés au choix par un saut de ligne, un espace ou une virgule). Seuls les noms avec des caractères dans la plage [A-Za-z0-9_] sont désormais acceptés (donc pas d'accents).

N'hésitez pas à me signaler si vous découvrez un éventuel bug avec cette nouvelle version de l'outil

Cordialement,

Bonjour. J'utilise un obfuscateur VBA sur votre site web. C'est un outil très utile. Je vous remercie. Pouvez-vous me dire comment lui faire comprendre les variables non-latines (pas en anglais) ? J'ai beaucoup de variables russes dans mon code et le programme ne les accepte pas (ne les obscurcit pas). Je vous remercie d'avance.

Bonjour,

As-tu listé tes variables dans le second champ ?

Car seules les variables listées dans ce champ sont remplacées.

Cordialement,

Oui, j'ai énuméré toutes les variables dans le deuxième champ. Mais seules les variables en anglais sont remplacées par un obfuscateur, tandis qu'en cyrillique (russe) elles ne sont pas acceptées pour une raison quelconque.

Voici un exemple des variables que j'écris dans le deuxième champ :

op

kk

gg

ff

dd

j

i

a

один

два

три

четыре

пять

Les cinq dernières variables en russe ne sont pas perçues par le programme...

Voici un exemple de code que je veux obscurcir.

Sub test()
       test="1"
       ff="2"
       dd="3"

      один="4"
      два="5"
      три="6"

End sub

Je précise comme variables dans le deuxième champ :

test
ff
dd
один
два
три

Voici le résultat de l'obfuscation :

Sub b3bd7bd04dc7053b51134bab51154501f()
b3bd7bd04dc7053b51134bab51154501f="1"
bbb9b7c11c1fc7ad2da25f47e7ae145f9="2"
b23eb27eec6189081ab49385a2c3cb159="3"
один="4"
два="5"
три="6"
End sub

les trois dernières variables russes n'ont pas été traduites par le programme...

Ca devrait maintenant fonctionner

Merci beaucoup ! !! Vous êtes un homme bon !

Bonjour, je voulais juste vous demander une dernière chose.

J'ai une fonction (Microsoft Word):

Loop Until Asc(Selection.Text) <> 32 Or Selection.Text = "%"

Si, dans le deuxième champ pour les variables, on inclut la variable "Text", alors dans cette fonction, le mot "Text" est également remplacé. Bien que "Selection.Text" soient des mots réservés VBA intégrés. Peut-on l'ajouter dans les exceptions ? Ou je le fais de manière incorrecte? Certes, je peux remplacer dans le code toutes les variables "Text" par exemple sur "Text1", mais à l'avenir il n'y aura pas d'erreur à cause de tels cas ? Je veux dire parce que la fonction "Selection.Text" est remplacée, bien que je pense qu'elle ne devrait pas...

Bonjour,

Il faut éviter de nommer tes variables/fonctions "Text" car l'outil ne peut pas faire la différence et va tout remplacer.

Cordialement,

Petite nouveauté : l'outil retire maintenant aussi les lignes de débogage commençant par Debug.Print

Rechercher des sujets similaires à "proteger code vba obfuscation"