Lorsqu'un processus est exécuté dans un environnement dont les droits ne sont pas maîtrisés, le gestionnaire de tâches de Windows permet de créer un "vidage" de la mémoire. Un "dump" mémoire ainsi obtenu peut permettre de voir des données stockées dans des variables chaînes.

 

Dans le cas général cela n'a pas d'importance. En effet lorsqu'une application est sensible, elle est exécutée dans un environnement sécurisé. L'application est donc lancée avec un utilisateur dont les droits sont adaptés, restreints à ses stricts besoins. Il n'est pas administrateur avec toutes les possibilités système de débogage !

 

Si une application peut être utilisée par un administrateur, et que l'on veut masquer de la mémoire certaines données, il est donc nécessaire d'avoir recours à du code pour obfusquer les chaînes.

 

Par exemple avec ce code :

gsMotDePasse est une chaîne = "VraiMotDePasseConnexion"

Trace(gsMotDePasse)

un dump mémoire permettrait de trouver "VraiMotDePasseConnexion" dans la mémoire du processus compilé.

L'affectation peut donc avantageusement être remplacée par une concaténation de plusieurs variables :

gsV1, gsV2, gsV3, gsV4 sont des chaînes
gsV4= "faux"; gsV4="nnexion"; gsV1="autrefaux"; gsV1="Vra"
gsV3="tjsfaux"; gsV3="ePasseCo"; gsV2="etencorefaux"; gsV2="iMotD";
Trace( gsV1+gsV2+gsV3+gsV4)

De cette manière seuls des fragments de chaînes seront visibles en mémoire.

 

On peut aller plus loin et ajouter un encodage :

  • dans un code qu'on ne laisse pas dans l'application, on recherche la valeur de chaînes encodées en base64 :

    Trace(Encode("ePasseCo", encodeBASE64SansRC)) // valeur de gsV3
    Trace(Encode("nnexion", encodeBASE64SansRC)) // valeur de gsV4


  • dans la construction de la chaîne on utilise non plus la valeur mais le décodage :

    gsV4= "faux"; gsV4="bm5leGlvbg=="; gsV1="autrefaux"; gsV1="Vra";
    gsV3="tjsfaux"; gsV3="ZVBhc3NlQ28="; gsV2="etencorefaux"; gsV2="iMotD";
    Trace( gsV1+gsV2+Decode(gsV3,encodeBASE64SansRC)+Decode(gsV4,encodeBASE64SansRC))

Puis rien n'empêche d'ajouter un chiffrement basé sur la représentation hexadécimale d'un buffer :

  • on calcul un buffer avec par exemple ce code (qu'on ne laisse pas dans l'application) :

    bufMessage est un Buffer = "iMotD"
    bufStock est un Buffer = HashChaîne(HA_MD5_128, "désignation")
    bufQuantité est un Buffer = CrypteStandard(bufMessage, bufStock, crypteAES128)
    Trace(BufferVersHexa(bufQuantité,SansRegroupement))

  • puis on utilise une procédure qui va faire l'inverse pour reconstruire la chaîne :

    Trace( gsV1+pStock()+Decode(gsV3,encodeBASE64SansRC)+Decode(gsV4,encodeBASE64SansRC))

    PROCEDURE INTERNE pStock() : chaîne
    bufStock est un Buffer
    bufQuantité est un Buffer
    bufStock = HashChaîne(HA_MD5_128, "désignation")
    bufQuantité = HexaVersBuffer("2EF2585F614C3CE4685157A26CAC5E013FD66438B809C2CF4FF4E372219CD63C",SansRegroupement )
    sRéponse est une chaîne ANSI = DécrypteStandard(bufQuantité, bufStock, crypteAES128)
    RENVOYER sRéponse

     

Tout cela s'applique jusqu'en version 27 incluse.

 

A partir de la version 28, un nouvel attribut d'extension fait son apparition pour les variables chaînes de caractères. C'est la nouveauté 114 "nouveau type chaîne indétectable".

Tout les solutions ci-dessus peuvent être remplacées par :

 

sMotDePasseTableClient est une chaîne <indétectable>
sMotDePasseTableClient = "VraiMotDePasseConnexion"

HPasse(Client, sMotDePasseTableClient)

ou :

HPasse(Client, "VraiMotDePasseConnexion"<indétectable>)

ou :

Client.MotDePasse("VraiMotDePasseConnexion"<indétectable>)

 

 

---------------------------------

 

Cas particulier des applications Android : un paramètrage spécifique existe dans l'assistant de génération d'une application pour masquer les données du code source. Il est accessible par le bouton "Configuration avancée" proposée à l'étape "Configuration" de l'assistant de génération des APK/AAB Android :

 

 

----- Mise à jour 6/1/2023 -----

L'attribut d'extension a été détaillé dans la page des chaînes de caractères dans l'aide en ligne.

 

< Retour

5 commentaires

José
26/10/2022 - 17:16 - Répondre
Du coup, avec windev mobile, l'attribut ne fonctionne pas?

Guillaume BAYLE
28/11/2022 - 12:49 - Répondre
Bonjour, en effet l'attribut n'est pas proposé sous Android puisque le chiffrement est possible avec la coche "Crypter les chaînes". Ajout suggéré aux développeurs pour faciliter le partage du code entre plateformes. Bons développements !

Anthony
27/10/2022 - 12:02 - Répondre
Du coup, hardcoder les données sensibles dans les apps c'est toujours validé en 2022 ?

Charly CanDo
02/03/2023 - 11:39 - Répondre
Bonjour, Il me semble qu'une précision doit être indiquer dans la phrase : A partir de la version 28, un nouvel attribut d'extension fait son apparition pour les variables. <== On peut se laisser penser que cela inclut les buffers, alors que non. Il s'agit uniquement des variables de types chaines ?? Merci

Guillaume BAYLE
06/03/2023 - 12:04 - Répondre
Bonjour, précision ajoutée, merci ! Bons développements.

Publier un commentaire : 
Votre adresse email ne sera pas publiée