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"
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)) Trace(Encode("nnexion", encodeBASE64SansRC))
- 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.
|