Condividi tramite


CTRL+ALT+CANC

Quale titolo migliore per iniziare un’avventura sul BLOG… smile_regular

Mi chiamo Mario Raccagni. Lavoro da 15 anni al Supporto Tecnico. In questi anni ho attraversato un po' tutte le specialità del supporto, partendo dal supporto a DOS e Windows Per Workgroup 3.11, via Fox Pro e Access sono giunto a VB6 e ora al Platform SDK. Attualmente quindi (potenzialmente) mi occupo di tutte quelle funzionalità a basso livello del sistema operativo che si possono controllare e realizzare con il Platform SDK. In particolare mi sono specializzato in sicurezza, Servizi Windows, Terminal Services API, Crypto API, WMI, LDAP, scripting in generale e troubleshooting di problematiche complesse.

Storicamente, è sempre stato (quasi) impossibile inviare la sequenza fatidica CTRL+ALT+CANC per simulare il logon al sistema.

Questo perchè per motivi di sicurezza, il sistema operativo, in particolare Winlogon, all’avvio registra quella sequenza come una sua HotKey privata, e quindi nessun altro può registrarla o bypassarla, a meno di non installare nel sistema un driver di tastiera, che intercetti e rediriga la sequenza ad un altro programma o che permetta di iniettare nel driver di tastiera di livello superiore questa informazione, in modo da simulare la sequenza.

Fino a Windows XP, Winlogon gestiva il tutto insieme alla GINA (Graphical Identification aNd Authorization). A partire da Windows Vista, il logon al sistema è gestito dai Credential Provider, che sono oggetti COM che permettono di estendere le funzionalità del logon di Windows e customizzare quindi l’esperienza di logon tramite l’utilizzo di metodi alternativi, vedi lettori di impronte digitali, della retina oculare, tramite generatori di numeri casuali (RSA Token), ecc.

Le modifiche alla sicurezza di Vista e Windows 7, legate all’adozione di UAC e UIPI, hanno richiesto quindi anche la possibilità per chi realizza applicazioni che forniscono Accessibilità per i disabili, di poter automatizzare l’invio di quelle sequenze di tasti, che prima era difficile gestire. Anche il fatto che sia cambiata la gestione delle “Sessioni” utente, ha richiesto per chi realizza applicazioni di controllo remoto la possibilità di inviare via software la sequenza di Logon.

Per Windows Vista, era possibile realizzare questo, ricorrendo alla SasLib, una libreria fornita su richiesta da Microsoft Corporation direttamente. Quella libreria altro non faceva che implementare l’API SendSAS. Con Windows 7 la funzione è stata documentata nell’SDK: SendSAS.

Andremo ora ad analizzare bene la documentazione, in quanto ci sono un paio di cose di cui bisogna obbligatoriamente tenere conto.

Per poter inviare con successo la sequenza di controllo CTRL+ALT+CANC, l’applicazione che chiamerà SendSAS, deve girare come servizio Windows o avere l’attributo uiAccess del manifest impostato a True. Quest’ultimo identifica la applicazioni di Accessibilità.

Se gira come servizio, deve essere in esecuzione come Local System o come uno degli user attualmente loggati nel sistema.

Per le applicazioni di Accessibilità, che hanno uiAccess impostato a True nel manifest, ci sono altri due obblighi:
- l’applicazione deve essere firmata digitalmente usando Authenticode
- l’applicazione deve risiedere in una delle locazioni di sistema protette, tipo “\Programmi\” o “\Windows\System32\”.

ma la cosa più importante è che la policy “Disable or enable software Secure Attention Sequence” sia abilitata. Per abilitarla, si usa gpedit.msc e si naviga fino a “Computer Configuration | Administrative Templates | Windows Components | Windows Logon Options | Disable or enable software Secure Attention Sequence”.

La policy può avere i seguenti valori: None, Services, Ease of Access apps, Both. Quindi, Nessuna applicazione, i Servizi di Windows, le applicazioni di Accessibilità, Entrambi (Servizi e applicazioni di Accessibilità)

A seconda del valore impostato nella policy, la funzione SendSAS funzionerà o meno, come definito in questa tabella.

  Service UIA System UIA User
Undefined N Y N
None N N N
Services Y N N
Ease of Access apps N Y Y
Both Y Y Y
       

La prossima volta vedremo come realizzare passo passo una applicazione di esempio seguendo le regole di Accessibilità che dimostri come inviare la sequenza di sicurezza CTRL+ALT+CANC.

Se volete sperimentare un po' da soli, il codice VB.Net necessario è incollato qui:

 Imports System.Runtime.InteropServices 
Public Class Form1 
    Public Declare Sub SendSAS Lib "SAS.DLL" (ByVal fAsUser As Boolean)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
        SendSAS(True) 
    End Sub 
End Class

Alla prossima!

Mario Raccagni
Senior Support Engineer
Platform Development Support Team

Comments

  • Anonymous
    September 20, 2009
    Perché uno dovrebbe simulare (anzi, applicare) la sequenza SAS ? In quali casi ciò potrebbe rendersi necessario, o conveniente?

  • Anonymous
    September 20, 2009
    Ciao Diego!! I motivi principali li ho elencati sopra, e cioè per inviare CTRL+ALT+CANC da programmi per disabili e nei programmi che fanno gestione del desktop remoto (tipo VNC; invece di installare un driver di tastiera, da un servizio possono facilmente mandare la SAS). Hai presente il gestore delle Virtual Machine, che ha in alto sulla barra il pulsante per inviare la SAS.. quello è un altro caso ancora.. Un programma per disabili, potrebbe visualizzare sul desktop di winlogon un pulsantone enorme così invece di usare tre pulsanti per attivare la sequenza basterebbe usare il mouse.. Gli scenari non sono moltissimi, ma sono importanti, perchè prima si usavano i peggiori trucchi (tipo andare a pescare l'handle della dialog visualizzata dalla GINA e iniettarle la sequenza di tasti direttamente) e adesso c'è una semplice API.. Mi è capitato di gestire un paio di richieste del genere e il feedback di chi ha potuto usare l'API è stato grandioso, quindi mi sembrava utile far conoscere la cosa.. Poi nei prossimi post publicherò un altro esempio che usando anche le WTS API permette di sapere quando la sessione viene lockata e in quel caso di mandare la SAS ogni tot secondi, così che l'utente loggato non debba fare altro che inserire la pasword.. Ciao! -mario