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

 Delphi Discussion :

Capture d'écran Winsta0


Sujet :

Delphi

  1. #1
    Membre du Club

    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 41
    Points
    41
    Par défaut Capture d'écran Winsta0
    Bonjour tout le monde,

    Je suis en train de développer un Outil d'assistance/surveillance à distance, alors je me retrouve face à quelques petits soucis :

    - Capture d'écran lorsque la session n'est pas encore ouverte et pouvoir "login" (ça me renvoie une capture d'image noir ).
    - Capture d’écran et lors l'UAC prompte (ça me renvoie une capture d'image noire).

    * Je précise que mon application s'installe comme Windows Service "LocalSystem" , type $00000120 (SERVICE_WIN32_SHARE_PROCESS or SERVICE_INTERACTIVE_PROCESS).

    J'ai essayé avec ce code mais toujours rien :

    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
     
    function ImpersonateDesktop(var
     hDesktopWnd:HWND):Boolean;
    var
      hSaveWinsta,_hWinSta:HWINSTA;
      _hSaveDesktop,_hDesktop:HDESK;
    begin
      Result := True;
     
      _hWinSta := OpenWindowStation('WinSta0', false,  WINSTA_ALL_ACCESS);
     
      if _hWinSta = 0 then Result := False;
       hSaveWinsta := GetProcessWindowStation;
     
      if not SetProcessWindowStation(_hWinSta) then Result := False;
     
      _hDesktop := OpenInputDesktop(0,False,MAXIMUM_ALLOWED);
     
      _hSaveDesktop := GetThreadDesktop(GetCurrentThreadId());
      if _hDesktop = 0 then
      begin
        SetProcessWindowStation(hSaveWinSta);
        CloseWindowStation(_hWinSta);
        Result := False;
      end;
      if not SetThreadDesktop(_hDesktop) then Result := False;
      SwitchDesktop(_hDesktop);
      hDesktopWnd := GetDesktopWindow();
    end;
    - Merci de nous donner un petit coup de pouce !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Hs32-Idir ,faut voir l'antivirus ou le thème de ton système.

    Regarde cette procédure on ne sait jamais :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    procedure ScreenShot(x: Integer;
       y: Integer; //(x, y) = Left-top coordinate
      Width: Integer;
       Height: Integer; //(Width-Height) = Bottom-Right coordinate
      bm: TBitMap); //Destination
    var
      dc: HDC;
       lpPal: PLOGPALETTE;
    begin
      {test width and height}
      if ((Width = 0) or
        (Height = 0)) then
        Exit;
       bm.Width  := Width;
       bm.Height := Height;
       {get the screen dc}
      dc := GetDc(0);
       if (dc = 0) then
        Exit;
       {do we have a palette device?}
      if (GetDeviceCaps(dc, RASTERCAPS) and
        RC_PALETTE = RC_PALETTE) then
      begin
        {allocate memory for a logical palette}
        GetMem(lpPal,
           SizeOf(TLOGPALETTE) +
         (255 * SizeOf(TPALETTEENTRY)));
         {zero it out to be neat}
        FillChar(lpPal^,
           SizeOf(TLOGPALETTE) +
         (255 * SizeOf(TPALETTEENTRY)),
           #0);
         {fill in the palette version}
        lpPal^.palVersion := $300;
         {grab the system palette entries}
        lpPal^.palNumEntries :=
           GetSystemPaletteEntries(dc,
           0,
           256,
           lpPal^.palPalEntry);
         if (lpPal^.PalNumEntries <> 0) then
          {create the palette}
          bm.Palette := CreatePalette(lpPal^);
         FreeMem(lpPal, SizeOf(TLOGPALETTE) +
         (255 * SizeOf(TPALETTEENTRY)));
       end;
       {copy from the screen to the bitmap}
      BitBlt(bm.Canvas.Handle,
         0,
         0,
         Width,
         Height,
         Dc,
         x,
         y,
         SRCCOPY);
       {release the screen dc}
      ReleaseDc(0, dc);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ScreenShot(0,0,Screen.Width, Screen.Height, Image1.Picture.Bitmap);
     
    end;
    @+,

    cincap

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    @Hs32-Idir

    Un service (session 0) n'a par défaut pas de window station ni de input desktop. Le système pourrait en créer en fonction des API utilisées (certaines fonctions User32 ou GDI) mais le bureau sera noir puisque rien n'est dessiné dessus. Ce n'est évidemment pas le bureau visible à l'écran.

    Ce code pouvait éventuellement fonctionner sous XP puisque les services partageaient la session 0 avec le premier utilisateur. Il était bien sûr incompatible avec FUS (fast user switching).

    Pour faire en partie ce que tu souhaites comme tu le souhaites, il y aura à mon sens plusieurs étapes :

    • surveiller l'activité des sessions (CONNECT/DISCONNECT, LOGON/LOGOFF).
      Malheureusement les problèmes surviennent instantanément. TService sous Delphi n'a pas été mis à jour depuis 20 ans (sic) et n'implémente pas le HandlerEx nécessaire à cette surveillance. Il faudra donc l'implémenter toi-même ;
    • une fois cette surveillance active, il faudra récupérer le jeton de l'utilisateur associé à cette session et se faire passer pour lui (impersonate) afin d'injecter un premier exécutable qui permettra de récupérer le Input Desktop de cette session (qui n'est soit dit en passant pas forcément la session console) ;
    • enfin, tu devras lancer un deuxième exécutable en ciblant cette fois-ci spécifiquement le Input Desktop (Winlogon, Default, Screensaver) détecté précédemment.


    Mais même avec ça, tu ne détecteras pas le consent screen (UAC).


    La seule approche possible pour détecter et le logon screen et le consent screen est par Credential Library, une bibliothèque chargée automatiquement par le système sur les écrans sécurisés normalement utilisée pour les authentifications alternatives (smartcard et autres).

    Joli boulot en perspective

  4. #4
    Membre du Club

    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 41
    Points
    41
    Par défaut
    merci pour votre réponse, mais ça ne fonctionne pas comme ça sous Windows Services.

    Citation Envoyé par cincap Voir le message
    @ Hs32-Idir ,faut voir l'antivirus ou le thème de ton système.

    Regarde cette procédure on ne sait jamais :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    procedure ScreenShot(x: Integer;
       y: Integer; //(x, y) = Left-top coordinate
      Width: Integer;
       Height: Integer; //(Width-Height) = Bottom-Right coordinate
      bm: TBitMap); //Destination
    var
      dc: HDC;
       lpPal: PLOGPALETTE;
    begin
      {test width and height}
      if ((Width = 0) or
        (Height = 0)) then
        Exit;
       bm.Width  := Width;
       bm.Height := Height;
       {get the screen dc}
      dc := GetDc(0);
       if (dc = 0) then
        Exit;
       {do we have a palette device?}
      if (GetDeviceCaps(dc, RASTERCAPS) and
        RC_PALETTE = RC_PALETTE) then
      begin
        {allocate memory for a logical palette}
        GetMem(lpPal,
           SizeOf(TLOGPALETTE) +
         (255 * SizeOf(TPALETTEENTRY)));
         {zero it out to be neat}
        FillChar(lpPal^,
           SizeOf(TLOGPALETTE) +
         (255 * SizeOf(TPALETTEENTRY)),
           #0);
         {fill in the palette version}
        lpPal^.palVersion := $300;
         {grab the system palette entries}
        lpPal^.palNumEntries :=
           GetSystemPaletteEntries(dc,
           0,
           256,
           lpPal^.palPalEntry);
         if (lpPal^.PalNumEntries <> 0) then
          {create the palette}
          bm.Palette := CreatePalette(lpPal^);
         FreeMem(lpPal, SizeOf(TLOGPALETTE) +
         (255 * SizeOf(TPALETTEENTRY)));
       end;
       {copy from the screen to the bitmap}
      BitBlt(bm.Canvas.Handle,
         0,
         0,
         Width,
         Height,
         Dc,
         x,
         y,
         SRCCOPY);
       {release the screen dc}
      ReleaseDc(0, dc);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ScreenShot(0,0,Screen.Width, Screen.Height, Image1.Picture.Bitmap);
     
    end;
    @+,

    cincap

  5. #5
    Membre du Club

    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 41
    Points
    41
    Par défaut
    Merci l'ami, c'est ce que je pensais moi aussi, c'était juste javais crus qu'il pourrait y avoir quelques Hacks.


    Citation Envoyé par Andnotor Voir le message
    @Hs32-Idir

    Un service (session 0) n'a par défaut pas de window station ni de input desktop. Le système pourrait en créer en fonction des API utilisées (certaines fonctions User32 ou GDI) mais le bureau sera noir puisque rien n'est dessiné dessus. Ce n'est évidemment pas le bureau visible à l'écran.

    Ce code pouvait éventuellement fonctionner sous XP puisque les services partageaient la session 0 avec le premier utilisateur. Il était bien sûr incompatible avec FUS (fast user switching).

    Pour faire en partie ce que tu souhaites comme tu le souhaites, il y aura à mon sens plusieurs étapes :

    • surveiller l'activité des sessions (CONNECT/DISCONNECT, LOGON/LOGOFF).
      Malheureusement les problèmes surviennent instantanément. TService sous Delphi n'a pas été mis à jour depuis 20 ans (sic) et n'implémente pas le HandlerEx nécessaire à cette surveillance. Il faudra donc l'implémenter toi-même ;
    • une fois cette surveillance active, il faudra récupérer le jeton de l'utilisateur associé à cette session et se faire passer pour lui (impersonate) afin d'injecter un premier exécutable qui permettra de récupérer le Input Desktop de cette session (qui n'est soit dit en passant pas forcément la session console) ;
    • enfin, tu devras lancer un deuxième exécutable en ciblant cette fois-ci spécifiquement le Input Desktop (Winlogon, Default, Screensaver) détecté précédemment.


    Mais même avec ça, tu ne détecteras pas le consent screen (UAC).


    La seule approche possible pour détecter et le logon screen et le consent screen est par Credential Library, une bibliothèque chargée automatiquement par le système sur les écrans sécurisés normalement utilisée pour les authentifications alternatives (smartcard et autres).

    Joli boulot en perspective

Discussions similaires

  1. Empécher les captures d'écran
    Par alix the webmasta dans le forum Autres langages pour le Web
    Réponses: 10
    Dernier message: 17/02/2006, 00h24
  2. [VB.NET] Capture d'écran
    Par tiboooo dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/01/2006, 18h23
  3. Pb capture d'écran et msgbox
    Par PRACH dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 03/01/2006, 09h38
  4. Capture d'écran
    Par lildan dans le forum MFC
    Réponses: 1
    Dernier message: 14/11/2005, 14h26
  5. Réponses: 10
    Dernier message: 10/10/2003, 14h25

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