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

Pour écrire et partager des tutoriels et des astuces (Excel, Calc et Google Sheets uniquement)
Avatar du membre
Sébastien
Administrateur
Administrateur
Messages : 2'090
Appréciations reçues : 221
Inscrit le : 4 décembre 2004
Version d'Excel : 2016 FR
Version de Sheets : FR
Contact :
Téléchargements : Mes applications

Message par Sébastien » 5 octobre 2015, 22:19

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éer une nouvelle version utilisable par tout le monde :D

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 :wink:

Merci de me signaler à la suite de ce post si vous rencontrez des problèmes d'obfuscation avec cet outil ...
1 membre du forum aime ce message.
Sébastien
Avatar du membre
mahdiest
Membre habitué
Membre habitué
Messages : 96
Inscrit le : 22 décembre 2015
Version d'Excel : 2016 FR

Message par mahdiest » 27 décembre 2015, 11:57

Merci Sébastien pour l'astuce ;)
Cordialement,

Mahdiest.


“The best way to find yourself is to lose yourself in the service of others.” Mahatma GHANDI
Avatar du membre
fred2406
Membre impliqué
Membre impliqué
Messages : 1'969
Appréciations reçues : 34
Inscrit le : 13 mai 2014
Version d'Excel : 2007-201364bits-2011MAC

Message par fred2406 » 20 février 2016, 12:19

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
Je ne réponds pas aux M.P. non sollicités.
Fred
Avatar du membre
Sébastien
Administrateur
Administrateur
Messages : 2'090
Appréciations reçues : 221
Inscrit le : 4 décembre 2004
Version d'Excel : 2016 FR
Version de Sheets : FR
Contact :
Téléchargements : Mes applications

Message par Sébastien » 18 novembre 2019, 23:27

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,
Sébastien
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message