IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Surveiller tous les processus lancés par un processus


Sujet :

Windows

  1. #1
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut Surveiller tous les processus lancés par un processus


    Je voudrais, à partir d'un processus que je lance moi même, récupérer tous les processus que ce dernier lancerai et ainsi de suite. Par exemple :
    toto.exe
    -> tata.exe
    ----> explorer.exe
    -> titi.exe

    (chaque flèche signifie que le processus lance un autre).
    Je veux donc avoir la liste toto, tata, explorer, titi, quelque soit l'ordre ça je ne m'en soucie pas.

    Est-ce possible ? et si oui, comment ?

  2. #2
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonsoir,
    Je ne sais pas si une API existe pour réaliser ce genre de chose.
    Néanmoins si je devais réaliser ce que tu demande ma première idée serait de listée tous les processus et de récuperer pour chacun d'entre eux une structure PROCESSENTRY32.
    Dans cette structure ce retrouve le PID du processus ainsi que le PPID (Parent Process ID).

    Une fois que tu as le PID et le PPID de chaque processus, le reste n'est plus qu'un tris.
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    On ne peut pas intercepter la création d'un nouveau process ?

  4. #4
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    'soir,
    Si bien entendu un hook est possible (je pensais que tu voulais l'information à un moment donné et pas directement lors de la création du processus excuse moi ).
    Néanmoins il existe différent hook possible (et beaucoup de documentation à ce sujet), tu pourrais détaillé ce dont tu as besoins? (si tu souhaites connaitre toutes les créations de processus, ou uniquement les processus enfant à un processus donné)

    EDIT://
    Tu peux en effet réaliser un hook de la SSDT (qui fonctionne au niveau du kernel) et qui interceptera tout les appels à l'API que tu souhaites ou bien faire un hook de l'IAT (fonctionne en userland) qui interceptera tous les appels à de l'api de ton choix pour un processus donné.

    Si on prend l'exemple de l'API CreateFile, le hook de la SSDT te préviendra à chaque appel de cet API (peut importe quel processus l'a appelé) alors que le hook de l'IAT te permettra d'agir à chaque fois que notepad fait appel à cette API.
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Bon, il semblerai que je puisse à peut près reconstituer un arbre à partir de la liste de process (c'est fou comme wininit.exe lance des choses).

    En fait, mon programme en lance un autre (toto.exe) qui a son tour lance plein d'autres programmes. Ce que je veux savoir c'est à quel moment toto.exe a fini de s'exécuter mais tout ce qu'il a lui même lancé par la suite (il peut s'arreter avant un de ses enfants par exemples).
    Donc pour celà j'aurai bien aimé pouvoir, à partir de mon toto.exe, intercepter tous les lancements de programmes faits par ce dernier avant d'avoir une liste exhaustive des processus enfants en cours d'exécution et savoir quand tout l'arbre s'est arrété.

    Autre petite chose juste pour la curiosité, quand je construit mon arbre à partir des processus, explorer.exe a pour parent un processus qui ne semble pas faire partie de l'énumération faite par Process32Next ... est-ce normal ? pareil pour conime.exe, winlogon.exe, etc ...

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    On dirait que ça le fait quand le processus parent n'est plus en cours d'exécution ...
    Mais ça a l'air chaud les hook (surtout que je suis en C# moi )

  7. #7
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    'jour,
    J'ai edité mon poste (je ne sais pas si tu as eu le temps de voir ou pas).

    Citation Envoyé par smyley Voir le message
    Donc pour celà j'aurai bien aimé pouvoir, à partir de mon toto.exe, intercepter tous les lancements de programmes faits par ce dernier
    Si tu as accès à la source de toto.exe (et que tu peux la modifier), c'est au niveau de la source que tu devrais effectuer cette opération.
    Néanmoins partant du principe que tu n'as pas la source, c'est bien un hook de l'IAT qu'il est utile de mettre en place. (cf plus bas)

    Citation Envoyé par smyley Voir le message
    Autre petite chose juste pour la curiosité, quand je construit mon arbre à partir des processus, explorer.exe a pour parent un processus qui ne semble pas faire partie de l'énumération faite par Process32Next ... est-ce normal ? pareil pour conime.exe, winlogon.exe, etc ...
    En réalité winlogon.exe a pour parent csrss.exe qui à lui même comme parent smss.exe qui a comme parent system et qui a comme parent System IDLE Process.
    Si l'API utilisé ne liste pas tous les processus actifs c'est du au fait qu'elle ne liste que les processus actif en ring3 (userland) (je suppose, à vérifier).

    Principe de l'IAT:
    (oui je voulais te refilé un lien vers le Wikipédia mais la page ne semble pas exister)

    Lorsqu'une application utilise une fonction situé dans un autre fichier, elle doit importer l'adresse de cette fonction et cela ce fait généralement via une table d'importation.
    Donc quand tu fais appel à une API Windows, l'exécutable effectue un call sur l'IAT à l'endroit ou inscrit l'adresse de l'API et de là un jmp est effectué jusque l'API en question.
    Le but du jeu est de modifier l'IAT pour donner l'adresse d'une fonction que tu aura préalablement crée au lieu de celle de l'API.
    Donc, quand app.exe fera appel à l'API, c'est ta fonction qui sera executé.
    Mais pour que l'API soit quand même executé, il faut qu'à la fin de ta fonction il y ai un jmp vers l'API.

    tutorial + demo + source (En)

    Voilà, j'espère pas trop avoir répondu à coté
    Amicalement, sloshy
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    J'avais pas encore eu le courage de regarder depuis hier
    ça m'a l'air vraiment monstrueux. Faudrait que j'essaye un jour où je serai vraiment tranquille (un jour pas comme aujourd'hui quoi, où je viens de déménager )
    En tout cas je te dit déjà merci, même si je suis pas encore arrivé à ma solution

Discussions similaires

  1. Tuer un processus lancé par un script
    Par lyly_lt dans le forum Tcl/Tk
    Réponses: 2
    Dernier message: 28/12/2010, 11h46
  2. Envoyer un signal à un processus lancé par un user différent
    Par gedeon555 dans le forum Administration système
    Réponses: 1
    Dernier message: 17/03/2009, 23h38
  3. Processus lancé par la commande system
    Par vinzzzz dans le forum POSIX
    Réponses: 3
    Dernier message: 11/12/2007, 20h33
  4. Handle (ID) d'un processus lancé par access
    Par fredoh dans le forum VBA Access
    Réponses: 4
    Dernier message: 30/05/2007, 08h29
  5. Tuer un processus lance par system sous perl
    Par gedeon555 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo