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 :

Comment un processus User peut obtenir un HANDLE sur un processus en compte SYSTEM avec le droit SUNCHRONIZE ?


Sujet :

Windows

  1. #1
    Membre du Club Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 51
    Points
    51
    Par défaut Comment un processus User peut obtenir un HANDLE sur un processus en compte SYSTEM avec le droit SUNCHRONIZE ?
    Salut tout le monde,
    J'ai deux processus P1(tourne en compte SYSTEM) et P2 ( en compte User) , P2 lance un thread thC qui est supposé contrôler l'état de lancement de P1 par un WaitForSingleObject sur le handle obtenu par OpenProcess, voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UINT __cdecl thC( LPVOID pParameters )
    {
    
    DWORD processID=GetPidByName("P1.exe"); 
    HANDLE hP1=OpenProcess( SYNCHRONIZE  ,FALSE, processID );
    DWORD ErrorCode=GetLastError();
    WaitForSingleObject(hP1,INFINITE);		
    // traitement ...
    return 0;
    }
    La fonction OpenProcess échoue avec un code d'erreur
    ErrorCode=5
    ce qui donne sur msdn
    ERROR_ACCESS_DENIED
    5 (0x5) Access is denied.
    Alors je sais pas comment faire pour obtenir ce HANDLE avec le droit d'accès SYNCHRONIZE ..

    Remarque:
    BOOL WINAPI CreateProcessAsUser(
    __in_opt HANDLE hToken,
    __in_opt LPCTSTR lpApplicationName,
    __inout_opt LPTSTR lpCommandLine,
    __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
    __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
    __in BOOL bInheritHandles,
    __in DWORD dwCreationFlags,
    __in_opt LPVOID lpEnvironment,
    __in_opt LPCTSTR lpCurrentDirectory,
    __in LPSTARTUPINFO lpStartupInfo,
    __out LPPROCESS_INFORMATION lpProcessInformation
    );
    Dans le code de P1 qui va lancer P2, je passe NULL au paramètre lpProcessAttributes, voici l'appel de fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CreateProcessAsUser(TokenHandle,
    ProcessFullPath,
    NULL,
    NULL,
    NULL,
    FALSE,//The process cannot inherit handles across sessions
    CREATE_NEW_CONSOLE,
    NULL,
    NULL,
    &si,
    &pi) ;
    Donc si je me trompe pas le process P2 prend le default security attributes, mais apparement ce default ne lui donne pas un droit daccès pour exécuter OpenProcess avec un droit SYNCHRONIZE

    Merci pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si c'est toi qui programmes P1, tu peux essayer de rajouter les droits en question au démarrage: GetCurrentProcess() (+ DuplicateHandle() si nécessaire) + GetKernelObjectSecurity() + Fonctions pour modifier l'ACL...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Si c'est toi qui programmes P1, tu peux essayer de rajouter les droits en question au démarrage: GetCurrentProcess() (+ DuplicateHandle() si nécessaire) + GetKernelObjectSecurity() + Fonctions pour modifier l'ACL...
    Merci pour l'info.
    Mais si on se limite à récupérer le HANDLE du processus courant P1, le dupliquer .. ça reste un peu flou pour moi comment faire passer ce HANDLE de P1 vers P2 surtout que CreateProcessAsUser() ne contient pas un param en entrée qui pourra transporter le HANDLE dupliqué ..

    L'exemple suivant de msdn fait passer un HANDLE dupliqué d'un process vers un thread mais je vois pas dans mon cas comment faire surtout que c'est inter compte ( P1 tourne en compte SYSTEM et P2 en compte User )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <windows.h>
    
    DWORD CALLBACK ThreadProc(PVOID pvParam);
    
    int main()
    {
        HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
        HANDLE hMutexDup, hThread;
        DWORD dwThreadId;
    
        DuplicateHandle(GetCurrentProcess(), 
                        hMutex, 
                        GetCurrentProcess(),
                        &hMutexDup, 
                        0,
                        FALSE,
                        DUPLICATE_SAME_ACCESS);
    
        hThread = CreateThread(NULL, 0, ThreadProc, 
            (LPVOID) hMutexDup, 0, &dwThreadId);
    
        // Perform work here, closing the handle when finished with the
        // mutex. If the reference count is zero, the object is destroyed.
        CloseHandle(hMutex);
    
        // Wait for the worker thread to terminate and clean up.
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
        return 0;
    }
    
    DWORD CALLBACK ThreadProc(PVOID pvParam)
    {
        HANDLE hMutex = (HANDLE)pvParam;
    
        // Perform work here, closing the handle when finished with the
        // mutex. If the reference count is zero, the object is destroyed.
        CloseHandle(hMutex);
        return 0;
    }
    Mais apparement ce n'est pas aussi simple que ça

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce n'est pas de ça que je parle.

    Il n'est pas question ici de transmettre le moindre handle, seulement de donner aux autres utilisateurs le droit d'ouvrir un handle avec l'accès SYNCHRONIZE sur le processus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre du Club Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ce n'est pas de ça que je parle.

    Il n'est pas question ici de transmettre le moindre handle, seulement de donner aux autres utilisateurs le droit d'ouvrir un handle avec l'accès SYNCHRONIZE sur le processus.
    Donc reste à voir la deuxième partie
    GetKernelObjectSecurity() + Fonctions pour modifier l'ACL...
    Comment m'en servir , est ce que vous pouvez me faciliter un peu la tâche car je coïnce là >_<

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu m'en demandes un peu trop, je ne suis jamais allé aussi loin...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre du Club Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu m'en demandes un peu trop, je ne suis jamais allé aussi loin...
    Ok merci en tout cas

Discussions similaires

  1. comment obtenir le handle d'une fenètre
    Par DarkPoster14 dans le forum Visual C++
    Réponses: 2
    Dernier message: 30/04/2008, 18h49
  2. Réponses: 2
    Dernier message: 18/03/2008, 13h58
  3. Réponses: 6
    Dernier message: 22/01/2008, 19h40
  4. Comment obtenir les Handles des boutons systèmes de Windows ?
    Par Desraux dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 22/12/2004, 22h20

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