Définir des données sensibles & spécifiques au code, au moment de la compilation

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 553
Enregistré le : jeu. 10 juin 2010 09:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Définir des données sensibles & spécifiques au code, au moment de la compilation

#1

Message par ZDS » mer. 05 déc. 2018 18:04

Bonjour à tous ! (depuis le temps, désolé)

Je viens à vous pour vous présenter un exemple de procédure qui peut être améliorée et j'ai envie de dire qui DOIT être améliorée, c'est pour ça que j'aimerai vos avis, critiques et alternatives possibles !


L'OBJECTIF :

Enregistrer une valeur dans une variable au moment de la compilation, et pas avant ! Ca peut concerner des IDs de connexion, un mot de passe, un token, etc... qu'on ne souhaite pas mettre en dur dans le code, mais passer comme une donnée volatile qui serait figée ensuite dans l'EXE.


LA METHODE DE BASE :

Mettre la valeur sensible dans un fichier INI, et utiliser FileInstall pour incorporer le fichier INI dans l'EXE... Problème, le fichier INI doit être extrait pour que la donnée puisse être récupérée, et donc le mot de passe est lisible par d'autres moyens.
► Afficher le texteMéthode de base
Cette méthode est inacceptable selon moi !


MA METHODE EN UTILISANT AU3WRAPPER:

Le Wrapper utilise une commande Run_Before pour génèrer un AU3 à inclure dans le code d'origine, à partir d'un template ; lors de cette phase il demande la valeur secrète à incorporer. Puis la compilation s'effectue, et efface ensuite le fichier sensible avec une commande Run_After :
  • Fichier "Script.au3", contient le code d'exemple qui utilise la valeur secrète
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Run_Before=""%autoitdir%\AutoIt3.exe" ".\Compile.au3" "START""
    #AutoIt3Wrapper_Run_After=""%autoitdir%\AutoIt3.exe" ".\Compile.au3" "END""
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include ".\Data.au3"
    MsgBox(0, "", "Valeur secrète : '"&$__SECRET_VALUE&"'")
  • Fichier "Template.au3", fichier de référence destiné à être dupliqué après modification des champs entre {{ }}
    #include-once
    Global Const $__SECRET_VALUE = "{{secret_value}}"
  • Fichier "Compile.au3" :, script faisant la préparation à la compilation et la finalisation après compilation
    If $cmdLine[0] = 0 Then
            Local $mode = InputBox("", "Mode ? (START, END, NONE)", "", " M")
            proceed($mode)
    Else
            For $i = 1 To $cmdLine[0]
                    proceed($cmdLine[$i])
            Next
    EndIf

    Exit 0

    Func proceed($mode)
            Local $fileIn = @ScriptDir&"\Template.au3", $fileOut = @ScriptDir&"\Data.au3"
            Switch $mode
                    Case "START"
                            Local $value = InputBox("", "Secret value?", "", " M")
                            Local $fluxIn = FileOpen($fileIn)
                            If $fluxIn = -1  Then
                                    MsgBox(0, "", "Error on input file '"&$fileIn&"'")
                                    Exit 1
                            EndIf
                            Local $fluxOut = FileOpen($fileOut, 8+2)
                            If $fluxOut = -1  Then
                                    MsgBox(0, "", "Error on output file '"&$fileOut&"'")
                                    Exit 1
                            EndIf
                            Local $contentIn = FileRead($fluxIn)
                            Local $contentOut = StringReplace($contentIn, "{{secret_value}}", $value)
                            FileWrite($fluxOut, $contentOut)
                            FileClose($fluxIn)
                            FileClose($fluxOut)
                    Case "END"
                            If FileExists($fileOut) Then
                                    Local $fluxOut = FileOpen($fileOut, 8+2)
                                    If $fluxOut <> -1 Then
                                            FileWrite($fluxOut, "")
                                    EndIf
                                    FileClose($fluxOut)
                                    If FileDelete($fileOut) = 0 Then
                                            MsgBox(0, "", "Cannot delete output file '"&$fileOut&"'")
                                            Exit 1
                                    EndIf
                            EndIf
                    Case "NONE"
                            ; Nothing
                    Case Else
                            MsgBox(0, "", "Unknown mode '"&$mode&"'")
                            Exit 1
            EndSwitch
    EndFunc

Ce genre de méthode ne casse pas trois pattes à un connard, mais au moins ça donne une méthode (même si je la trouve crade personnellement). J'attends donc vos avis, vos critiques, et surtout vos alternatives ! :)

A bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !

Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 360
Enregistré le : mer. 24 oct. 2007 21:42
Localisation : 56000
Status : Hors ligne

Re: Définir des données sensibles & spécifiques au code, au moment de la compilation

#2

Message par jl56 » sam. 08 déc. 2018 12:11

Bonjour à tous,

@ZDS ta procédure tombe a pic je recherchais un moyen de protection pour un code ou je crypte des données sensibles dans un fichier.ini
Mais comme ma clé de cryptage est dans le code lui même , elle est potentiellement lisible en cas de décompilation.

En regardant ton code je constate que c'est également le cas, tu stocks la valeur dans un include qui lors de la compilation est intégré au code global
La valeur sera en dur dans le code et la aussi lisible en cas de décompilation.

J'ai repris ta remarque sur le fichier ini et je te propose ceci:
On stock la valeur dans un fichier ini avant la compilation
Fichier qui est ajouté au code via fileinstal

On test, avant l’extraction du fichier contenant la valeur, si un malin voulais bloquer l'effacement et récupérer en clair la valeur dans le fichier ini

Si le test est ok on extrait le fichier contenant la valeur

une fois lu on efface la valeur et on détruit le fichier.
Avec cette méthode, même en cas de décompilation la valeur n'est pas présente dans le code

je suppose qu'il y a une méthode pour extraire le fichier sans exécuter le code mais ce n'est pas a ma porté donc encore moins a des utilisateurs lambda.

voici mon code d'exemple: ou dans le fichier joint
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=test_code.exe
#AutoIt3Wrapper_UseX64=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

IniWrite(@ScriptDir & "\code_test.ini", "code", "valeur", "test ecriture")
Sleep(100)

If IniRead(@ScriptDir & "\code_test.ini", "code", "valeur", "") = "test ecriture" Then ; on test si on peut ecrire
        FileDelete(@ScriptDir & "\code_test.ini"); ok on efface le fichier
        Sleep(100)
        If FileExists(@ScriptDir & "\code_test.ini") Then ;on test si on peut effacer le fichier
                MsgBox(0, "Erreur", "Vous n'avez pas les droits d'effacement sur ce dossier " & @ScriptDir, 180)
                Exit
        EndIf
Else
        MsgBox(0, "Erreur", "Vous n'avez pas les droits d'écriture sur ce dossier " & @ScriptDir, 180)
        Exit
EndIf

FileInstall("C:\pi\forum\test code\code_avant_compilation\code.ini", @ScriptDir & "\code.ini", 1) ; si tout est ok on extrait le fichier code
Sleep(100)
$code = IniRead(@ScriptDir & "\code.ini", "code", "valeur", ""); lecture du code
IniWrite(@ScriptDir & "\code.ini", "code", "valeur", ""); on ecrase aussitot la valeur dans le fichier code.ini


FileDelete(@ScriptDir & "\code.ini"); on efface aussitot le fichier code.ini

MsgBox(0, "Code", "Valeur =" & $code, 180)

créez un fichier code.ini avec votre valeur voir fichier joint


Placez ce fichier dans le sous dossier "code_avant_compilation\code.ini"

Corrigez les chemins dans le code

JL56


test_code.au3
(1.26 Kio) Téléchargé 4 fois
test_code.au3
(1.26 Kio) Téléchargé 4 fois
code.ini
(27 Octets) Téléchargé 4 fois
code.ini
(27 Octets) Téléchargé 4 fois

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 598
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: Définir des données sensibles & spécifiques au code, au moment de la compilation

#3

Message par walkson » sam. 08 déc. 2018 18:46

Bonjour,
je recherchais un moyen de protection pour un code ou je crypte des données sensibles dans un fichier.ini
Mais comme ma clé de cryptage est dans le code lui même , elle est potentiellement lisible en cas de décompilation.
La solution est peut être de mettre le hachage du mot de passe dans le code. On rentre le MP dans un input et le programme compare le hachage du MP avec celui du code.

Pour mes besoins personnels, j'ai fait des programmes à double usage. Par exemple, une minuterie où quand j’écris x heures x minutes x secondes lance veracrypt et ouvre des volumes. Tout est écrit en dur même les MP mais qui aurait l'idée de décortiquer une minuterie à part un lecteur de ce forum :mrgreen:
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Répondre