Comment cacher les arguments passés en ligne de commande d'une application Windows?

Le
SC
Je cherche à cacher les paramètres passés en ligne de commande d'une
application programmée en C++/Qt. Cette application étant multi-plateforme,
j'ai pu tester que c'est facilement faisable sous Linux (en remplacant les
paramètres argv du main par des espaces vides) mais sous Windows ils
apparaissent toujours (je les observe avec prcView).

Quelqu'un a-t-il une solution pour faire cela?

D'avance merci,

Stéphane
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
kanze
Le #724106
"SC" news:
Je cherche à cacher les paramètres passés en ligne de commande d'une
application programmée en C++/Qt. Cette application étant
multi-plateforme, j'ai pu tester que c'est facilement faisable sous
Linux (en remplacant les paramètres argv du main par des espaces
vides) mais sous Windows ils apparaissent toujours (je les observe
avec prcView).


Cacher de qui, et qu'est-ce que tu entends par « cacher » ?

Que ce soit Linux, Unix, ou Windows, les chaînes désignées par argv[i]
peuvent être écrites ; la norme l'exige, d'ailleurs, au moins que je me
trompe. Du coup, si tu fais quelque chose du genre :

for ( int i = 0 ; i < argc ; ++ i ) {
memset( argv[ i ], 0, strlen( argv[ i ] ) ) ;
}

tu les as effacés là. À l'autre extrême, le programme a été invoqué
quelque part ; les paramètres d'invocation y sont forcement, et tu n'y
peux rien à partir du programme. À titre d'exemple, si tu a invoqué le
programme depuis une ligne de commande, les paramètres apparaîtront
toujours sur l'écran ; si tu l'as invoqué depuis un script ou un .BAT,
les paramètres s'y trouvent. Typiquement, ces endroits sont plus
facilement accessible aux autres que l'image binaire de ton programme.

Entre ces deux extrèmes, le système ou la bibliothèque C++ a pu aussi en
faire ces copies. Rien ne dit que argv[] soit le seul endroit dans
l'image de ton programme où ils existent, par exemple. C'est le seul
endroit sous les Unix classique. En revanche, la ligne de commande,
telle quelle (non découpée en paramètres), se trouvait en bas de la
mémoire sous MS-DOS. Sans parler du système : certains Unix, au moins
dans certaines configurations, enregistres tous les appels à exec dans
un fichier (très utile un cas d'intrusion) ; tu serais peut-être aussi
intéressé par le contenu du répertoire /proc (au moins sous Solaris,
mais je crois que c'est pareil sur d'autres Unix).

Enfin, il y a la question de ce que les utilitaires du système peuvent
afficher. Au moins sous Solaris, aujourd'hui, ps -f semblerait lire la
copie dans /proc, et il montre les paramètres tels qu'ils ont été passé
au processus, indépendamment des modifications que j'ai pu y faire par
la suite. D'après mes souvenirs, des Unix plus anciens les lisaient dans
l'image du processus, et l'effacement comme ci-dessus était efficace
pour les cacher de ps. Je ne sais pas ce qu'il en est de Linux, mais le
fait que tu ne vois pas les paramètre par un méthode ne veut pas dire
qu'ils ne soient pas accessible.

Tout ça pour dire que ce n'est pas parce qu'un programme donné ne les a
pas montré sous Linux que tu les as effectivement cachés.

Même dans les anciens Unix, où on pouvait masquer les paramètres,
c'était une règle de sécurité de ne jamais y passer des informations qui
doivent être cachées -- même si le système ne sauve rien, il y a une
fenêtre de visibilité entre le moment que le système a construit l'image
et que le programme s'execute réelement, et il y a toujours le programme
qui a invoqué ton programme, les caractères sur l'écran...

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Publicité
Poster une réponse
Anonyme