Récupérer le CurrentDir (GetCUrrentDir) d'un autre processus
dodfr
Messages postés51Date d'inscriptionsamedi 20 novembre 2010StatutMembreDernière intervention27 décembre 2014
-
17 déc. 2007 à 16:39
dodfr
Messages postés51Date d'inscriptionsamedi 20 novembre 2010StatutMembreDernière intervention27 décembre 2014
-
18 déc. 2007 à 16:38
Bonjour,
Je cherche à créer une petite routine "restart" permettant de redémarrer un processus avec des paramètres et répertoire de travail identiques au précédent lancement.
Il faut donc que je récupère ces infos, que je tue le process et que je fasse un shellexecute ou un createprocess avec ces mêmes infos.
Il me manque le moyen de récupérer le getCurrentDirectory, quelqu'un sait comment faire ?
J'ai déjà une routine pour récupérer getCommandLineW en faisant une injection dans l'autre processus mais je ne sais pas l'adapter pour getCurrentDirectory et je voudrais en plus que cela fonctionne aussi bien sou NT+ que sous Win9x ce qui n'est pas le cas de la routine actuelle pour effectuter un get CommandLineW dans l'autre processus.
dodfr
Messages postés51Date d'inscriptionsamedi 20 novembre 2010StatutMembreDernière intervention27 décembre 2014 18 déc. 2007 à 09:25
En effet mais l'important est de pouvoir relancer l'appli telle qu'elle a été lancée la fois précédente, donc peut importe si elle en change en cours de route, puisque qu'au "restart" elle le refera certainement.
Sinon j'ai une autre méthode qui consiste à lire une section mémoire de l'autre processus qui contient toutes ces infos (y compris les variables d'environnement), cette section mémoire existe aussi (moins complète) sous Win9x mais avec Vista ou XP SP2 je ne sais pas trop si ça passerait à cause des protections ...
Quand à l'exemple d'injection avec la calculatrice je l'avais trouvé mais je n'ai pas encore eu le temps de bien regarder et j'ai l'impression que c'est du hook d'API ce qui ne me sert pas dans mon cas vu que l'application visée est déjà lancée, ceci dit je peux toujours hooker une API dont je pense qu'elle sera forcément appelée plusieurs fois par secondes par l'application et retirer mon hook dès le premier appel, mais ce n'est pas génial.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 18 déc. 2007 à 12:41
En effet mais l'important est de pouvoir relancer l'appli telle qu'elle
a été lancée la fois précédente, donc peut importe si elle en change en
cours de route, puisque qu'au "restart" elle le refera certainement.
Suppose que l'appli démarre dans c:\Appli. Elle fait un SetCurrentDirectory('..'), elle se retrouve dans c:\.
L'utilisateur demande de la démarrer.
Tu fais un GetCurrentDirectory. Ca te renvoie c:\.
Tu redémarres l'appli dans c:\.
L'appli éssais de faire un SetCurrentDirectory('..');...
En fait tu peux te servir de la partie injection de dll de ma source de
hook. L'injection est possible non seulement au lancement du processus,
mais à n'importe quel moment : il faut juste son PID.
Dans l'initialisation de la dll, tu remplace pas le hook par :
Un GetCurrentDirectory.
La création d'une SharedMemory où tu mets le résultat de GetCurrentDirectory.
Le déclenchement d'un évènement.
Dans le processus chargé de redémarrer l'appli, tu fais l'injection,
attend l'évènement, et dès qu'il a lieu, tu lis la SharedMemory pour
récupérer le dossier courant. Tu récupérer CommandLineW de la même
manière.
Pour ce qui est de la lecture directe en mémoire, tu parles de lire la RTL_USER_PROCESS_PARAMETERS pointé par la PEB ? Sous XP pas de problèmes de lecture avec
ReadProcessMemory (A condition de faire OpenProcess avec les bons
paramètres bien sûr), du moins sur un compte admin. Tu récupère l'adresse de la PEB avec NtQueryInformationProcess ?
<hr size="2" width="100%" />3ème année en ecole d'ingé d'info cherche stage de 4 mois à partir du 01/04/08
dodfr
Messages postés51Date d'inscriptionsamedi 20 novembre 2010StatutMembreDernière intervention27 décembre 2014 18 déc. 2007 à 16:38
La méthode c'est un simple ReadProcessMemory du bloc mémoire de 0x00020000 à 0x00020FAF tu lis ensuite depuis 0x00020498 jusqu'à rencontrer un #0 pour récupérer le startup directory, en fait c'est ça que je veux, pas vraiment le CurrentDir qui en effet pourrait être ultérieurement modifié, je me suis mal exprimé, ce bloc mémoire contient toutes les infos de démarrage d'un process sous NT+, sous Win9x le bloc est différent.