domenica 10 luglio 2022

Proteggere la password (in un applicazione desktop)

 Per vedere un esempio in C# di un "virus" che catturi i valori immessi con la tastiera si può visitare questa pagina di Microsoft https://docs.microsoft.com/en-us/archive/blogs/toub/low-level-keyboard-hook-in-c . Usando il codice scritto qui  ,  possiamo verificare che l'applicazione legge ogni carattere digitato ,l'esempio si limita a stampare  con la Console.WriteLine ma un keylogger potrebbe salvare i caratteri digitati permettendo di appropriarsi anche delle password digitate .Modifichiamo la riga 40 dell'esempio così : 

Console.WriteLine("premuto carattere: " + (Keys)vkCode ); 

eseguiamo il programma(anche solo in debug) e digitiamo qualche carattere sulla tastiera :

                                        

  Ho digitato i caratteri "p,a,s,s,w,o,r,d" e premuto il tasto "Stamp" ed il keylogger ha registrato l'attività della tastiera. Proviamo ad utilizzare la tastiera virtuale di windows ottenibile premendo la combinazione di tasti "Ctrl + Win + o" :


ho digitato i caratteri "q,w,e,r,t,y" sulla tastiera virtuale di windows ed il key logger li ha catturati senza problemi , se quindi vogliamo che dati importanti , quali ad esempio una password inserita in un textbox di un applicazione , siano più protetti , possiamo scrivere poche righe di codice per utilizzare una nostra tastiera virtuale con cui scrivere la "password" e passarla all'indirizzo del textbox che normalmente valorizziamo direttamente premendo i tasti sulla tastiera ,indispensabile comunque l'uso di un buon antivirus sul pc. 

 Per trovare l'indirizzo del box ,a cui assegneremo il valore della password digitata con la tastiera virtuale, possiamo utilizzare , ad esempio, WinSpy o WinSpy ++ (la versione attuale di Visual Studio 2022 ha sotto la voce del menu "Strumenti" Spy++)  :

                                                       


usiamo il finder tool (WinSpy) :




nella finestra Handle troviamo l'indirizzo della textbox selezionata.

Creiamo un applicazione dove gestiamo per brevità solo le password numeriche ,questo è solo un esempio , potete modificarlo ed aggiungere i caratteri alfabetici maiuscoli e minuscoli ed i caratteri speciali ,segue il form dell'applicazione, si tratta di un applicazione Windows Forms scritta in C#:


Tastiera virtuale


       
    segue il codice riferito al form soprastante :

     public partial class Form1 : Form
    {
        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
        const int WM_SETTEXT = 0X000C;
        public Form1()
        {  
           InitializeComponent();
        }

        private void SendMessageToTextBox(IntPtr ptr, string testo)
        {
            SendMessage(ptr, WM_SETTEXT, 0, testo);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string memoryAddress = this.textBox1.Text;
            string textBoxPasswordValue = this.textBox2.Text;
            string hex_value = memoryAddress;
            //convert from hex to integer
            int int_value = Convert.ToInt32(hex_value, 16);
                        
            IntPtr p1 = new IntPtr(int_value);
            
            this.SendMessageToTextBox(p1,textBoxPasswordValue);
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            string current=this.textBox2.Text;
            this.textBox2.Text = current + "1";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string current = this.textBox2.Text;
            this.textBox2.Text = current + "2";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            string current = this.textBox2.Text;
            this.textBox2.Text = current + "3";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            string current = this.textBox2.Text;
            this.textBox2.Text = current + "4";
        }

        private void button5_Click(object sender, EventArgs e)
        {
            string current = this.textBox2.Text;
            this.textBox2.Text = current + "5";
        }

        private void button6_Click(object sender, EventArgs e)
        {
            string current = this.textBox2.Text;
            this.textBox2.Text = current + "6";
        }

        private void button7_Click(object sender, EventArgs e)
        {
            string current = this.textBox2.Text;
            this.textBox2.Text = current + "7";
        }

        private void button8_Click(object sender, EventArgs e)
        {
            string current = this.textBox2.Text;
            this.textBox2.Text = current + "8";
        }

        private void button9_Click(object sender, EventArgs e)
        {
            string current = this.textBox2.Text;
            this.textBox2.Text = current + "9";
        }

        private void button10_Click(object sender, EventArgs e)
        {
            string current = this.textBox2.Text;
            this.textBox2.Text = current + "0";
        }

    }

catturiamo l'indirizzo del textbox come sopra , nel frattempo ho riavviato l'applicazione "destinataria" e quindi è cambiato l'indirizzo del textbox  :




inseriamo i valori della password e l'indirizzo del textbox nell'applicazione che invia il valore della password al textbox :  



premiamo il bottone "Aggiungi" e troveremo il textbox "destinazione" valorizzato con la nostra password senza passare dalla tastiera ed evitando i possibili keylogger

  


Per scrivere questa brevissima applicazione potete usare Visual Studio 2022 Community . In Visual Studio come tipo di progetto scegliete "App Windows Forms" . 


Crittografia e WCF per passare una password ( od una qualsiasi altra stringa (xml,json, etc.etc.) ) da un applicazione ad un' altra in sicurezza

 Il codice che segue è da considerarsi in alpha e da non utilizzare in un ambiente di produzione , qui potete trovare il  "progetto...